CUDA identifica a cada thread de forma única. Para ello se apoya de ciertas variables incluidas en el driver:
- blockIdx.x, blockIdx.y, blockIdx.z
- Retornan el valor del ID del bloque en el eje x, y o z, respectivamente, del bloque que esté ejecutando el código dado.
- blockDim.x, blockDim.y, blockDim.z
- Retornan el valor de la dimensión del bloque, es decir, el número de threads en un bloque en el eje x, y o z.
- threadIdx.x, threadIdx.y, threadIdx.z
- Retornan el ID del thread en el eje x, y o z que está siendo ejecutado por el GPGPU en un bloque en particular.
De ésta forma, se puede expresar una colección de bloques, y una colección de threads dentro de un bloque, como un array 1D, 2D o 3D, lo cual puede ser de ayuda con información en 2D o 3D.
Ejemplo:
Suponer un grid de 1D (un grid se mapea directamente con una GPGPU), y una arquitectura de bloques de 1D con 4 bloques y cada uno con 8 threads.
Para identificar el ID Global del thread 26:
GlobalThreadID = blockIdx.x * blockDim.x + threadIdx.x
GlobalThreadID = 3 * 8 + 2
GlobalThreadID = 26
No hay comentarios:
Publicar un comentario