斯坦福的兔子 2022-02-15 10:56 采纳率: 0%
浏览 74
已结题

CUDA 原子操作 当每个线程的原子操作次数过多就会导致计算错误

问题遇到的现象和发生背景

问题现象:在使用CUDA并行计算时,有一个步骤需要叠加数组内元素的和,直接相加必然会出现线程抢夺资源导致的计算错误,所以要使用原子操作功能。但是我发现当每个线程计算次数超过一定数时,计算结果就会出现错误,结果变成一个特别大的数,仿佛是超过表示限制了。

发生背景:使用cuda计算点云平均点距,需要对图像上像素对应的每个点的距离进行总和再除以点数,这就需要使用原子加和操作atomicAdd()。操作的数据类型是双精度浮点数double。但是我使用的是计算能力为3.5的GT720显卡(mutiProcessorCount = 1,maxThreadsPerBlock = 1024),不支持double类型原子操作,需要对原子操作进行重载,按照官网的重载代码完成了对double类型的计算功能实现。
但是实际实验发现,我在核函数当中想要用for循环计算所有点的点距和,一共有1920*1200个点,我调用了共2048个线程,需要每个线程执行for循环计算1125次,但是这样计算结果就会出错,变成一个非常大的数字(-6.27744e+066),但是当我只计算一两万个点的时候,计算结果就没有错误。
为了方便查看测试结果是否正确,我假设每个点的点距都是1,这样有多少点正确的数就是多少。

问题相关代码
int iThreadNum = 256; 
int iBlockNum = 8;
__global__ add(const int iImageW, const int iImageH,int const iThreadNum ,const int iBlockNum ,,double* result)
{
  const int iImageSize = iImageW *  iImageH;
const int tid = threadIdx.x;
const int bid = blockIdx.x;

  for (int t = bid *iThreadNum + tid ; t <  iImageSize ; t += iBlockNum * iThreadNum)
  {
      atomicAdd(&(result[0]), 1.0);
  }
}

把iImageSize 改成 2048 后计算结果正常,
经过测试iImageSize一旦大于368640就会出错。

int iThreadNum = 256; 
int iBlockNum = 8;
__global__ add(const int iImageW, const int iImageH,int const iThreadNum ,const int iBlockNum ,,double* result)
{
  const int iImageSize = 2048;
const int tid = threadIdx.x;
const int bid = blockIdx.x;

  for (int t = bid *iThreadNum + tid ; t <  iImageSize ; t += iBlockNum * iThreadNum)
  {
      atomicAdd(&(result[0]), 1.0);
  }
}
运行结果及报错内容

第一个核函数结果:
result[0] = -6.27744e+066
第二个核函数结果
result[0] = 2048

我想要达到的结果

想要搞清楚问题出在哪,在英伟达显卡的官网cuda指导书上没有发现类似问题的描述,以及如何才能正确计算大量数的双精度浮点数的和。请您能够指点一下万分感谢。

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2022-02-16 16:16
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 修改了问题 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能