我有一个内核的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分配,这是不对的),它会显示“无效的设备指针”或“无效的参数”。
如果我根本不使用免费程序,程序运行正常。
为什么这是关于这些内存分配的适当过程?
答案 0 :(得分:3)
你在相同的指针上调用free()
两次,这是无效的。这段代码中的内存管理很奇怪而且令人困惑。
我认为删除free()
函数中的kernel_wrapper()
调用最有意义;因为它被设置为返回指向调用者的指针,所以free()
函数中的内存没有意义。