Tengo una pregunta acerca de la sincronización de CUDA. Particularmente, necesito alguna aclaración sobre la sincronización en las declaraciones if. Quiero decir, si pongo un __syncthreads() bajo el alcance de una instrucción if golpeada por una fracción de los hilos dentro del bloque, ¿qué ocurre? Pensé que algunos hilos permanecerán "para siempre" esperando los otros hilos que no alcanzarán el punto de sincronización. Por lo tanto, he escrito y ejecutado un código de ejemplo para inspeccionar:CUDA: __syncthreads() dentro de sentencias if
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
index += gridSize;
}
}
Sorprendentemente, he observado que la salida era bastante "normal" (64 elementos, BLOCKSIZE 32):
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Así
I modificado ligeramente el código de la siguiente manera:
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
vett[index] = 3;
__syncthreads();
index += gridSize;
}
}
Y la salida fue:
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
Una vez más, estaba equivocado: pensé que los hilos dentro de la declaración if, después de modificar el elemento del vector, permanecerían en estado de espera y nunca saldrían del alcance de if. Entonces ... ¿podría aclarar qué sucedió? ¿Un hilo que se encuentra después de un punto de sincronización desbloquea los hilos que esperan en la barrera? Si necesita reproducir mi situación, utilicé CUDA Toolkit 5.0 RC con SDK 4.2. Muchas gracias por adelantado.
Proporcione las marcas (respuestas aceptadas) a las personas que responden a su pregunta. – Yakk