C++ 初学者CUDA-简单变量增量不起作用

C++ 初学者CUDA-简单变量增量不起作用,c++,cuda,C++,Cuda,我正在和CUDA合作一个项目。为了掌握诀窍,我有以下代码 #include <iostream> using namespace std; __global__ void inc(int *foo) { ++(*foo); } int main() { int count = 0, *cuda_count; cudaMalloc((void**)&cuda_count, sizeof(int)); cudaMemcpy(cuda_count, &

我正在和CUDA合作一个项目。为了掌握诀窍,我有以下代码

#include <iostream>

using namespace std;

__global__ void inc(int *foo) {
  ++(*foo);
}

int main() {
  int count = 0, *cuda_count;
  cudaMalloc((void**)&cuda_count, sizeof(int));
  cudaMemcpy(cuda_count, &count, sizeof(int), cudaMemcpyHostToDevice);
  cout << "count: " << count << '\n';
  inc <<< 100, 25 >>> (&count);
  cudaMemcpy(&count, cuda_count, sizeof(int), cudaMemcpyDeviceToHost);
  cudaFree(cuda_count);
  cout << "count: " << count << '\n';
  return 0;
}
有什么问题吗


提前谢谢

您应该将
cuda\u count
传递给内核函数。除此之外,所有线程都试图增加相同的内存位置。这样做的效果并没有得到很好的定义(至少有一次写操作会成功,但不止一次会成功)

您需要通过只让一个线程执行工作来防止这种情况:

__global__ void inc(int *foo) {
  if (blockIdx.x == 0 && threadIdx.x == 0)
    ++*foo;
}

(未经测试)

我找到了解决方案。我只需要使用一个原子函数,即一个在没有其他线程干扰的情况下执行的函数。 换句话说,在操作完成之前,没有其他线程可以访问特定地址 完成

代码:


感谢您让我意识到我所犯的错误。

您的代码的问题是您正在向设备内核传递指向count的指针。不是指向计数的指针。一个'和'太多了

这条线

inc <<< 100, 25 >>> (&count);
inc>(&count);
应该是

inc <<< 100, 25 >>> (count);
inc>(计数);

我真是个失败。然而,它的输出仍然是错误的。它给了我1,而不是预期的2500。@Renato:这不是CUDA的工作方式。请参阅我的更新答案:从不同线程写入同一内存位置是没有定义的。您需要的是所谓的聚集操作。实现这一点并不简单。Konrad的修复程序确保只有
threadIdx.x==0
的线程才会尝试递增变量,但由于您要启动许多块,因此将有许多线程具有该索引。尝试
blockIdx.x==0&&threadIdx.x==0
。话虽如此,为了更清楚地了解这一切是如何工作的,也许值得查看一些SDK示例…@Tom:谢谢,我相应地更改了我的答案。我上次使用CUDA已经两年了。您可能应该学习编程指南中的一些示例。您的语法与编程指南中的建议不一致。
count: 0
count: 2500
inc <<< 100, 25 >>> (&count);
inc <<< 100, 25 >>> (count);