gpt4 book ai didi

c - 对主机使用免费会导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:56 25 4
gpt4 key购买 nike

我有一个带有内核的 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文件中结果

Segmentation fault

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

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

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

最佳答案

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

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

关于c - 对主机使用免费会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com