我正在尝试编写一个运行一些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上,但正如我所提到的,当我使用该指针时仍然会出现错误,而我必须创建一个新数组,这会导致泄漏...
答案 0 :(得分:1)
好吧,我设法绕过这个问题(意外)发现有一种方法可以使用const_cast
mxGPUArray * tmp = const_cast<mxGPUArray *>(mxGPUCreateFromMxArray(prhs[2]));
由于mxGPUCreateFromMxArray
实际上没有创建任何更多的数据,如果参数已经在GPU上(可能它复制了有关数组的信息,但指针保持不变),它可以给你一个对象你需要的类(来自mxGPUArray而不是mxArray),而不必复制它。
const_cast
没有lhs参数。我只是预先分配空间并覆盖它。 MEX的第三个参数已适当更改。
我想知道 - 有人发现我发布的代码here有问题吗? (我在那里发布的代码是一个简单的内存泄漏问题的重新创建。如果这个代码看起来是正确的,那么Matlab有问题,或者正确的方法并不像它应该的那么简单。 。)