c - 在 CUDA 中使用设备 malloc() 获取段错误

标签 c cuda malloc

电话random_ints(b) ,代码在访问 N-1 后遇到了段错误数组中的位置,与 N 的值无关.虽然打电话random_ints(a)工作正常并将所有值分配给数组 a .如果我使用数组的静态分配,int a[N],b[N],c[N]代码运行完美。除 random_ints() 的实现外,该代码与 NVIDIA CUDA 基础教程中提供的代码完全相同。功能。我已经通过替换 main() 中的函数调用尝试了其他替代方法。或者通过分配另一个数组并返回到 main()来自 random_ints()或删除 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;
}

最佳答案

您向 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(d_a, &a[0], size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &b[0], size, cudaMemcpyHostToDevice);

和类似的:

cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);

应该是

cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);

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

它将是主机副本的设备,这将是您问题的根源 - 它会覆盖堆栈并导致您看到的段错误。

关于c - 在 CUDA 中使用设备 malloc() 获取段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131346/

相关文章:

c - 编译 glibc 时 mipsel-gcc 产生的奇怪加载指令

android - 将 C 代码文件合并为一个 C 代码文件

c++ - cuda数组排序推力,内存不足

c++ - 命名空间 thrust::system::cuda::thrust 中无法解释的错误,特别是在 "system_error"和 "cuda_category"

c - free功能好像不行

c - 在c中返回一个数组来计算数字

c - 内存设置行为

c++ - CUDA 编译器 (nvcc) 宏

C++ malloc 错误

c - 内存释放期间运行时堆异常