gpt4 book ai didi

c++ - 为什么 AddVector CUDA c++ 不起作用?

转载 作者:行者123 更新时间:2023-11-28 02:59:19 25 4
gpt4 key购买 nike

我正在尝试使用 CUDA 添加 2 个数组,但没有成功。

该做的我都做了:

1) 我并行化了 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] = %d\n", 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。您的内核以每个 block 1024 个线程启动。由于您的 gpu 具有 1.x 计算能力,因此每个 block 仅支持 512 或 768 个线程。详细列表可以在官方找到programming guide .因为您没有使用正确的 cuda 错误检查,所以您无法获得 cuda 运行时 api 返回的错误。 @talonmies 在此 SO answer/question 中提供了一个很好的 cuda 错误检查指南。 .

关于c++ - 为什么 AddVector CUDA c++ 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21234575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com