作者goodzey (--)
看板C_and_CPP
標題[問題] CUDA 程式
時間Thu May 18 23:38:56 2023
不知道有沒有高手可以解答以下問題?
資料形式: 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筆資料
請教大家, 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.72.113.11 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1684424338.A.607.html
1F:→ goodzey: 抱歉, 資料形式: 800列600行的隨機數 05/18 23:41
2F:→ goodzey: 目的: 把每一列的數據加起來 05/18 23:44
3F:→ goodzey: int bdx = blockIdx.x; int tdx = threadIdx.x; 05/18 23:48
4F:推 ManOfSteel: 每一行600個數據,對嗎? 05/19 00:07
5F:推 ManOfSteel: 然後600個數據相加? 05/19 00:10
6F:→ ManOfSteel: 喔,我懂了,是800個數據相加XD 05/19 00:14
7F:→ ManOfSteel: data[600*(j + bdx) +tdx] access資料會超出邊界吧? 05/19 00:21
8F:→ ManOfSteel: blockidx最大不是可以到39? 05/19 00:22
9F:推 celestialgod: 要不要考慮用cuda blas可能比較快 05/19 00:43
10F:推 celestialgod: cublasSgemv 05/19 00:46
11F:→ celestialgod: 具體例子可以問chatGPT 05/19 00:46
12F:推 etgood1478: 為什麼不用reduction 05/19 02:33
13F:推 johnjohnlin: atomic add 05/19 19:13
14F:→ goodzey: 實驗結果: main func中用cublasSdot作很慢(時間需100倍) 05/23 22:05
15F:→ goodzey: 在__global__ 中用cublasSdot難編譯 (makefile需修正) 05/23 22:07
16F:→ goodzey: 在我用的.cu程式(ubuntu環境)好像沒辦法用std::函式 05/23 22:09
17F:推 mikemike1021: 錯誤的原因應該是 race condition,有敘述在論壇內 05/25 04:58
19F:→ mikemike1021: 歡迎大家多多利用來交流 05/25 04:59
20F:→ amike: threads從600改成15 05/25 13:38
21F:→ goodzey: thanks!! 05/26 23:10