Matlab无法释放在MEX文件中分配的GPU上存储的内存
我正在尝试编写一个运行一些CUDA内核的MEX(我没有使用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<<<...>>
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有问题,要么正确的方法没有它应该的那么简单…)