首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >cuda atomicAdd示例无法生成正确的输出

cuda atomicAdd示例无法生成正确的输出
EN

Stack Overflow用户
提问于 2014-05-19 12:48:46
回答 1查看 10.8K关注 0票数 2

以下代码的目标是将100个元素的浮点数组递增110倍。在输出中,我期望每个元素的值为10.0f的100个元素数组。相反,我得到的是随机值。你能在这里指出我的错误吗?

代码语言:javascript
代码运行次数:0
运行
复制
__global__  void testAdd(float *a)
{
    float temp;
    for (int i = 0; i < 100 ; i++)
    {
        a[i] = atomicAdd(&a[i], 1.0f);
    }
}
void cuTestAtomicAdd(float *a)
{
    testAdd<<<1, 10>>>(a);
}

我的目标是理解原子操作的工作原理,以便将它们应用到其他地方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-19 13:04:59

这不是我们做atomicAdd操作的方式。

就像这样做:

代码语言:javascript
代码运行次数:0
运行
复制
atomicAdd(&a[i], 1.0f);

并且有问题的变量(a[i])将被更新。

原子函数的返回值通常是原子更新之前变量中的旧值。

所以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
a[i] = atomicAdd(&a[i], 1.0f);

将更新变量a[i],然后(以非原子方式)将旧值赋给变量a[i]。这几乎肯定不是您想要的。

阅读documentation

该函数返回old。

下面的完整代码演示了正确的用法:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

__global__  void testAdd(float *a)
{
    for (int i = 0; i < 100 ; i++)
    {
        atomicAdd(&a[i], 1.0f);
    }
}
void cuTestAtomicAdd(float *a)
{
    testAdd<<<1, 10>>>(a);
}

int main(){

  float *d_data, *h_data;
  h_data=(float *) malloc(100*sizeof(float));
  cudaMalloc((void **)&d_data, 100*sizeof(float));
  cudaMemset(d_data, 0, 100*sizeof(float));
  cuTestAtomicAdd(d_data);
  cudaMemcpy(h_data, d_data, 100*sizeof(float), cudaMemcpyDeviceToHost);
  for (int i = 0; i < 100; i++)
    if (h_data[i] != 10.0f) {printf("mismatch at %d, was %f, should be %f\n", i, h_data[i], 10.0f); return 1;}
  printf("Success\n");
  return 0;
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23729883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档