【发布时间】:2019-07-01 02:49:05
【问题描述】:
我从“CUDA By Example”一书中复制了一个向量加法示例,但我得到了意想不到的错误结果。这是我的代码
#define N (33*1024)
__global__
void add(int *a, int *b,int *c){
int tid = threadIdx.x+blockIdx.x*blockDim.x;
while (tid < N){
c[tid] = a[tid]+b[tid];
tid+=blockDim.x*gridDim.x;
}
}
int main()
{
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
cudaMalloc((void**)&dev_a,N*sizeof(int));
cudaMalloc((void**)&dev_b,N*sizeof(int));
cudaMalloc((void**)&dev_c,N*sizeof(int));
for(int i = 0 ; i<N;i++){
a[i]= -i;
b[i]= i*i;
}
cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(dev_c,c,N*sizeof(int),cudaMemcpyHostToDevice);
add<<<128,128>>>(dev_a,dev_b,dev_c);
cudaMemcpy(c,dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);
bool success=true;
//print results
for(int i=0; i<N;i++){
if((a[i]+b[i])!=c[i]){
printf("Error: %d + %d != %d\n",a[i],b[i],c[i]);
success=false;
}
}
if(success) printf("we did it!\n");
cudaFree(dev_a);
cudaFree(dev_a);
cudaFree(dev_a);
printf("done");
return EXIT_SUCCESS;
}
我得到了一堆不正确的加法结果,这里只是一些
Error: -33784 + 1141358656 != 255
Error: -33785 + 1141426225 != 0
Error: -33786 + 1141493796 != 0
Error: -33787 + 1141561369 != 0
Error: -33788 + 1141628944 != 4609792
Error: -33789 + 1141696521 != 0
Error: -33790 + 1141764100 != 4207408
还有更多。我是一个完整的 CUDA 初学者,但我猜我要么
A) 从书中错误地复制了代码或
B) 不正确的结果是因为我使用的是在本书写完很久之后才出现的 CUDA 10
编辑:我重新启动了我的电脑,它工作了
【问题讨论】:
标签: cuda