2012-03-30 19 views
4

私はフローフィールドを解決するためのFORTRAN MPIコードを持っています。MPI-FORTRANのファイルIO

私はファイルからデータを読み込み、それを参加プロセスに配布したいと考えています。

データは、3次元配列(空間x、y、zの速度)から構成されています。

すべてのプロセスはアレイの一部のみを保存します。

したがって、すべてのプロセスがファイルを読み込もうとすると(私が考えると最も簡単な方法です)、プロセスが保持できる配列の数に対応するファイルの最初の部分。

MPI Bcastは3Dアレイでも使用できますか?しかし、その後は複雑になります。

もっと簡単な方法はありますか?

答えて

4

プラットフォームに応じて、広範に言えば、2つまたは3つの選択肢があります。

  1. 1つのプロセスが入力データを読み取り、それを他のプロセスに送信します。私はそれが集合的な操作であり、すべてのプロセスが参加しなければならないので、通常、このためにブロードキャストを使用しません。私は通常、各プロセスに必要な情報を送信します。都合の良いこと(メモリの問題ではない)なら、すべての入力データをすべてのプロセスに確実にブロードキャストすることができます。
  2. すべてのプロセスが必要とするデータを読み取ります。これには、入力ファイル全体を読み込み、必要な部分だけを保存するプロセスが必要です。しかし、非常に大きな入力ファイルがある場合は、必要な部分だけを各プロセスのメモリ空間に読み込むルーチンを書くことができます。このアプローチには、相対的な意味では遅いディスクアクセスのために競合するプロセスが含まれる可能性があります。大規模で長時間実行される並列計算を実行すると、すべてのプロセスがデータを取得する間に数秒待ってもオーバーヘッドはほとんどありません。
  3. パラレルファイルシステムを使用している場合は、MPIのパラレルI/Oルーチンを使用して、各プロセスが入力データの必要な部分だけを読み込むようにすることができます。
+0

は私が見ることができる第二の選択肢のためにそこに任意の例ですか? –

3

MPIで、このようなI/Oパターンの標準的な方法は、ランク0のデータを読む

  • のいずれかで、それを配布するためにMPI_Scatterを使用しています。または、メモリが逼迫している場合は、これをブロック単位で行うか、MPI_Scatterではなく1対1の通信を使用します。

  • MPI-I/Oを使用して、各ランクにデータファイルの独自のサブセットを読み込ませます(これはもちろん、ファイル全体を最初に読み取らずに境界を突き止めることができるファイルフォーマットを必要とします)。極端なスケーラビリティについて

は、一つは、2つのアプローチを組み合わせることができ、それはプロセスのサブセットである(例えば、親指の大まかなルールとしてSQRT(N))はMPI I/Oを使用し、各MPIプロセスがデータを送信しますそれ自身のIOプロセスに

3

優れたファイルシステム(Lustreなど)で1000未満のコアでコードを実行している場合は、各ランクでファイルを開き、必要なデータを読み込む(残りをスキップする)Fortran I/Oを使用してください。はい、数分かかりますが、開始時に一度だけファイルを読み込んでいます。

MPI I/O(バイナリのみ)は自明ではありません。通常、HDF5やParallel NetCDFなどの上位レベルのライブラリを使用する方がよいでしょう。パフォーマンスは、データがどのように読み取られるか(連続的か非連続的かなど)によって異なります。以下のリンクが役に立つかもしれ...

+0

HDF5またはParallel-NetCDFを提案していただきありがとうございます。今日、新しいコードでMPI-IOを直接使用する理由はめったにありません。 –

関連する問題