[英]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 R2013a
使用gpuArray
數據調用函數時,MATLAB的內存使用量會增加。 大量的GPU函數調用可能會耗盡可用內存,從而導致Out of Memory
或Java heap space error
。
在此錯誤報告頁面上發布了一個補丁,可以解決該問題。 自MATLAB R2013b
起已修復此錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.