Matlab无法释放存储在MEX文件中分配的GPU上的内存

时间:2013-08-26 06:31:44

标签: matlab cuda mex

我正在尝试编写一个运行一些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作为生成错误的人

输入为gpuArray,我从const删除了void MexFunction(...),以便我可以使用预先分配给prhs[2]的空格,而不是必须分配更多的记忆 我想因为它是一个gpuArray,指针将是GPU内存,我不会有任何问题。但显然,我错了......

知道如何在我完成时强制Matalb清理GPU上的内存,或者只是使用为prhs[2]分配的空间?我已经尝试了很多解决方案,其中没有解决方案。

我已经阅读过有关就地更改价值的信息。问题是,我无法使用我在Matlab中预先分配的内存 - 它在GPU上,但正如我所提到的,当我使用该指针时仍然会出现错误,而我必须创建一个新数组,这会导致泄漏...

1 个答案:

答案 0 :(得分:1)

好吧,我设法绕过这个问题(意外)发现有一种方法可以使用const_cast

删除使用const非const
mxGPUArray * tmp = const_cast<mxGPUArray *>(mxGPUCreateFromMxArray(prhs[2]));

由于mxGPUCreateFromMxArray实际上没有创建任何更多的数据,如果参数已经在GPU上(可能它复制了有关数组的信息,但指针保持不变),它可以给你一个对象你需要的类(来自mxGPUArray而不是mxArray),而不必复制它。

const_cast

解决了无法更改数据的问题

没有lhs参数。我只是预先分配空间并覆盖它。 MEX的第三个参数已适当更改。

我想知道 - 有人发现我发布的代码here有问题吗? (我在那里发布的代码是一个简单的内存泄漏问题的重新创建。如果这个代码看起来是正确的,那么Matlab有问题,或者正确的方法并不像它应该的那么简单。 。)