【发布时间】:2013-08-28 13:52:58
【问题描述】:
我正在尝试编写一个 MEX,它将运行一些 CUDA 内核(我没有使用 feval,因为我需要流)。我试过了:
mxGPUArray * tmp=mxGPUCopyFromMxArray(prhs[2]);
double * outPtr=(double* ) mxGPUGetData(tmp);
kernel<<<..>>>(outPtr,...);
完美运行。不幸的是,似乎缺少Matlab的GPU内存管理......我必须使用plhs[0]=mxGPUCreateMxArrayOnGPU(...)。自然,我不能在 MEX 代码中销毁它。但似乎在覆盖它之后,MATLAB 也没有破坏它——这意味着我遇到了内存泄漏。
由于我无法弄清楚如何在完成后让 Matlab 清除该内存,所以我尝试了:
double * outPtr=(double* ) mxGetData(prhs[2]);
并使用此指针作为输入调用内核(内核写入该位置),我得到一个错误:
kernel<<<...>>>(outPtr,...);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
该行指向cudaDeviceSynchronize 作为产生错误的人
输入是gpuArray,我从void MexFunction(...) 中删除了const,这样我就可以使用预分配给prhs[2] 的空间,而不必分配更多内存。
我想既然它是一个 gpuArray,指针将指向 GPU 内存,我不会有任何问题。但显然,我错了……
知道如何在我完成后强制 Matalb 清理 GPU 上的内存,还是只使用分配给 prhs[2] 的空间?我尝试了很多解决方案,但都没有奏效。
我已经阅读了有关就地更改值的信息。问题是,我不能使用我在 Matlab 中预先分配的内存——它在 GPU 上,但正如我所提到的,当我使用那个指针时我仍然会出错,相反我必须创建一个新数组,这会导致泄漏...
【问题讨论】: