作者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/cn.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