MPI-IOを使わずにMPIのプログラムから書き出しを行う

MPI-IOは並列計算をともなうファイルIOに拡張性やパフォーマンスの向上を与える機能を持っていますが、MPI-IOを使わなくても並列計算のファイル処理を行うことができます。MPI-IOを使用しないことによりいくつかの制限やデメリットがありますが、実装にかかるコストは一番少なくなるので違いを知ったうえでの使い分けが重要になります。

MPIを用いたプログラムを通常のファイルIOで処理した際に考えられるデメリット

  • 出力ファイルをプロセスごとに用意する必要がある(プロセスごとに分割されたファイルが生成される)
  • 分割されたファイルをほかのプログラムで使用する場合は、分割されたファイルをくっつけるなどの前処理が必要なときがある
  • 並列計算で生成されたファイルを読み込む&再び処理を行う際は同じプロセス数で実行しないと整合性が取れない場合がある
  • ファイルが分割されていると、ファイルの数が膨大になり移動やコピーなどに手間がかかる可能性がある

コードを用いて考えてみる

Non-MPI Parallel I/O from an MPI programのコードについてここで紹介します。

以下のコードは任意の並列数で生成されたプロセスがそれぞれのプロセスごとにファイルを開き書き出しをするものです。

もちろん正常に動作はするのですが、一般的なマシンでは複数のプロセスが生成できても複数のハードディスクを持っていることはまれです(せいぜい2つか3つくらいでしょうか)。つまりプロセスによるディスクIOの取り合いが始まる可能性があります。これによりパフォーマンスが落ちる場合があります。

さらに詳しくいうと、ディスクIOへのアクセスはCPU内のキャッシュメモリやその他のメモリへのアクセスに比べて非常に遅いため、CPUから遠い場所にあるディスクへのアクセス回数をできるだけ少なくすること(なるべく長い連続的なデータを少ない回数でディスクに書き込むこと)がパフォーマンスの向上につながります。複数のプロセスがディスクIOを取り合っている状況だと、一度に書き込むデータの長さが小さくなり結果としてディスクアクセスの回数が増えることでパフォーマンスを落とす可能性あります。

プロセスの数だけハードディスクを用意するなどの改善方法はありますが、コードによってハードウェアの構成を変更する必要があるため、拡張性に問題が生じます。

まとめ

デメリットを理解したうえでの運用ができれば問題ないと思います。しかし、並列数を増やすとパフォーマンスに影響を与え、せっかく並列化したのに書き込みで詰まって遅くなるなんてこともありうるので、IOの並列化はMPIを運用する人は十分に検討すべき課題だと思います。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top