为什么AddVector CUDA C 不起作用

Why AddVector CUDA c++ is not working?

本文关键字:不起作用 CUDA AddVector 为什么      更新时间:2023-10-16

我正在尝试使用CUDA添加2个数组,但它不起作用。

我做了所有应该完成的事情:

1)i并行使vectorAdd函数

2)我将内存分配给GPU并将数据移至GPU

3)和最后一件事,我修改了函数vectorAdd以在gpu

上运行

这是代码:

#define SIZE 1024
__global__ void VectorAdd(int *a, int *b, int *c, int n)
{
    int i = threadIdx.x ;
    if(i < n)
        c[i] = a[i] + b[i];
}
int main()
{
    int *a , *b , *c;
    int *d_a , *d_b , *d_c;
    a = (int *)malloc(SIZE * sizeof(int));
    b = (int *)malloc(SIZE * sizeof(int));
    c = (int *)malloc(SIZE * sizeof(int));
    cudaMalloc( &d_a , SIZE * sizeof(int) );
    cudaMalloc( &d_b , SIZE * sizeof(int) );
    cudaMalloc( &d_c , SIZE * sizeof(int) );
    for ( int i = 0 ; i < SIZE ; ++i)
    {
        a[i] = i ;
        b[i] = i ;
        c[i] = 0 ;
    }
    cudaMemcpy(d_a, a, SIZE *sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, b, SIZE *sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_c, c, SIZE *sizeof(int), cudaMemcpyHostToDevice);
    VectorAdd<<< 1, SIZE >>>(d_a, d_b, d_c, SIZE);
    cudaMemcpy(c, d_c, SIZE * sizeof(int), cudaMemcpyDeviceToHost);
    for(int i = 0 ; i < 10 ; ++i)
    {
        printf("C[%d] =  %dn", i, c[i]);
    }
    free(a);
    free(b);
    free(c);
    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);
    return 0;
}

控制台上的输出是这样的: c[0] = 0 , c[1] = 0 , c[2] = 0 , c[3] = 0 , c[4] = 0 ....

为什么应该是: c[0] = 0 ; c[1] = 2 ; c[2] = 4 ....

在您的情况下,问题取决于您使用过的GPU。您的内核每块1024个线程启动。由于您的GPU具有计算能力1.x 1.x,每个块仅支持512或768个线程。可以在官方编程指南中找到详细列表。由于您没有使用适当的CUDA错误检查,因此您无法获得CUDA运行时API返回的错误。@talonmies在此答案/问题中给出了CUDA错误检查的好指南。