我正在尝试编写一个将运行一些 CUDA 内核的 MEX(我没有使用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
产生错误的人
输入是 a gpuArray
,我删除了const
from void MexFunction(...)
,这样我就可以使用预先分配给 的空间prhs[2]
,而不必分配更多内存。
我想既然它是一个 gpuArray,指针将指向 GPU 内存,我不会有任何问题。但显然,我错了……
知道如何在我完成后强制 Matalb 清理 GPU 上的内存,还是只使用分配给的空间prhs[2]
?我已经尝试了很多解决方案,但都没有奏效。
我读过关于就地改变价值观的文章。问题是,我不能使用我在 Matlab 中预先分配的内存——它在 GPU 上,但正如我所提到的,当我使用那个指针时我仍然会出错,相反我必须创建一个新数组,这会导致泄漏...