[問題] CUDA Grid的Z方向無法大於1?

看板C_and_CPP (C/C++)作者 (SaoAn)時間15年前 (2011/04/21 13:43), 編輯推噓2(2010)
留言12則, 5人參與, 最新討論串1/1
大家好, 我最近寫CUDA遇到一個奇怪問題, 這樣寫會對 dim3 Gridsize(10,10) dim3 Blocksize(32,16) runKernel<<<Gridsize, Blocksize>>>(data); static __global__ void runKernel(float *data) { int x = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; int y = __mul24(blockIdx.y,blockDim.y) + threadIdx.y; int mx = __mul24(gridDim.x,blockDim.x); int my = __mul24(gridDim.y,blockDim.y); for(int z=0; z<10; z++) data[__mul24(__mul24(z,my)+y,mx)+x]=something; } 但是如果寫成 dim3 Gridsize(10,10,10) dim3 Blocksize(32,16,1) runKernel<<<Gridsize, Blocksize>>>(data); static __global__ void runKernel(float *data) { int x = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; int y = __mul24(blockIdx.y,blockDim.y) + threadIdx.y; int z = __mul24(blockIdx.z,blockDim.z) + threadIdx.z; int mx = __mul24(gridDim.x,blockDim.x); int my = __mul24(gridDim.y,blockDim.y); data[__mul24(__mul24(z,my)+y,mx)+x]=something; } 這樣就會錯....請問有經驗的大大這是怎麼回事? 我只是把z項也寫進去kernel裡,這樣怎麼會錯呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 24.161.183.254

04/21 16:22, , 1F
我也遇到一樣的事情 最後是改把 z 放進Blocksize 裡
04/21 16:22, 1F

04/21 16:23, , 2F
但是最多也只能到 64 另外 block 裡面最多也只能 512 緒
04/21 16:23, 2F

04/21 20:24, , 3F
參照ProgrammingGuide3.2 p8(2.2),p126(B.16),p154(G.1)
04/21 20:24, 3F

04/21 20:24, , 4F
都有提到Grid Size最多只能2維啊
04/21 20:24, 4F

04/21 20:30, , 5F
寫CUDA程式時GPU的限制很重要 所以p154,p155(G.1)部分請
04/21 20:30, 5F

04/21 20:31, , 6F
務必弄清楚 此資料在http://tinyurl.com/2vc6pt也能查到
04/21 20:31, 6F

04/21 21:42, , 7F
感謝各位的解釋 不過這樣z維好像有點寫心酸的感覺
04/21 21:42, 7F

04/21 21:58, , 8F
可以不要寫呀@@
04/21 21:58, 8F

04/21 21:59, , 9F
dim3 gridSize(100,100);
04/21 21:59, 9F

04/21 23:11, , 10F
剛剛想到可以硬把z項寫到y項裡, 不過有點蠢的感覺就是
04/21 23:11, 10F

07/09 14:46, , 11F
因為cuda2.0以下版本的無法支援3D grid
07/09 14:46, 11F

07/09 14:46, , 12F
2.0以上的就可以了
07/09 14:46, 12F
文章代碼(AID): #1DhyFzEq (C_and_CPP)
文章代碼(AID): #1DhyFzEq (C_and_CPP)