对主机使用free会导致分段错误

时间:2014-02-19 14:13:43

标签: c memory cuda

我有一个内核的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分配,这是不对的),它会显示“无效的设备指针”或“无效的参数”。

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

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

1 个答案:

答案 0 :(得分:3)

你在相同的指针上调用free()两次,这是无效的。这段代码中的内存管理很奇怪而且令人困惑。

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