2011-03-19 7 views
1

私が使用しているシミュレーションパッケージのために、MPIを使用してパラレル化ルーチンを書き直そうとしています。私は特定の機能を実装しようとしており、問題を抱えています。私は何をしようとしているかを示す別の簡単な例を使って問題を説明します。MPIで何らかの「共有メモリ」を再現する

私は基本的にすべてのMPIスレッドが共有するカウンタを用意しようとしています。このカウンターが増分されるたびに、特定のスレッドはそれを他のユーザーにブロードキャストして、増分したいときに各スレッドが最新バージョンのカウンターを持つようにします。 OpenMPを共有メモリで使用すると簡単に実行できると理解していますが、スーパーコンピュータで500コアのシミュレーションなど、1つ以上のCPUでMPIを使用する方法があるかどうかは疑問です。

MPI_Bcast、MPI_Send、およびMPI_Recvのすべての組み合わせを考えましたが、私が正しく理解していない可能性があると思います。

+0

可能な複製:http://stackoverflow.com/questions/4948788/creating-a-counter-that-stays-synchronized-across-mpi-processes – suszterpatt

答えて

2

上記のMPI-1 APIではこれを行うことができません。しかし、MPI-2では、このようなことを可能にする「リモートメモリ操作」が可能です。私はMPI-2 bookとそのonline examplesCreating a counter that stays synchronized across MPI processesに基づいて、ここで非常に似た質問に答えました。「カウンタ増分」だけが実装されています。それは放送をしません。しかし、あなたは本当にそのような操作が必要ですか?それが必要なときにカウンターの価値をチェックするだけで他の仕事には十分ではないでしょうか?

+0

ありがとうございます。他のタスクがカウンタの値をチェックするのに十分なはずですが、実際には「繰り返し回数」が残っていますし、反復がない限り、各ジョブは10,000のチャンクを取得しますそのカウンターから。彼らが必要とするのは、反復が何回残っているのかを最新のものにする方法です。たとえば、ジョブクラッシュの場合(つまり、番号を分けるだけではない開始時に均等に反復処理を行い、それらの処理を行わせます)。私はリンクを見ていきます、もう一度ありがとう! – Marc

0

あなたはスキームを逆転できませんか?任意のスレッドがその値を必要とするとカウンタ値を要求できる専用の「カウンタサーバ」を作成します。

これは、すべてのシナリオに当てはまるとは限りません。

+0

私はおそらくこの方法が機能するかもしれないと思ったが、利用可能なコアの数私はコードを実行しているクラスター上ではかなり制限されているので、1つのコアを使用して何もせずにカウンターを追跡することが悪いと感じます。 – Marc

+0

カウンタにサービスを提供するのに多くのリソースが必要な場合を除き、通常の負荷とともにノード上で安全に実行できます。私が理解する限り、MPIは通常のOSを持つノード上で動作するので、カスタムプロセスを実行するだけで済みます。絶えず再接続しているTCPソケット経由でも単一の番号を提供することは十分効率的であり、多くのCPUを必要とすべきではありません。 – 9000

関連する問題