看板 C_and_CPP 關於我們 聯絡資訊
不知道有沒有高手可以解答以下問題? 資料形式: 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://www.ptt.cc/bbs/C_and_CPP/M.1684424338.A.607.html
goodzey: 抱歉, 資料形式: 800列600行的隨機數 05/18 23:41
goodzey: 目的: 把每一列的數據加起來 05/18 23:44
goodzey: int bdx = blockIdx.x; int tdx = threadIdx.x; 05/18 23:48
ManOfSteel: 每一行600個數據,對嗎? 05/19 00:07
ManOfSteel: 然後600個數據相加? 05/19 00:10
ManOfSteel: 喔,我懂了,是800個數據相加XD 05/19 00:14
ManOfSteel: data[600*(j + bdx) +tdx] access資料會超出邊界吧? 05/19 00:21
ManOfSteel: blockidx最大不是可以到39? 05/19 00:22
celestialgod: 要不要考慮用cuda blas可能比較快 05/19 00:43
celestialgod: cublasSgemv 05/19 00:46
celestialgod: 具體例子可以問chatGPT 05/19 00:46
etgood1478: 為什麼不用reduction 05/19 02:33
johnjohnlin: atomic add 05/19 19:13
goodzey: 實驗結果: main func中用cublasSdot作很慢(時間需100倍) 05/23 22:05
goodzey: 在__global__ 中用cublasSdot難編譯 (makefile需修正) 05/23 22:07
goodzey: 在我用的.cu程式(ubuntu環境)好像沒辦法用std::函式 05/23 22:09
mikemike1021: 錯誤的原因應該是 race condition,有敘述在論壇內 05/25 04:58
mikemike1021: 無廣告 https://forum.community.tw/t/topic/525 05/25 04:58
mikemike1021: 歡迎大家多多利用來交流 05/25 04:59
amike: threads從600改成15 05/25 13:38
goodzey: thanks!! 05/26 23:10