我试图从给定的CUDA偏移量计算blockIdx.x和blockIdx.y,但我完全被大脑阻塞。这个想法是在可能的情况下从共享内存读取数据,在其他情况下是从全局内存中读取数据从给定的二维偏移量知道CUDA中的块ID
在例如,如果我已经64个元件一维阵列和我配置具有16X1螺纹的内核(总共4个块),每个线程可以使用访问的位置:
int idx = blockDim.x*blockIdx.x + threadIdx.x
,我可以容易从IDX得到一个给定的索引值的blockIdx.x作为
int blockNumber = idx/blockDim.x;
但与8×8元素和4×4的线程的内核配置(2×2块总共)二维场景每个线程使用访问的位置:
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int pitch = blockDim.x * gridDim.x;
int idx = x + y * pitch;
int sharedMemIndex = threadIdx.x+threadIdx.y+BLOCK_DIM_X;
__shared_block[sharedMemIndex] = fromGlobalMemory[idx];
__syncthreads();
// ... some operations
int unknow_index = __shared_block[sharedMemIndex];
if (unknow_index within this block?)
// ... read from shared memory
else
// ... read from global memory
我该如何知道给定idx上的Block ID.x和ID.y?即索引34和35在块(1,1)中的块(0,1)和索引36中。因此,如果块(0,1)中的线程读取索引35的值,该线程将知道该值位于其块中,并将从共享内存中读取该值。索引35值将被存储在块的共享存储器的位置11(0.1)中。
在此先感谢!
我根本不理解这个问题。任何内核中的任何线程都始终具有blockIdx。{xyz}可用。为什么你需要尝试和计算它? – talonmies 2011-06-01 16:17:56
您需要从内存中执行一些加载操作。第一个负载value_index_1 = array [idx],第二个负载value_index_2 = array [value_index]。所以,如果value_index_1在块中,我可以从共享内存加载,否则我需要从全局内存加载。 – pQB 2011-06-01 16:42:15
您仍然不需要为其计算块索引值。您可以比较块中给定线程ID和块大小与全局线程ID和索引的差异。这会告诉你索引是否在块内共享内存的范围内。 – talonmies 2011-06-01 18:12:01