2013-01-31 153 views
2

我是新來的cuda;我有一個2D圖像(寬度,高度)與3個通道(顏色)。 我想要的是午餐有3D塊2D網格這樣Cuda索引圖3D塊,2D網格

kernel_2D_3D<<<dim3(1,m,n), dim3(3,TILEy,TILEz)>>>(float *in, float *out) 

內核我用X的顏色,ÿ寬度和身高ž。我的問題是: 如何計算圖像的行和列:

  1. unsigned int Row =?
  2. unsigned int Col =?

和我用這個功能來計算全球唯一索引

__device__ int getGlobalIdx_2D_3D() 
{ 
    int blockId = blockIdx.x+ blockIdx.y * gridDim.x; 

    int Idx = blockId * (blockDim.x * blockDim.y * blockDim.z) 
       + (threadIdx.z * (blockDim.x * blockDim.y)) 
       + (threadIdx.y * blockDim.x) 
       + threadIdx.x; 

    return Idx; 
} 

回答

1

如果您使用的Y表示寬度和z的高度,則圖像的行和列可以這樣來計算這裏面內核:

unsigned int row = blockIdx.z * blockDim.z + threadIdx.z; 
unsigned int col = blockIdx.y * blockDim.y + threadIdx.y; 

當前通道將等於threadIdx.x

+0

好的我認爲我不能確認這個答案是否正確,因爲經過一些閱讀後我發現我不能在我的筆記本電腦上進行//有1個設備支持CUDA //設備0名稱:GeForce 9200M GS //計算能力:1.1 //最大全局內存大小:536150016 //最大常量內存大小:65536 //每個塊的最大共享內存大小:16384 //最大塊大小:512 x 512 x 64 //最大柵格尺寸:65535 x 65535 x ** 1 ** //經線尺寸:32 – ALMIStack

+0

@ALMIStack ...抱歉誤會。我已經刪除了不正確的假設。 – sgarizvi

+1

so grid.z = 1,我需要((n + TILEz-1)/ TILEz) – ALMIStack