2011-07-24 4 views
0

私はCでMPIプログラムを使用しています。私はちょうど2つのプロセスに何かをさせ、残りは何もしないようにしたい。私がこれを行うことはできませんので、IDSは、プログラムのこの部分に達するであろう過程は不明である:MPIでコードを実行するプロセスを2つだけ取得する - コードセグメントに到達するプロセスはわからない

if(rank == 0 || rank == 1) { 
    // do something 
} 
// (else do nothing) 

ランク0とランク1のプロセスは、しかし、ここで到達しない可能性があります。私は少なくともが2つのプロセスがここに達することを知っています。

これはどのようにMPIで達成できますか?

多くの感謝:)。

+1

基本的な問題の詳細について教えてください。 1つのことをする2つ以上のプロセスが悪いのはなぜですか? 「余分な」プロセスがあるタスクを実行するための余分なコストは、それを回避するのに必要な同期コストよりも低い場合があります。 –

答えて

2

2つのプロセスを別々に開始し、そこに到達するようにコードを作成してから、ランク決定を使用する必要があります。

EDIT:1つのプロセスがそのコードのパッチに達したときにインクリメントされ、次のプロセスも同様になるような、すべてのプロセスにわたって共有された整数を作成し、ifの条件を使用してコードをマークします。共有整数は2未満です。

+0

それはできません!私は一定数のプロセスを開始します。彼らはすべて同じことをやり始め、段階的に分岐を開始してさまざまな選択をします。この分岐のために、私はどのプロセスがこの機能を得るのか分かりません。申し訳ありませんが良いアイデアが私の問題ではない。 – ale

+0

編集をチェックして、効果があるかどうか確認してください。 –

+0

http://stackoverflow.com/questions/4948788/creating-a-counter-that-stays-synchronized-across-mpi-processesへの回答には、このようなカウンタを実装するためのコードがあります。 –

2

「制御ランク」として0(またはランクn-1)を設定してください。このランクは、クリティカルセクションへの入力を制御する2つの魔法トークンを保持します。

MPI_ANY_SOURCEとしてください。クリティカルコードセクションに達したすべてのランクは、MPI_Sendがクリティカルセクションに到達したのでID自体に0をランク付けします。次に、ランク0はMPI_Send、クリティカルセクションのランクはMPI_Recvトークンになります。重要なコードに到達する最初の2つのランクには、「進む」トークンが送信されます。他のランクには "気にしない"トークンを送る。

実行の最後に、不一致のMPI_IRecvがあります。このMPI_Irecvは、MPI_Finalizeと入力する前にキャンセルすることができます。

関連する問題