【问题标题】:using free for the host results in segmentation fault对主机使用免费会导致分段错误
【发布时间】:2014-03-19 22:25:12
【问题描述】:

我有一个带有内核的 cu 文件,例如:

__global__ void kernel(float* A,float *B, curandState* globalState,int Asize,int Bsize)
{
   ....

}

void kernel_wrapper(float** A_host,float** B_host, int Asize ,int Bsize)
{
   ...

    //allocate host memory 
    *A_host=(float*)malloc(Asize*sizeof(float));
    *B_host=(float*)malloc(Bsize*sizeof(float));

    //allocate device memory
    float* A_dev,*B_dev;
    gpuErrchk(cudaMalloc((void**) &A_dev,Asize* sizeof(float)));
    gpuErrchk(cudaMalloc((void**) &B_dev,Bsize* sizeof(float)));

    // copy arrays from host to device
    gpuErrchk(cudaMemcpy(A_dev, *A_host,Asize* sizeof(float), cudaMemcpyHostToDevice));
    gpuErrchk(cudaMemcpy(B_dev, *B_host,Bsize* sizeof(float), cudaMemcpyHostToDevice));

    ....
    kernel<<<dimGrid,dimBlock>>>(A_dev,B_dev, devStates,Asize,Bsize);

    // copy result from device to host
    gpuErrchk(cudaMemcpy(*A_host, A_dev,Asize* sizeof(float), cudaMemcpyDeviceToHost));
    gpuErrchk(cudaMemcpy(*B_host, B_dev,Bsize* sizeof(float), cudaMemcpyDeviceToHost));

    //clean up device memory
    gpuErrchk(cudaFree(A_dev));
    gpuErrchk(cudaFree(B_dev));
    gpuErrchk(cudaFree(devStates));
    //clean up host memory
    free(*A_host);
    free(*B_host);
}

还有一个我从中调用内核的 cpp 文件:

...
extern void kernel_wrapper(float** A,float** B, int Asize ,int Bsize);
...
int main()
{
    ...
    float* A;
    float* B;
    ...
    kernel_wrapper(&A,&B,Asize ,Bsize);
    ...
    free(A);
    free(B);

现在,使用

free(*A_host);
free(*B_host);

在 cu 文件中的结果

分段错误

如果我使用 cudaFree 或 cudaFreeHost(这是不正确的,因为我使用 alloc 进行分配)它会显示“无效设备指针”或“无效参数”。

如果我根本不使用免费,程序运行良好。

为什么会这样?关于这些内存分配的适当过程是什么?

【问题讨论】:

    标签: c memory cuda


    【解决方案1】:

    您在相同的指针上调用了两次free(),这是无效的。这段代码中的内存管理很奇怪也很混乱。

    我想删除free() 函数内的free() 调用最有意义;因为它被设置为将指针返回给调用者,所以 free() 函数中的内存没有意义。

    【讨论】:

    • :所以,如果我只使用 cu 文件,我会在那里免费使用,但因为我是从另一个文件/函数调用内核,所以最好在那里解除分配。为什么内存管理很奇怪?你能告诉我/纠正我吗?谢谢
    • :感谢您的回答。如果您也可以在上述评论中给我一些建议..
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2021-05-25
    • 2016-01-06
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多