¿syncthreads () sincroniza todos los subprocesos en la cuadrícula?


...¿o solo los hilos en la urdimbre o bloque actual?

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

__shared__  float srdMem[128];

¿Declararán este espacio una sola vez (por bloque)?

Todos ellos obviamente operan de forma asíncrona, por lo que si el Hilo 23 en el Bloque 22 es el primer hilo en llegar a esta línea, y luego el Hilo 69 en el Bloque 22 es el último en llegar a esta línea, el Hilo 69 sabrá que ya ha sido declarado?

 28
Author: Wuschelbeutel Kartoffelhuhn, 2013-03-06

3 answers

El comando __syncthreads() es una barrera de sincronización de nivel de bloque . Eso significa que es seguro para ser utilizado cuando todos los hilos en un bloque alcanzan la barrera. También es posible usar __syncthreads() en código condicional, pero solo cuando todos los subprocesos evalúan de manera idéntica dicho código, de lo contrario, es probable que la ejecución se cuelgue o produzca efectos secundarios no deseados[4].

Ejemplo de uso __syncthreads(): (source)

__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 actualmente hay no llamada a la API nativa. Una forma de sincronizar subprocesos en un nivel de cuadrícula es usar llamadas consecutivas al núcleo ya que en ese punto todos los subprocesos terminan y comienzan de nuevo desde el mismo punto. También se llama comúnmente sincronización de CPU o sincronización implícita. Por lo tanto, todos están sincronizados.

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

Sincronización de CPU

Con respecto a la segunda pregunta. , declara la cantidad de memoria compartida especificado por bloque. Tenga en cuenta que la cantidad de memoria compartida disponible se mide por SM. Así que uno debe ser muy cuidadosocómo se usa la memoria compartida junto con la configuración de lanzamiento .

 42
Author: KiaMorot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:35

__syncthreads() espera hasta que todos los subprocesos dentro del mismo bloque hayan alcanzado el comando y todos los subprocesos dentro de un warp - eso significa que todos los urdimbres que pertenecen a un threadblock deben alcanzar la instrucción.

Si declara memoria compartida en un núcleo, la matriz solo será visible para un bloque de hilos. Así que cada bloque tendrá su propio bloque de memoria compartida.

 11
Author: hubs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 07:14:35

Estoy de acuerdo con todas las respuestas aquí, pero creo que nos falta un punto importante aquí w.r.t primera pregunta. No estoy respondiendo a la segunda respuesta, ya que se respondió perfectamente en las respuestas anteriores.

La ejecución en GPU ocurre en unidades de urdimbre. Una urdimbre es un grupo de 32 hilos y en una instancia de tiempo cada hilo de una urdimbre en particular ejecutar la misma instrucción. Si asigna 128 subprocesos en un bloque, sus (128/32 = ) 4 deformaciones para una GPU.

Ahora la pregunta es "Si todos los hilos están ejecutando la misma instrucción, entonces ¿por qué se necesita sincronización?". La respuesta es que necesitamos sincronizar las deformaciones que pertenecen a la MISMO bloquear. __syncthreads no sincroniza hilos en un warp, ya están sincronizados. Sincroniza las deformaciones que pertenecen al mismo bloque.

Es por eso que la respuesta a su pregunta es: _ _ syncthreads no sincroniza todos los subprocesos en una cuadrícula, sino los subprocesos que pertenecen a un bloque a medida que cada bloque se ejecuta independiente.

Si desea sincronizar una cuadrícula, divida su núcleo (K) en dos núcleos(K1 y K2) y llame a ambos. Se sincronizarán (K2 se ejecutará después de que K1 termine).

 5
Author: Adarsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 20:23:14