【发布时间】:2018-01-09 10:55:28
【问题描述】:
我不知道为什么我的内核函数不起作用。理论上我的程序应该显示 a = 14 但它显示 a = 5。
#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
using namespace std;
__global__ void AddIntCUDA(int* a, int* b)
{
a[0] += b[0];
}
int main()
{
int a = 5;
int b = 9;
int *d_a ;
int *d_b ;
cudaMalloc(&d_a, sizeof(int));
cudaMalloc(&d_b, sizeof(int));
cudaMemcpy(d_a, &a, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice);
AddIntCUDA<<<1, 1>>>(d_a, d_b);
cudaMemcpy(&a, d_a, sizeof(int), cudaMemcpyDeviceToHost);
cout<<"The answer is a = "<<a<<endl;
cudaFree(d_a);
cudaFree(d_b);
return 0;
}
如果我有,我也不明白为什么:
cudaMemcpy(d_b, &b, sizeof(int), cudaMemcpyHostToDevice); //d_b = 9 on device
cudaMemcpy(&a, d_b, sizeof(int), cudaMemcpyDeviceToHost); //a = 9 on host
a 还是 5?
【问题讨论】:
-
您的代码对我有用。输出为 14。检查所有 CUDA 调用的返回类型。
-
我意识到在同一个流中这应该不是问题,但过去我看到过奇怪的结果,除非我在内核调用之后放置一个 cudaDeviceSynchronize()。您可能想至少尝试一下,看看是否由于某种原因在内核完成之前发生了 memcpy。
-
您的代码完全没有错误检查。很可能内核没有执行,因此 a 的值没有改变。
-
您安装了哪个图形设备、CUDA Toolkit 和驱动程序?您是否尝试过一些 CUDA SDK 的示例?例如,deviceQuery?
-
感谢您的回复。问题出在司机身上。我安装了最新的驱动程序版本,现在它可以工作了。
标签: cuda