C++ 初学者CUDA-简单变量增量不起作用
我正在和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, &
#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);