いくつかの CUDA カーネルを実行する MEX を作成しようとしています (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
行は、エラーを生成した人として指しています
入力は で、 fromgpuArray
を削除したので、 に事前に割り当てられたスペースを使用でき、より多くのメモリを割り当てる必要はありません。
これは gpuArray であるため、ポインタは GPU メモリを指し、問題はないと考えました。でも、どうやら私が間違っていたようです…const
void MexFunction(...)
prhs[2]
完了時にMatalbにGPUのメモリを強制的にクリーンアップさせる方法、または単に割り当てられたスペースを使用する方法はありprhs[2]
ますか? 私は非常に多くの解決策を試しましたが、どれもうまくいきませんでした。
その場で値を変更することについて読んだことがあります。問題は、Matlab で事前に割り当てたメモリを使用できないことです。これは GPU 上にありますが、前述のように、そのポインターを使用するとエラーが発生し、代わりに新しい配列を作成する必要があり、これが原因で発生します。漏れ...