最近我收到了与 CUDA 内核相关的奇怪错误。为了找到根源,我编写了这个非常简单的代码进行测试:
#include <iostream>
#define N 3
__global__ void add(int *a, int *b, int *c) {
int i = blockIdx.x;
c[i] = a[i] + b[i];
}
int main() {
int *a, *b, *c;
// I know I could make normal arrays, but at this point I was trying everything to catch the error
a = new int[N];
b = new int[N];
c = new int[N];
int *ca, *cb, *cc;
cudaMalloc((void**)&ca, N*sizeof(int));
cudaMalloc((void**)&cb, N*sizeof(int));
cudaMalloc((void**)&cc, N*sizeof(int));
for (int i = 0; i < N; i++)
{
a[i] = 1;
b[i] = 2;
c[i] = 5;
}
cudaMemcpy(ca, a, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(cb, b, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(cc, c, N*sizeof(int), cudaMemcpyHostToDevice);
add<<<1, N>>>(ca, cb, cc);
cudaMemcpy(a, ca, N*sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(b, cb, N*sizeof(int), cudaMemcpyDeviceToHost);
cudaMemcpy(c, cc, N*sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < N; i++)
std::cout << "c[" << i << "] = " << c[i] << std::endl;
cudaFree(ca);
cudaFree(cb);
cudaFree(cc);
delete[] a;
delete[] b;
delete[] c;
return 0;
}
现在,它应该覆盖数组中的值 5
C
,但我的输出显示它到最后仍然是 5。我一直在尝试更改值和代码本身,但结果是相同的。我有一种感觉,错误不是来自代码,而是来自 CUDA 本身。我应该尝试重新安装它还是我遗漏了一些明显的东西?
显然我的 CUDA 安装被搞砸了,它使用的版本不受驱动程序支持,导致内核无法运行。有点烦人的是,没有
cudaGetLastError()
它没有向我显示任何问题,但至少我知道如何检查此类错误。
再次感谢@kakkoko 指出!