我試圖編寫一個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上,但正如我所提到的,當我使用該指針時,仍然會出錯,相反,我必須創建一個新數組,泄漏...