90 likes | 217 Views
Addressing 2-D grids with 3-D blocks Class Discussion Notes. ITCS 4/5010 CUDA Programming, UNC-Charlotte, B. Wilkinson, Jan 28, 2013, 3-DBlocks.ppt. General Approach. Given two-dimensional addressing, row, column Use the general 2-D to 1-D flattening equation: index = col + row * N col
E N D
Addressing 2-D grids with 3-D blocks Class Discussion Notes ITCS 4/5010 CUDA Programming, UNC-Charlotte, B. Wilkinson, Jan 28, 2013, 3-DBlocks.ppt
General Approach Given two-dimensional addressing, row, column Use the general 2-D to 1-D flattening equation: index = col + row * Ncol where Ncol is the total number of columns in a row to get a unique ID. Equation can be used multiple times in 2D/3D grids/blocks to get unique thread ID.
We have already considered 2-D grids and 2-D blocks x Grid y Block blockIdx.y blockIdx.x threadID.y threadID.x Thread
Global thread ID – one approach Applicable when mapping 2-D data array onto grid. Determine number of threads to the chosen thread, row and column: col = blockIdx.x*blockDim.x+threadIdx.x row = blockIdx.y*blockDim.y+threadIdx.y Then use: ThreadID = col + row * N where N = no of columns of threads in grid. N = blockDim.x * gridDim.x Substituting we would get: ThreadID = (blockIdx.x*blockDim.x+threadIdx.x) + (blockIdx.y*blockDim.y+threadIdx.y)* (blockDim.x * gridDim.x) = blockIdx.x*blockDim.x+threadIdx.x+ blockIdx.y*blockDim.y* blockDim.x * gridDim.x + threadIdx.y*blockDim.x *gridDim.x
Global thread ID - Another approach Using the general 2-D to 1-D flattening equation: index = column + row * Ncolumn Block ID within grid: blockID = blockIdx.x + blockIdx.y * gridDim.x Thread ID within block: BlockthreadID = threadIdx.x + threadIdx.y * blockDim.x Then substitute BlockthreadID and blockID into flattening equation again to get threadID
2-D Grids and 3-D blocks Grid Block blockIdx.y blockIdx.x threadID.y threadID.x threadID.z Thread
3D Global thread ID One approach We have global thread ID not considering z direction. Call it threadIDxy Using the general 2-D to 1-D flattening equation: index = col + row * Ncol threadID = threadID.z + threadIDxy * blockDim.z
3D Global thread ID Another approach 2-D Address, (x, y) and block sizes Dx and Dy Unique global thread ID = x + y Dx 3-D Address, (x, y, z) and block sizes Dx, Dy, and Dz. Unique global thread ID = x + y Dx + zDxDy