6

私は、パフォーマンスを最適化する必要がある Matlab のプロジェクトに取り組んでおり、.m ファイルから作成されたいくつかの関数呼び出しを並列化することを考えていました。

アイデアは単純で、Matlab ファイル (.m) から MEX としてコンパイルされた C ファイルを呼び出し、その C ファイルからいくつかのスレッドを作成し、各スレッドから matlab 関数をコールバックします。

理論は機能し、スレッドを作成でき、matlab 関数を呼び出すこともできます。問題は、スレッドから matlab 関数を呼び出すことができないことです。

//Global variables
mxArray **g_plhs;
mxArray **g_prhs;
int g_nlhs;
int g_nrhs;

//Thread function
DWORD WINAPI my_function( LPVOID lpParam ) 
{
    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function");
    return 0; 
}


//Main function
void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[]) {

    DWORD dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS]; 
    g_plhs = plhs;
    g_prhs = prhs;
    g_nlhs = nlhs;
    g_nrhs = nrhs;

    hThreadArray[0] = CreateThread( 
        NULL,                   
        0,                      
        my_function,            
        NULL,                   
        0,                      
        &dwThreadIdArray[0]);   

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

    for(i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
    }
}

matlab を使用する場合、そのオプションに制限はありますか? 誰かがこのようなことを試しましたか?

編集: Parallel Toolbox を必要としないオプションはありますか?

4

4 に答える 4

6

mx* および mex* 関数は、MATLAB メイン スレッドからのみ呼び出すことができます。マルチスレッド MEX ファイルは、これらが mx インターフェイスより下のレベルで機能する場合に記述できます。複数の MATLAB インタープリターが必要な場合は、複数の MATLAB プロセスが必要です。1 つの方法は、@You が指摘した Parallel Computing Toolbox を使用することです。これにより、同時に実行するためのPARFORループとブロックが提供されます。SPMD

于 2011-07-20T11:06:18.490 に答える
3

などの MATLAB 組み込みのマルチスレッド機能を使用した方がよいでしょうparforfor実際、多くの MATLAB 関数は既にマルチスレッド化されている (行列演算を含む) ため、 を置き換える以外に自分で並列化する必要はありませんparfor。(一般に、whileループは並列化できません。)

于 2011-07-20T08:45:54.850 に答える
1

あなたの最良の選択肢はparforです。あなたが学生なら、かなり安い価格で並列ツールボックスを手に入れることができます。パフォーマンスを真剣に考えているなら、定価でさえそれほど多くはありません。上記のコードはエラーが発生しやすく、テストが困難です。使用parforは直感的でクリーンです。

于 2011-07-20T14:24:14.850 に答える
1

みんなが を推進していることに驚いていparforます。少なくとも、Matlab から呼び出されるようにアルゴリズムを設計し、mex にコールバックせずにマルチスレッド C/C++ からクリティカル セクションを低レベルで実行できるかどうかを検討することをお勧めします。これは一般的に可能です。特に、Matlabprofilerまたは同様のツールを使用して分析のどのステップがボトルネックであるかを把握する場合、マルチスレッド C で 1 つまたは 2 つのステップしか記述できない場合があります。

もう 1 つの方法は、Java で並列処理を記述することです。これは、Matlab から操作する方が簡単です。

チェックアウトしたいその他のオプションには、multicoreMatlab CentralまたはMatlabMPIライブラリへの提出が含まれます。どちらも少しぎこちなく、プロセス間の並列処理 (Matlab の複数のインスタンスを実行する必要があります) 用に設計されているため、非常にきめ細かく複雑な並列処理には適していません。しかし、単に仕事を 4 つ、8 つ、または 16 の部分に分割するだけなら、彼らは仕事をやり遂げるはずであり、少なくともmulticore妥当なコミュニティのサポートが必要です。まだ試しMatlabMPIていませんが、有望そうです。おまけとして、これらは複数のマシンで動作するはずですが、おそらく共有ネットワーク ファイルシステムが必要になります。

于 2011-08-26T18:13:53.313 に答える