1

MPI の私のアプリケーションには、大きなデータを生成するプロセスがあります。N+1 プロセス (マスター コントロール用に 1 つ、その他はワーカー) があるとします。各ワーカー プロセスは大きなデータを生成し、ファイル 1、ファイル 2、...、ファイル N という名前の通常のファイルに単純に書き込みます。各ファイルのサイズはかなり異なる場合があります。次のジョブを実行するには、すべての fileM をランク M プロセスに送信する必要があります。これは、すべてのデータ転送と同じです。

私の問題は、MPI API を使用してこれらのファイルを効率的に送信する方法です。以前は Windows 共有フォルダーを使用してこれらを転送していましたが、それは良い考えではないと思います。

MPI_file と MPI_All_to_all について考えてみましたが、これらの関数は私の場合にはあまり適していないようです。単純な MPI_Send と MPI_Recv は、すべてのプロセスが大量のデータを転送する必要があるため、使用するのが難しいと思われます。分散ファイル システムは今のところ使用したくありません。

4

1 に答える 1

3

たくさんのデータ、つまりあなただけが今持っているデータがなければ、あなたの質問に正確に答えることはできません。したがって、ここにいくつかの一般性があります。それらについて考え、状況に適用するかどうか、およびどのように適用するかを確認する必要があります。

  • プロセスが大規模なデータセットを生成している場合、それらが即座に生成する可能性はほとんどありません。データセット全体が作成されるまで待つことを考える代わりに、チャンクごとにデータセットを転送することを検討することをお勧めします。
  • MPI_Sendと_Recv(またはそれらのバリエーション)を大量のデータに使用するのは難しいとは思いません。ただし、プロセス間の各通信で転送する適切な量を見つけることを検討する必要があります。MPIの場合、送信されるすべてのメッセージに適用されるメッセージの起動時間とメッセージ転送速度があるという単純なケースではありません。たとえば、一部のハードウェアでの一部のIBM実装では、小さいメッセージと大きいメッセージで待ち時間と帯域幅が異なります。ただし、プラットフォームの帯域幅と遅延のトレードオフを自分で理解する必要があります。ここで私が与える唯一の一般的なアドバイスは、メッセージサイズをパラメータ化し、計算と通信の比率が最大になるまで実験することです。
  • 余談ですが、すでに実行する必要のあるテストの1つは、プラットフォーム上のさまざまなサイズと通信パターンで測定されたメッセージ転送速度です。これは、新しいシステムで作業を開始するときの基本的なシェイクダウンテストの一種です。これ以上適切なものがない場合は、STREAMSベンチマークが開始に役立ちます。
  • 大量のデータを全面的に転送することは、MPIが一般的に使用される種類のプログラムでは珍しいシナリオだと思います。このような転送を回避するために、アプリケーションの再設計について真剣に検討することをお勧めします。もちろん、それが実現可能か価値があるかを知っているのはあなただけです。あなたが提供するわずかな情報から、あなたが何らかのパイプラインを実装しているように見えます。このような場合、通常の通信パターンは、プロセス0からプロセス1、プロセス1からプロセス2、2から3などです。
  • 最後に、共有メモリを備えたコンピュータ(マルチコアPCなど)で作業している場合は、大量のデータが渡されないように、OpenMPなどの共有メモリアプローチを使用することを検討してください。
于 2010-06-13T09:33:26.840 に答える