jueves, 6 de febrero de 2014

Jugando con dimensiones en grids y bloques

En CUDA es posible tener estructura de 1D, 2D y 3D para bloques y grids de threads, lo cual se explicó en Identificación de un thread. Para aclarar la forma de utilizar estas posibles configuraciones se resume en lo siguiente, usando configuraciones 1D y 2D para bloques y 1D, 2D y 3D para threads:


  1. Array 1D de bloques donde cada bloque tiene un array 1D de threads.

  2. UniqueBlockIndex = blockIdx.x;
    UniqueThreadIndex = blockIdx.x * blockDim.x + threadIdx.x;
       
  3. Array 1D de bloques donde cada bloque tiene un array 2D de threads.

    UniqueBlockIndex = blockIdx.x;
    UniqueThreadIndex = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
                          
  4. Array 1D de bloques donde cada bloque tiene un array 3D de threads.

    UniqueBlockIndex = blockIdx.x;
    UniqueThreadIndex = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
                          
  5. Array 2D de bloques donde cada bloque tiene un array 1D de threads.

    UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x;
    UniqueThreadIndex = UniqueBlockIndex * blockDim.x + threadIdx.x;
                                                             
  6. Array 2D de bloques donde cada bloque tiene un array 2D de threads.

    UniqueBlockIndex = blockIdx.y * gridDim.x + blockIdx.x;
    UniqueThreadIndex = UniqueBlockIndex * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;
                          
  7. Array 2D de bloques donde cada bloque tiene un array 3D de threads.

    UniqueBlockIndex = blockIdx.y * gridDim.z * + blockIdx.x;
    UniqueThreadIndex = UniqueBlockIndex * blockDim.z * blockDim.y * blockDim.x + threadIdx.z * blockDim.y * blockDim.z + threadIdz.y * blockDim.x + threadIdx.x;

No hay comentarios:

Publicar un comentario