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

Matlab无法释放在MEX文件中分配的GPU上存储的内存,matlab,cuda,mex,Matlab,Cuda,Mex,我正在尝试编写一个运行一些CUDA内核的MEX(我没有使用feval,因为我需要流)。我试过: mxGPUArray * tmp=mxGPUCopyFromMxArray(prhs[2]); double * outPtr=(double* ) mxGPUGetData(tmp); kernel<<<..>>>(outPtr,...); 用这个指针作为输入调用内核(内核写入该位置),我得到一个错误: kernel<<<...>>

我正在尝试编写一个运行一些CUDA内核的MEX(我没有使用
feval
,因为我需要流)。我试过:

mxGPUArray * tmp=mxGPUCopyFromMxArray(prhs[2]);
double * outPtr=(double* ) mxGPUGetData(tmp);
kernel<<<..>>>(outPtr,...);
用这个指针作为输入调用内核(内核写入该位置),我得到一个错误:

kernel<<<...>>>(outPtr,...);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
内核(outPtr,…);
gpuerchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
该行指向生成错误的人
cudaDeviceSynchronize

输入是一个
gpuArray
,我从
void MexFunction(…)
中删除了
const
,这样我就可以使用预先分配给
prhs[2]
的空间,而不必分配更多内存。
我想既然它是gpuArray,指针就会指向GPU内存,我就不会有任何问题了。但显然,我错了

当我完成后,你知道如何强制Matalb清理GPU上的内存,或者仅仅使用分配给
prhs[2]
的空间吗?我尝试过很多解决方案,但没有一个奏效


我已经读过关于在适当位置更改值的内容。问题是,我不能使用我在Matlab中预先分配的内存-它在GPU上,但正如我所提到的,我在使用该指针时仍然会出错,相反,我必须创建一个新数组,这会导致泄漏…

好吧,我通过(意外地)解决了这个问题使用
const\u cast

mxGPUArray * tmp = const_cast<mxGPUArray *>(mxGPUCreateFromMxArray(prhs[2]));
mxGPUArray*tmp=const_cast(mxgpucreatefromxarray(prhs[2]);
由于
mxGPUCreateFromMxArray
如果参数已经在GPU上,实际上不会创建更多数据(可能它复制了关于数组的信息,但指针保持不变),因此它可以为您提供所需的对象类(从mxGPUArray而不是mxArray),而无需复制它

无法更改数据的问题通过
const\u cast

mxGPUArray * tmp = const_cast<mxGPUArray *>(mxGPUCreateFromMxArray(prhs[2]));
没有lhs参数。我只是预先分配空间并覆盖它。MEX的第三个参数已适当更改

我想知道-有人看到我发布的代码有问题吗?(我在那里发布的代码是对内存泄漏问题的简单再现。如果这段代码似乎是正确的,那么要么是Matlab有问题,要么正确的方法没有它应该的那么简单…)