推 LPH66:+= 不是 atomic 平行做的話會有同步問題 05/07 22:37
→ LPH66:你該做的是開 512 個 thread,每個 thread 把 512 個數加起來 05/07 22:38
→ godman362:但是thread和thread之間不能直接溝通啊? 05/07 23:10
→ godman362:所以我應該要用__shared__ int w[512]這樣子嗎? 05/07 23:10
→ godman362:然後把元素copy到w[512]之後做sum 05/07 23:10
→ godman362:不知道L大是不是這個意思? 05/07 23:11
推 LPH66:他們因為 __shared__ 的 w 而間接溝通了 05/07 23:28
→ janyfor:按照你的想法每個執行緒要跑"512次的累加迴圈" 05/08 00:23
→ janyfor: 寫 才有累加 05/08 01:02
→ janyfor:512 個 threads "平行化累加" 得到1個數值 05/08 01:11
→ janyfor:因有 512 blocks, 所以最後會得到 512 個數值 05/08 01:13
感謝兩位的指教,以下是我目前改出來的code
__global__ void add(int *a, int *b, int N)
{
int t = threadIdx.x;
int bk = blockIdx.x;
__shared__ int w[512];
w[t] = a[t];
for (int i = 256; i > 0; i >>= 1) {
if (t < i) {
w[t] += w[t+i];
}
__syncthreads();
}
b[bk] = w[0];
}
我將global memory讀到shared memory,然後在每個block做tree reduction
再將每個w[0]丟給b陣列對應的位置
再呼叫第二個kernel做tree reduction就可以了
謝謝兩位指點
※ 編輯: godman362 來自: 122.118.3.222 (05/08 07:45)
推 andyjy12:去看一下SDK的 reduction怎麼做比較有效率吧~ 05/08 11:13
推 littleshan:你整個搞錯 tree reduction 的意思了 05/08 11:33
→ godman362:我搞錯tree reduction的意思...請問我哪邊搞錯了? 05/08 16:03
→ godman362:另外謝謝a大指點,我會去參考一下SDK的部份 05/08 16:07
→ godman362:剛剛看了SDK裡面的ppt,有提到wrap這個部份 05/08 16:33
→ godman362:不知道是不是a大說的可以增加效率的部份? 05/08 16:34