2011-07-20 19 views
6

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

考え方は単純でした.Mlabファイル(.m)からMEXとしてコンパイルされたCファイルを呼び出し、そのCファイルから2つのスレッドを作成し、各スレッドから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を必要としないオプションはありますか?

+0

どのMATLABコードを並列化しようとしていますか? – You

+2

@rlbisbe:MEX APIはスレッドセーフではありません:http://www.mathworks.com/support/solutions/en/data/1-V3B5T/index.html?solution = 1-V3B5T – Amro

答えて

6

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

+0

Parallel Computing Toolboxを使用しないと、オプションがありますか? –

+1

@rlbisbe:OpenMPを使用した並列化されたコードの例です(spawnされたスレッドからMEX API関数を呼び出さない限り)。http://www.walkingrandomly.com/?p=1795(コメントもチェックしてください – Amro

3

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

+2

ParforにはMatlabパラレルツールボックスが必要ですが、Matlabのライセンスにはありません –

1

あなたの最善の選択肢はparforです。あなたが学生なら、かなり安価にパラレルツールボックスを手に入れることができます。たとえあなたがパフォーマンスについて真剣であれば、完全な価格ですらあまりありません。上記のコードはエラーが発生しやすく、テストするのが難しいでしょう。 parforを使用すると直感的でクリーンです。

+2

あなたの回答はあなたの回答と5時間前にどのように異なっていますか?あなたの答えを充実させてください。あなたが言っていることは、パラレルツールボックスが安いということなら、あなたの答えの下にコメントとして書かれているのが一番です。 – abcd

+0

笑、確かに、それはあなたやエドリックの答えとあまり変わらない。それを指摘してくれてありがとう。 –

1

私は誰もがparforを押しているのに驚いています。 Matlabから呼び出されるようにアルゴリズムを設計し、mexにコールバックせずにマルチスレッドのC/C++からクリティカルセクションを低レベルで実行できるかどうかを少なくとも考えてください。これは一般に可能であるべきである。特に、Matlab profilerなどのツールを使用して分析のどのステップでボトルネックが発生しているのかを把握するには、マルチスレッドCに1ステップまたは2ステップしか書き込めない場合があります。

もう1つの方法は、 Matlabからの作業が容易なJavaの並列処理

チェックアウトしたいその他のオプションは、multicore submission on Matlab CentralまたはMatlabMPI libraryです。どちらも少し不器用で、プロセス間の並列処理(Matlabの複数のインスタンスを実行する必要があります)のために設計されているため、非常にきめ細かで複雑な並列処理には向いていません。しかし、単純に仕事を4または8または16パートに分割すると、彼らは仕事を完了すべきであり、少なくともmulticoreは合理的なコミュニティサポートを持っています。私はMatlabMPIまだ試していないが、それは有望に見えます。ボーナスとして、これらは複数のマシンで動作するはずですが、おそらく共有ネットワークファイルシステムが必要になります。

関連する問題