簡體   English   中英

MATLAB MEX導致GPU上的內存丟失

[英]MATLAB MEX causes memory loss on GPU

我編寫了一個mex函數,並注意到,即使我每次覆蓋以前的結果,每次運行它時,GPU上都會有越來越多的內存消失。 在尋找問題根源的過程中,我編寫了以下代碼(該文件稱為MexMemoryTrack ):

#include "mex.h"
#include "gpu/mxGPUArray.h"

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, mxArray const *prhs[])
{
    mxInitGPU();

    const mxGPUArray * inp=mxGPUCreateFromMxArray(prhs[0]);
    const mxGPUArray * ms=mxGPUCreateFromMxArray(prhs[1]);
    const double * inpPtr=(const double*) mxGPUGetDataReadOnly(inp);
    const double * masksPtr=(const double*) mxGPUGetDataReadOnly(ms);
    mxGPUArray * out=mxGPUCopyFromMxArray(prhs[2]);
    double * outPtr=(double* ) mxGPUGetData(out);
    plhs[0] = mxGPUCreateMxArrayOnGPU(out);
    mxGPUDestroyGPUArray(inp);
    mxGPUDestroyGPUArray(ms);
    mxGPUDestroyGPUArray(out);
}

我使用以下命令運行它:

foo=gpuArray.zeros([3 3 10000 18]);
foo2=gpuArray.randn([7 7 10000 20]);
foo3=gpuArray.randn([5 5 18 20]);
dumdum=MexMemoryTrack(foo2,foo3,foo);

如果我將此代碼放入循環中,我的所有內存最終都會消失,並且會出現“內存不足”錯誤。 非常簡單 我分配內存,銷毀我創建的內存, 除了 plhs[0] = mxGPUCreateMxArrayOnGPU(out); 不是,也不應該被摧毀。 由於我要覆蓋dumdum (唯一的lhs參數),因此我假設Matlab足夠聰明,可以覆蓋值,或者釋放它們並為dumdum重新分配空間。 使用clear dumdum也不起作用(如果這是解決方案,那么我將擔心如何保留返回的信息...)。

我想念什么嗎?

編譯器可能是問題的根源(Visual Studio 2010)? 也許不適用於Matlab(我正在使用Matlab 2013a)?

經過許多Google搜索,我最終找到了一個(可能的)解決方案,在這里找到

據此,lhs不會在何時被覆蓋,因此當多次調用該代碼時,先前結果的副本仍保留在內存中-因此lhs[0]可能應在代碼開頭處銷毀(盡管首先我們需要檢查一下如果有什么東西要銷毀,因為可能尚未分配)

我無法驗證這是否確實可以解決問題,因為我目前無法使用帶有MATLAB和圖形卡的計算機。 基本上,(可能的)問題是lhs沒有被覆蓋,而是被重新分配了(實際上我並不感到驚訝,但是我不會猜到,因為我對MATLAB究竟如何處理數據了解得很少。 )。

如果有人碰巧驗證了這一理論,請告訴我您發現了什么。

在幾篇文章中

在並行計算工具箱2013a中使用gpuArray時發生內存泄漏

Matlab 2013a GPU內存泄漏

人們認識到:

MATLAB R2013a使用gpuArray數據調用函數時,MATLAB的內存使用量會增加。 大量的GPU函數調用可能會耗盡可用內存,從而導致Out of MemoryJava heap space error

在此錯誤報告頁面上發布了一個補丁,可以解決該問題。 MATLAB R2013b起已修復此錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM