…o simplemente de los hilos en la corriente de la urdimbre o de bloque?

También, cuando los hilos de un determinado bloque encuentro (en el núcleo) la siguiente línea

__shared__  float srdMem[128];

van a declarar este espacio una vez (por bloque)?

Todos ellos, obviamente, funcionan de forma asíncrona por lo que si el Hilo 23 en el Bloque 22 es el primer hilo para llegar a esta línea y, a continuación, Hilo 69 en el Bloque 22 es el último en llegar a esta línea, el Hilo 69 se sabe que ya ha sido declarado?

  • La memoria compartida es asignado para cada bloque por separado, pero no simultáneamente. Cuando el SM en realidad comienza a ejecutar el bloque de memoria compartida, es asignado en ese momento.

3 Comentarios

  1. 52

    La __syncthreads() comando es una a nivel de bloque la sincronización de la barrera. Eso significa que es seguro para ser utilizado cuando todos los hilos en un bloque de llegar a la barrera. También es posible utilizar __syncthreads() condicional en el código, pero sólo cuando todos los hilos evaluar de forma idéntica que el codigo de lo contrario, la ejecución es probable que se bloquea o se producen efectos secundarios no deseados [4].

    Ejemplo del uso de __syncthreads(): (fuente)

    __global__ void globFunction(int *arr, int N) 
    {
        __shared__ int local_array[THREADS_PER_BLOCK];  //local block memory cache           
        int idx = blockIdx.x* blockDim.x+ threadIdx.x;
    
        //...calculate results
        local_array[threadIdx.x] = results;
    
        //synchronize the local threads writing to the local memory cache
        __syncthreads();
    
        //read the results of another thread in the current thread
        int val = local_array[(threadIdx.x + 1) % THREADS_PER_BLOCK];
    
        //write back the value to global memory
        arr[idx] = val;        
    }

    Para sincronizar todos los hilos en una cuadrícula en la actualidad hay no nativa llamada a la API. Una forma de sincronizar los hilos en un nivel de la red es el uso de consecutivos kernel llamadas como en ese momento todos los hilos final y empezar de nuevo desde el mismo punto. También es comúnmente llamado CPU de sincronización o Implícita de la sincronización. Por lo tanto todos están sincronizados.

    Ejemplo del uso de esta técnica (fuente):

    ¿__Syncthreads() sincronizar todos los hilos en la red?

    Con respecto a la segundo pregunta. , se declara la cantidad de memoria compartida especificada por bloque. Tomar en cuenta que la cantidad de memoria compartida se mide por SM. Así que uno debe ser muy cuidado cómo la de memoria compartida se utiliza junto con el configuración de lanzamiento de.

    • «Advertencia, este es el código peligroso» por @harrism en la misma fuente que se refieren a
    • La respuesta es editado. ???
    • La sincronización de todos los hilos en una cuadrícula es problemático, ya que no hay garantías de que van a ser ejecutados simultáneamente. La GPU puede ejecutar sólo una limitada cantidad de hilos y si el kernel de ejecución requiere demasiada hilo de bloques, algunos de ellos deben estar terminados antes de que los nuevos bloques se puede iniciar. El límite depende del modelo de GPU así como en el entorno de software (el usuario puede ejecutar múltiples GPU programas al mismo tiempo), por lo que los núcleos tratando de sincronizar todos los subprocesos de bloques son muy peligrosos. El camino correcto es terminar un kernel y empezar otra.
    • Yo no he tenido la oportunidad de jugar con hardware más reciente de Fermi. ¿Sabe usted si el paralelismo dinámico, ejecutar varios núcleos simultáneamente introducido desde Kepler, pueden resolver, de alguna manera, este problema?
    • D. P. permite ejecutar los núcleos en el interior de los núcleos, y esperar para su ejecución. Mientras que puede ser utilizado para implementar más complejo synchr. los escenarios, no puede evitar el problema fundamental – Gpu de ejecutar la tarea basada en el paralelismo y nunca se sabe si los dos tareas (kernel casos) se ejecutará en paralelo o secuencial. La mirada en eprints.cs.vt.edu/archive/00001087/01/… si usted realmente necesita inter-bloque de sincronización
    • Sí, soy consciente de este papel. En el momento en que yo lo he utilizado para mi investigación, pero creo que no me daría bastante rendimiento. De todos modos yo sólo quería ver si el DP se dirigía a esto o fue diferente en función de la GPU.
    • __syncthreads() es una barrera primitivos, que puede sincronizar la lectura después de la escritura de la memoria de las condiciones de carrera dentro de un bloque. __syncthreads() después de la escritura y antes de la lectura asegurar que todos los hilos (de todas las deformaciones) en la rosca del bloque de esperar la escritura para completar antes de la lectura.

  2. 12

    __syncthreads() espera hasta que todos los hilos dentro de la misma cuadra ha alcanzado el comando y todo dentro de los hilos de urdimbre – eso significa que todas las deformaciones que pertenece a una threadblock debe llegar a la declaración.

    Si se declara la memoria compartida en un núcleo, la matriz sólo será visible para una threadblock. Por lo que cada bloque tiene su propio bloque de memoria compartida.

    • Esto en realidad no es cierto. El shared matriz se asigna para cada bloque en el dispositivo.
    • Creo que entendido algo. No hay nada de malo con esta respuesta. La memoria compartida es el ámbito de bloque, que es lo que la respuesta, dice, que es lo que el común de dice. Dónde está la contradicción?
    • Sí, he leído mal.
    • Upvoted. Aunque este post las respuestas a ambas preguntas, he seleccionado los otros, porque responde a la primera pregunta de forma muy clara y con mucho esfuerzo.
  3. 9

    Estoy de acuerdo con todas las respuestas aquí, pero creo que estamos perdiendo un punto importante aquí w.r.t primera pregunta. No estoy respondiendo a la segunda respuesta, ya que ha respondido a la perfección en las respuestas anteriores.

    Ejecución en GPU que sucede en las unidades de la deformación. Una urdimbre es un grupo de 32 hilos y en una instancia de tiempo de cada hilo de una determinada deformación de ejecutar la misma instrucción. Si se le asigna a 128 hilos en un bloque de su (128/32 = ) 4 urdimbres de una GPU.

    Ahora la pregunta es: «Si todos los hilos se ejecutan la misma instrucción entonces, ¿por qué la sincronización es necesaria?». La respuesta es que tenemos que sincronizar las urdimbres que pertenecen a la MISMO bloque. __syncthreads no sincroniza los hilos en la urdimbre, que ya están sincronizados. Sincroniza las deformaciones que pertenecen a un mismo bloque.

    Que es la razón por la respuesta a su pregunta es : __syncthreads no sincroniza todos los hilos en una cuadrícula, pero los hilos pertenecientes a una cuadra como cada bloque se ejecuta de forma independiente.

    Si desea sincronizar una cuadrícula, a continuación, dividir el núcleo (K) en dos núcleos(K1 y K2) y llamar a ambos. Ellos serán sincronizados (K2 será ejecutado después de K1 acabados).

Dejar respuesta

Please enter your comment!
Please enter your name here