4

私はかなり前からこれを理解しようとしてきました。

CUDAを使用するmatlab(Linux 64ビット)のMEXファイルを使用しています。コードは正常にコンパイルおよび実行されますが、mexをアンロードする場合(たとえば、再コンパイルする場合やmatlabが終了する場合)、matlabはメッセージなしで、空のダンプですぐにクラッシュします。

私はそれを最小限の実用的な例に減らすことができました:

MEX cppファイル:

#include <stdint.h>
#include "mex.h"

extern "C" void cudaTest();

void mexFunction(
                int nlhs, mxArray *plhs[],
                int nrhs, const mxArray *prhs[])
{
    cudaTest();
}

NVCCでコンパイルされたCUDAファイル:

void cudaTest() {

    float* d_test = NULL;
    cudaMalloc((void**) &d_test, 10000 * sizeof(float));

    cudaFree(d_test);
}

私の実際のプログラムでは常にクラッシュしますが、この最小限の例では常に再現できるとは限りません。クラッシュすることもあれば、クラッシュしないこともあります。

4

2 に答える 2

1

これで私の問題は解決したと思います。

http://www.mathworks.de/matlabcentral/answers/45307

于 2012-11-30T15:30:59.763 に答える
0

うーん、それはあなたが解放するのを忘れたメモリの問題かもしれません。

いくつかの提案が役立つかもしれません:

  • MATLABメモリ管理関数を使用しないでください:mxalloc ...、mexfunctionまたはmatlab wrapの外部では、mex関数がmatlabと同時にメモリ管理関数を呼び出すと、mex関数がプロセスバックグラウンドを実行し、MATLABクラッシュを引き起こす可能性があります。

  • 登録mexAtExit(clearfunction)関数(MATLABヘルプ:mexAtExitを参照)MATLABによって自動的に管理されていないmexメモリとスレッド(ここではcudaMalloc)をクリアします。mex関数のアンロードまたはmatlabの終了時に、MATLABはmexfunctionを自動的にクリアします。したがって、momery管理関数がMATLABメモリ管理関数でない場合、MATLABはmexプログラムの処理方法を認識しません。

  • 以下のように関数をデバッグします

走る:

clear your_mex_function

MATLABはyour_mex_functionのclearfunction(この関数はmexatexitレジスタ関数です。逆の手順を参照)を呼び出し、mex関数の問題点を特定します。

于 2012-11-19T14:50:51.270 に答える