[問題] CUDA關於Threads新手問題

作者: qcmi (Alexam)   2014-12-31 22:21:05
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VS2013
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
CUDA
問題(Question):
先附上程式碼:
http://ideone.com/RwJCBZ
給一個input array
並且總共有GridDim*BlockDim個Threads(例子裡面是1*4)
假設
Input[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
^^^^^^^ ^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^
Thread1 Thread2 Thread3 Thread4
希望用Threads分別把各自的Input範圍加總
Output[0]=1+2+3+4 = 6;
Output[1]=5+6+7+8 = 22;
Output[2]=9+10+11+12 = 38;
Output[3]=12+13+14+15 = 54;
但這個程式好像只有在GridDim=1的情況下才會正確
如果GridDim不為1,譬如(2*2)
雖然一樣是有4個Threads,
但是就只有第一個Block的Threads答案會正確,
錯誤Output如下:
Output[0]=6;
Output[1]=22;
Output[2]=14;
Output[3]=30;
想請問是否我__global__ kernel的部分有理解錯誤嗎?
謝謝
作者: PkmX (阿貓)   2013-01-01 01:18:00
原本結果應該就是錯的吧 你的output array根本沒有初始化然後你改用2D grid的時候有考慮到blockIdx.y嗎?若是2D grid和1D block要把他map到一維index 你的idx應該是(blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x +threadIdx.x可是你cudaMalloc出來在device上的output array沒有初始化啊
作者: qcmi (Alexam)   2013-01-01 14:45:00
我是直接參考cuda vecAdd的範例,output array在cudaMalloc完之後好像就直接呼叫Kernel計算了, output沒有cudaMemcpy到device, 請問這樣是錯的嗎? d_output也要用cudaMemcpy?
作者: PkmX (阿貓)   2013-01-01 14:48:00
因為vector add是直接用=給值啊 你用+=原本就要先初始化以你的例子應該是迴圈開始前先清成0就好 或是用cudaMemset至於設計上的問題 你目前的寫法就和你想的一樣不是嗎@@不懂為什麼要把2D的grid扯進來把問題複雜化原來你所謂的2*2是指2*2=4 我以為你是想要用dim3(2,2)...話說應該ndx = idx * steps吧?你現在這樣會加乘順序是錯的

Links booklink

Contact Us: admin [ a t ] ucptt.com