【发布时间】:2021-12-17 04:58:03
【问题描述】:
我在运行此代码时收到分段错误(核心转储)。
我知道 cudaMalloc 是问题所在,但我不知道如何解决它。我刚开始学习一些 CUDA 编程,我不熟悉它。如果重要的话,我正在开发 wsl。
#include<stdio.h>
#define SIZE 20
__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;
cudaMalloc((void**)&a,SIZE *sizeof(int));
cudaMalloc((void**)&b, SIZE *sizeof(int));
cudaMalloc((void**)&c,SIZE *sizeof(int));
for (int i=1;i<SIZE;i++){
a[i]=i;
b[i]=i;
c[i]=0;
}
VectorAdd<<<1, SIZE>>>(a,b,c,SIZE);
cudaDeviceSynchronize();
for(int i=1;i<SIZE;i++){
printf("%d \n",c[i]);
}
cudaFree(a);
cudaFree(b);
cudaFree(c);
return 0;
}
【问题讨论】:
-
使用
cudaMalloc创建的分配不能直接从主机代码中引用,正如您在此处尝试所做的那样:a[i]=i;。有一个名为vectorAdd的 CUDA 示例代码,它提供了一种典型的处理方法。你看过那个示例代码吗? -
发布的代码也无法在最后打印出
c[]值。 -
如果你想使用普通代码来初始化你的数组,并使用普通代码来打印总和(正如你在这里尝试的那样),你将不得不:(a)分配常规内存和 Cuda 内存(对于常规内存,您可以使用普通数组,或调用
malloc); (b) 初始化您的主机阵列,(c) 使用cudaMemcpy从主机复制到设备,(d) 调用您的内核进行添加,(e) 再次使用cudaMemcpy从设备内存复制回主机内存,以及最后 (f) 打印出结果。 -
感谢您的回答。我会研究示例代码。
标签: cuda