0

いくつかの 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 メモリを指し、問題はないと考えました。でも、どうやら私が間違っていたようです…constvoid MexFunction(...)prhs[2]

完了時にMatalbにGPUのメモリを強制的にクリーンアップさせる方法、または単に割り当てられたスペースを使用する方法はありprhs[2]ますか? 私は非常に多くの解決策を試しましたが、どれもうまくいきませんでした。

その場で値を変更することについて読んだことがあります。問題は、Matlab で事前に割り当てたメモリを使用できないことです。これは GPU 上にありますが、前述のように、そのポインターを使用するとエラーが発生し、代わりに新しい配列を作成する必要があり、これが原因で発生します。漏れ...

4

1 に答える 1

1

まあ、私は(偶然に)constを非constにするために削除する方法があることを発見することで、この問題を回避することができましたconst_cast

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

引数が既に GPU にある場合、実際にはこれ以上データを作成しないためmxGPUCreateFromMxArray(配列に関する情報をコピーする可能性がありますが、ポインターは同じままです)、必要なオブジェクト クラスを (代わりに mxGPUArray から) 提供できます。 mxArray) をコピーする必要はありません。

データを変更できないという問題は、const_cast

lhs 引数がありません。スペースを事前に割り当てて上書きするだけです。MEX の 3 番目の引数が適切に変更されます。

ここに投稿したコードに問題がある人はいますか? (私がそこに投稿したコードは、メモリ リークの問題を単純に再現したものです。このコードが正しいと思われる場合は、Matlab に問題があるか、それを行う正しい方法が本来あるべきほど単純ではありません.. .)

于 2013-08-26T12:42:45.613 に答える