2011-01-03 3 views
1

ここでは、単一のマスターと多くの作業者で構成されるアプリケーションがあります。アプリケーションの要件は非常に単純です。作業者はいくつかのジョブを終了し、データをマスターに送信し、マスターはこれらのデータをファイルに別々に保管します。作業者側のMPI_Sendを使用してデータをマスタに送信するだけで済みます。しかし、マスターはデータ送信シーケンスを知らない。一部の労働者は速く、一部は遅い。より具体的には、5人の労働者が存在すると仮定すると、データ送信順序は1,3,4,5,2または2,5,4,1,3であり得る。私がデータを得るためにMPI_Recvでマスタ側にfor(i = 1〜5)のようなforループを書くと、マスターとより速い作業者が長時間待たなければなりません。私はMPI_Gatherがこれを実装できることを知っています。しかし、私はMPI_Gatherが並行して動作するのか、MPI_Recvのいくつかの連続した呼び出しだけで動作するのかどうか分かりません。もう1つの問題は、私のデータが非常に大きく、1GB以上のデータをマスタに送る必要があることです。データをトランクに分割すると、複雑になる可能性があります。私はMPI_Gatherがうまくいくとは思わない。私もrawソケットプログラミングについて考えようとしましたが、それは良い方法ではないと思います。私にいくつかの提案をお願いしますか?多くの作業者から大量のデータ収集を実装するためのMPIプログラミング

答えて

2

私があなたの質問を正しく理解したら、データをマスターに戻したいが、各タスクが完了するのに異なる時間がかかるので、すべてのプロセッサを順番にループしたくないプロセス5の受信(完了している場合)はプロセス3(まだ実行中)からの受信を待機していません。

メッセージを送信するプロセッサのランクとして、MPI_ANY_SOURCE定数を使用して、mpi_recvを使用することができます。返されたステータスを検査して、どのプロセッサがメッセージを送信してより多くの作業を送信するかを判断することができます。すべてのプロセッサーをループするのではなく、ワークループ内に単一のreceiveステートメントを置くだけです。

+0

'MPI_ANY_SOURCE'では+1が最も簡単な解決策です。あるいは、マスター側で5つの非同期受信( 'MPI_Irecv')を使用し、ときにはそれらをポーリングして完了したかどうかを確認することができますが、実際には' MPI_ANY_SOURCE'を使用します。 – suszterpatt

+0

あなたが正しいです - 私が非同期受信で持っているもう一つの問題は、それがあなたの意図を不明瞭にすることです。あなたが本当に心配しているのは*どこかからメッセージを受け取っていて、 'mpi_any_source'はそのことを強調しています。 –

+0

こんにちはティム、あなたの答えをありがとう。私は数日間MPI_Waitanyを使うのに苦労しました。さて、私はMPI_ANY_SOURCEでMPI_Recvを使用することもかなり簡単だと思います。 – Xiao

0

作業員はデータをマスターに返送する代わりにファイルを書き出すことができますか?作業者が終了すると、マスターに「完了しました」というメッセージを送信することができます。マスターは次に、次の仕事のチャンクをそのワーカーに送ることができます。手渡されていない作業がない場合、マスタに作業者に「これ以上の作業」メッセージを送信させ、MPI Finalizeを呼び出すことができます。

関連する問題