我試圖從給定的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