【问题标题】:Matlab fails to free memory stored on GPU allocated in a MEX fileMatlab 无法释放存储在 MEX 文件中分配的 GPU 上的内存
【发布时间】:2013-08-28 13:52:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab cuda mex


    【解决方案1】:

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

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

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

    无法更改数据的问题由const_cast解决

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2018-03-26
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多