【发布时间】: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 进行分配)它会显示“无效设备指针”或“无效参数”。
如果我根本不使用免费,程序运行良好。
为什么会这样?关于这些内存分配的适当过程是什么?
【问题讨论】: