16

私の研究のためにいくつかの小さなバイオインフォマティクスプログラムの Rust 実装を作成しようとしています。私の主な考慮事項の 1 つはパフォーマンスです。qsub を使用して Rust プログラムをグリッド上で実行するようにスケジュールできることはわかっていますが、アクセスできるクラスターは Oracle の GridEngine を使用しています。 MPI は直接 Rust プログラムのパフォーマンスの問題を引き起こします。

MPI ライブラリを使用せずにプログラムをスケジュールすると、パフォーマンスが大幅に低下しますか? Rust で MPI ライブラリを使用する必要がありますか? その場合、Rust 用の既知の MPI ライブラリはありますか? 1 つ探しましたが、何も見つかりませんでした。

4

2 に答える 2

20

私はいくつかのスーパーコンピューティング設備を使用しており (私は天体物理学者です)、同じ問題に直面することがよくありました: C/C++ はよく知っていますが、他の言語を使用することを好みます。

一般に、MPI 以外のアプローチでも問題ありませんが、そのようなスーパーコンピューターには、クラスターに統合された特定のハードウェアに合わせて調整された、高度に最適化された MPI ライブラリがあることが多いことを考慮してください。MPI を使用しない場合に Rust プログラムのパフォーマンスがどの程度影響を受けるかを判断するのは困難ですが、最も安全な方法は、クラスターで提供される MPI 実装を使用することです。

MPI ライブラリのような C ライブラリの周りに Rust ラッパーを使用しても、パフォーマンスの低下はありません。ボトルネックは、追加の関数呼び出しの無視できるコストではなく、ノード間でデータを転送するのに必要な時間 (たとえば、MPI_Send 経由) にあるためです。(さらに、これは Rust には当てはまりません: 既に上で述べたように、追加の関数呼び出しはありません。)

ただし、Rust が提供する非常に優れた FFI にもかかわらず、MPI バインディングを作成するのは簡単ではありません。問題は、MPI がライブラリではなく仕様であるという事実にあります。一般的な MPI ライブラリは、OpenMPI ( http://www.open-mpi.org ) と MPICH ( http://www.mpich.org ) です。それぞれは標準を実装する方法がわずかに異なり、通常は C プリプロセッサ マクロを使用してそのような違いをカバーしています。複雑なマクロを扱える FFI はほとんどありません。Rust がここでどのように評価するかはわかりません。

例として、Free Pascal で MPI プログラムを実装していますが、使用しているクラスターが独自の MPI を提供するため、既存の MPICH バインディング ( http://wiki.lazarus.freepascal.org/MPICH ) を使用できません。ライブラリであり、私は上記の理由からこれを使用することを好みます。MPI_BYTE のような定数はハードコードされた整数定数であると想定していたため、MPICH バインディングを再利用できませんでした。しかし、私の場合、それらは MPI_Init が呼び出されたときに作成されるように見える不透明な構造へのポインターです。

Julia の MPI へのバインディング ( https://github.com/lcw/MPI.jl ) は、インストール中に C および Fortran プログラムを実行して、そのような定数の正しい値を使用して Julia コードを生成することで、この問題を解決します。例を参照してください https://github.com/lcw/MPI.jl/blob/master/deps/make_f_const.f

私の場合、ミドルウェア、つまり、より「予測可能な」インターフェイスで MPI 呼び出しをラップする小さな C ライブラリを実装することを好みました。(これは多かれ少なかれ、Python と Ocaml のバインディングでも行われていることです。https: //forge.ocamlcore.org/projects/ocamlmpi/と http://mpi4py.scipy.org を参照してください。)問題はありません。

于 2014-08-29T19:53:32.330 に答える