私は 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 を使用しています) ではうまく動作しませんか?