CUDA 内核不修改值

问题描述 投票:0回答:1

最近我收到了与 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 本身。我应该尝试重新安装它还是我遗漏了一些明显的东西?

c++ cuda
1个回答
0
投票

显然我的 CUDA 安装搞砸了,它使用的版本不受驱动程序支持,导致内核无法运行。有点烦人的是,没有

cudaGetLastError()
它没有向我显示任何问题,但至少我知道如何检查此类错误。

再次感谢@kakkoko 指出!

© www.soinside.com 2019 - 2024. All rights reserved.