5

次の問題があります。

プログラム 1 には、たとえば 10GB という膨大な量のデータがあります。問題のデータは、大きな整数配列と倍精度配列で構成されています。プログラム 2 には、このデータのタイルを使用して結果を計算する 1..n MPI プロセスがあります。

プログラム 1 から MPI プロセスにデータを送信するにはどうすればよいですか?

ファイル I/O を使用することは論外です。計算ノードには十分な RAM があります。

4

4 に答える 4

5

MPI の実装によっては、同じ MPI ジョブで複数の異なるプログラムを実行できるはずです。たとえば、OpenMPI を使用して実行できます

 mpirun -n 1 big_program : -n 20 little_program

MPI_COMM_WORLD を使用して両方のプログラムにアクセスできるはずです。そこから、通常の MPI 関数を使用して、大きなプログラムから小さなプログラムにデータを渡すことができます。

于 2010-05-23T15:03:06.833 に答える
1

あなたの説明によると、「プログラム 1」は MPI アプリケーションではなく、「プログラム 2」は MPI アプリケーションです。ソリューションへの最短パスは、2 つのプログラム間でソケットを開き、その方法でデータを送信することです。この場合、「プログラム 1」を MPI プログラムに変更する必要はありません。「プログラム 1」と「プログラム 2 : ランク 0」の間のソケットから始めます。ランク 0 は残りのランクにデータを配布します。

これまでのいくつかの提案では、考えられる解決策の 1 つとして、異種の実行可能ファイルのセットを起動することが含まれていました。1 つの MPI ジョブ内のすべてのランクが同じ実行可能ファイルである必要はありません。これには、両方の実行可能ファイルが「MPI プログラム」である必要があります (たとえば、少なくとも MPI_Init と MPI_Finalize 呼び出しを含む)。「プログラム 1」に必要な変更のレベルと、MPI 環境外で実行できないことにより、このオプションは魅力的でなくなる可能性があります。

サポートを提供する商用実装を使用している場合を除き、「動的プロセス」アプローチは避けることをお勧めします。接続/受け入れのサポートは、MPI のオープン ソース実装ではむらがある傾向があります。「うまくいく」かもしれませんが、うまくいかない場合は技術的なサポートを受けることができます。

于 2010-05-25T14:02:34.523 に答える
1

1 つの答えは、2 つのプログラムを別々のコミュニケーターに常駐させることです。単一の実行可能ファイルは、MPI-2 の動的プロセス管理を利用して両方のアプリ セットを起動でき、「プロデューサー」プログラムは MPI_COMM_WORLD を介して「コンシューマー」アプリケーションと通信します。その後、消費者アプリのすべての IPC は、プロデューサー部分を除外したサブコミュニケーター内で実行する必要があります。ただし、これは MPI_COMM_WORLD への直接呼び出しを避けるように書き直すことを意味します。

于 2010-05-23T15:13:07.043 に答える
0

ソケットと MPI を混在させるのは得策ではありません。これを実現する最も簡単な方法は、プロセス 1 とプロセス 2 の両方を単一の MPI アプリケーションに移動することです。

これを実装する最善の方法は、MPMD または Multi-Program Multi-Data と呼ばれるプログラミング モデルを使用することです。名前が示すように、MPI アプリケーションには、複数のデータを操作する複数のプログラムがあります。プログラム 1 が MPI アプリケーションでなくても、あまり多くの変更を加える必要はありません。MPI_Init を呼び出して、送信/受信データのルーチンを追加するだけです。これは、Prg1 がマスターで、残りがマスターから処理するデータを取得するスレーブである一種のマスター/スレーブ モデルと考えることができます。

別の方法として、プログラム 1 をプログラム 2 と同じにすることでワーカーのプールを実装し、全員がデータ ファイルの一部を読み取って作業を開始することもできます。しかし、ファイル IO を除外したので、prog2-n は実行時にファイルにアクセスできないと思います。マスタースレーブは、ニーズに最適です。

于 2011-03-04T15:18:12.100 に答える