获取CUDA中设备malloc()的分段错误

获取CUDA中设备malloc()的分段错误,c,cuda,malloc,C,Cuda,Malloc,调用random_int(b),代码在访问数组中的N-1位置后遇到分段错误,与N的值无关。尽管调用random\u ints(a)工作正常,并将所有值分配给数组a。如果我使用数组的静态分配,inta[N]、b[N]、c[N]代码运行得很好。该代码与NVIDIA CUDA基础教程中提供的代码完全相同,只是实现了random_ints()函数。我已经尝试过其他方法,替换main()中的函数调用,或者分配另一个数组并从random\u ints()返回main(),或者删除CUDA代码段。如果没有CU

调用
random_int(b)
,代码在访问数组中的
N-1
位置后遇到分段错误,与
N
的值无关。尽管调用
random\u ints(a)
工作正常,并将所有值分配给数组
a
。如果我使用数组的静态分配,
inta[N]、b[N]、c[N]
代码运行得很好。该代码与NVIDIA CUDA基础教程中提供的代码完全相同,只是实现了
random_ints()
函数。我已经尝试过其他方法,替换
main()
中的函数调用,或者分配另一个数组并从
random\u ints()
返回
main()
,或者删除CUDA代码段。如果没有CUDA部件,函数调用可以完美运行

我正在寻找对这个问题的解释。提前谢谢

#include<stdio.h>
#include<stdlib.h>
#define N 512
__global__ void add(int *a,int *b,int *c)
{
    c[blockIdx.x]= a[blockIdx.x] + b[blockIdx.x];
}

void random_ints(int *x,int n)
{
    int i;
    for(i=0;i<n;i++)
    {
            printf("\n%d",i);
            x[i]=i;
    }
}
int main()
{
    int i;
    int *a,*b,*c;   //host copies of a,b,c
    int *d_a, *d_b, *d_c;   //device copies of a,b,c
    int size =sizeof(int)*N;
    //Allocate memories for device copies of a,b,c
    cudaMalloc((void **)&d_a,size);
    cudaMalloc((void **)&d_b,size); 
    cudaMalloc((void **)&d_c,size);

    //Alloc space for host copies of a,b,c and setup input values
    a=(int*)malloc(size);
    random_ints(a,N);
    b=(int*)malloc(size);
    random_ints(b,N);   
    c=(int*)malloc(size);
    //copy inputs to the device 
    cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
    //Launch add() kernel on GPU 
    add<<<N,1>>>(d_a,d_b,d_c);

    //copy results back to host
    cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);

    for(i=0;i<N;i++)
    {
            printf("\nc= %d\n",c[i]);
    }
    //cleanup
    free(a);free(b);free(c);
    cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
    return 0;
}
#包括
#包括
#定义N 512
__全局无效添加(int*a、int*b、int*c)
{
c[blockIdx.x]=a[blockIdx.x]+b[blockIdx.x];
}
无效随机整数(整数*x,整数n)
{
int i;

对于(i=0;i您正在向
cudaMemcpy
传递不正确的参数。这:

cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
应该是

cudaMemcpy(d_a, a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice);

同样地:

cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);
应该是

cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);

这将是设备到主机的拷贝,这将是您问题的根源-它将覆盖堆栈并导致您看到的SEGFULT

cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);
cudaMemcpy(&c[0], d_c, size, cudaMemcpyDeviceToHost);