2013-08-26 68 views
0

我試圖編寫一個MEX,它將運行一些CUDA內核(由於我需要流,我沒有使用feval)。我試過:Matlab未能釋放存儲在MEX文件中分配的GPU上的內存

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因爲誰產生錯誤

輸入是一個的一個0,我從void MexFunction(...)中刪除const,這樣我就可以使用預分配給prhs[2]的空間,而不必分配更多的內存。
我想,因爲它是一個gpuArray,指針將GPU內存,我不會有任何問題。但顯然,我錯了...

任何想法如何強制Matalb清理GPU上的內存,當我完成,或只是使用分配的空間prhs[2]?我已經嘗試了很多解決方案,其中很少有解決方案。

我讀過關於就地變化的值。問題是,我不能使用我在Matlab中預先分配的內存 - 它在GPU上,但正如我所提到的,當我使用該指針時,仍然會出錯,相反,我必須創建一個新數組,泄漏...

回答

1

好,我設法(意外),來解決這個問題找出有辦法去除,使使用const_cast

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

由於mxGPUCreateFromMxArray沒有一個const非const實際上如果參數已經在GPU上創建更多的數據(也許它複製有關數組的信息,但指針保持不變),它可以給你一個你需要的對象類(來自mxGPUArray而不是mxArray)不得不復制它。

的暫時無法更改數據問題是由const_cast

沒有LHS參數解決。我只是預先分配空間並覆蓋它。 MEX的第三個參數被適當地改變。

我想知道 - 有沒有人看到我發佈的代碼here的問題? (我在那裏發佈的代碼是一個簡單的內存泄漏問題的重新創建,如果這段代碼看起來是正確的,那麼Matlab有一個問題,或者正確的方法並不像應該那樣簡單。 )