[問題] CUDA 程式

作者: goodzey (--)   2023-05-18 23:38:56
不知道有沒有高手可以解答以下問題?
資料形式: 600列800行的隨機數
目的: 把每一行的數據加起來
初始化:
sum[600]={0.0}
data[600x800]= 上述資料
CUDA程式1: 成功
// dim3 gridsize(1, 1, 1);
// dim3 blocksize(600, 1, 1);
for (int j = 0; j < 800; j+= 1){
sum[(blockDim.x*bdx + tdx)] = sum[(blockDim.x*bdx + tdx)]
+ data[600*j + (blockDim.x*bdx +tdx)];
}
CUDA程式2: 失敗
// dim3 gridsize(40, 1, 1);
// dim3 blocksize(600, 1, 1);
for (int j = 0; j < 800; j+= 40){
sum[0*(j + bdx) +tdx] = sum[0*(j + bdx) +tdx]
+ data[600*(j + bdx) +tdx];
}
請問程式2失敗的原因是?可以怎麼寫呢?
我自己猜測是: 例如, sum[1]無法同時處理40筆資料
請教大家, 謝謝
作者: goodzey (--)   2023-05-18 23:41:00
抱歉, 資料形式: 800列600行的隨機數目的: 把每一列的數據加起來int bdx = blockIdx.x; int tdx = threadIdx.x;
作者: ManOfSteel (Man Of Steel)   2023-05-19 00:07:00
每一行600個數據,對嗎?然後600個數據相加?喔,我懂了,是800個數據相加XDdata[600*(j + bdx) +tdx] access資料會超出邊界吧?blockidx最大不是可以到39?
作者: celestialgod (天)   2023-05-19 00:43:00
要不要考慮用cuda blas可能比較快cublasSgemv具體例子可以問chatGPT
作者: etgood1478 (Number2)   2023-05-19 02:33:00
為什麼不用reduction
作者: johnjohnlin (嗯?)   2023-05-19 19:13:00
atomic add
作者: goodzey (--)   2023-05-23 22:05:00
實驗結果: main func中用cublasSdot作很慢(時間需100倍)在__global__ 中用cublasSdot難編譯 (makefile需修正)在我用的.cu程式(ubuntu環境)好像沒辦法用std::函式
作者: mikemike1021 (mike)   2023-05-25 04:58:00
錯誤的原因應該是 race condition,有敘述在論壇內無廣告 https://forum.community.tw/t/topic/525歡迎大家多多利用來交流
作者: amike (沒有影子的貓)   2023-05-25 13:38:00
threads從600改成15
作者: goodzey (--)   2023-05-26 23:10:00
thanks!!

Links booklink

Contact Us: admin [ a t ] ucptt.com