0

我正在尝试编写一个将运行一些 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,我删除了constfrom void MexFunction(...),这样我就可以使用预先分配给 的空间prhs[2],而不必分配更多内存。
我想既然它是一个 gpuArray,指针将指向 GPU 内存,我不会有任何问题。但显然,我错了……

知道如何在我完成后强制 Matalb 清理 GPU 上的内存,还是只使用分配给的空间prhs[2]?我已经尝试了很多解决方案,但都没有奏效。

我读过关于就地改变价值观的文章。问题是,我不能使用我在 Matlab 中预先分配的内存——它在 GPU 上,但正如我所提到的,当我使用那个指针时我仍然会出错,相反我必须创建一个新数组,这会导致泄漏...

4

1 回答 1

1

好吧,我设法解决了这个问题,方法是(意外地)发现有一种方法可以删除使用const_cast

mxGPUArray * tmp = const_cast<mxGPUArray *>(mxGPUCreateFromMxArray(prhs[2]));

mxGPUCreateFromMxArray如果参数已经在 GPU 上,则实际上不会创建更多数据(也许它会复制有关数组的信息,但指针保持不变),它可以为您提供所需的对象类(来自 mxGPUArray 而不是mxArray) 而不必复制它。

无法更改数据的问题通过以下方式解决const_cast

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

我想知道 - 有人看到我在这里发布的代码有问题?(我在此处发布的代码是对内存泄漏问题的简单重现。如果此代码似乎是正确的,那么要么是 Matlab 有问题,要么是正确的方法并不像应有的那么简单。. .)

于 2013-08-26T12:42:45.613 回答