1990 年代半ば以降、MPI は分散メモリー型ハイパフォーマンス・コンピューティング (HPC) アプリケーションにおけるメッセージパッシングの業界標準となっています。高並列マルチコア・プロセッサーの出現により、MPI は共有メモリーシステム内のメッセージパッシングにも利用されています。
MPI ライブラリーの呼び出しにはオーバーヘッドが伴うため、マルチコアシステムで実行する純粋な MPI アプリケーションでは必要以上のオーバーヘッドが発生します。この回避策として、(Pthreads や OpenMP* などを使用して) MPI アプリケーションをマルチスレッド化して、ノードごとの MPI ランク数を減らすハイブリッド並列処理が採用されました。
ハイブリッド並列処理をサポートするため、MPI バージョン 2.1 でユーザー指定のスレッド・サポート・レベルでスレッド環境を初期化する MPI_INIT_THREAD
関数が追加されました。次の 4 レベルのスレッドサポートを利用できます。
MPI_THREAD_SINGLE
MPI_THREAD_FUNNELED
MPI_THREAD_SERIALIZED
MPI_THREAD_MULTIPLE
最初の 3 つのレベルには制約があり、スレッドが同時に MPI を呼び出すことを許可していません。MPI_THREAD_MULTIPLE
サポートレベルには制約がありませんが、スレッド間の内部同期によりパフォーマンスが低下するため、あまり使用されていません。
インテル® MPI ライブラリー 2019 で強化された機能の 1 つは、スケーラブル・エンドポイントとマルチエンドポイント (マルチ EP) です。この機能は、MPI_THREAD_MULTIPLE
サポートレベルで一部の機能制限はありますが、ハイブリッド・アプリケーションで優れたパフォーマンスを実現します1。マルチ EP の斬新な点は、MPI ランタイムで追加の同期を必要とせずに複数のスレッドを同時にアクティブにできることです。これにより、1 つの MPI ランクで複数のスレッドを使用してネットワーク帯域幅を飽和させることができ、ノードごとに複数のランクが不要になります。
この記事では、マルチ EP について説明し、インテル® MPI ライブラリーでマルチ EP 機能を使用する方法を紹介し、シンプルなベンチマークと実際のアプリケーションを使用して潜在的なパフォーマンス・ゲインを示します。
複数のエンドポイント
MPI エンドポイントは、MPI 通信の独立した実行をサポートするリソースのセットです2。エンドポイントは、MPI コミュニケーターのランクに対応します。ハイブリッド設定では、エンドポイントに複数のスレッドをアタッチすることが可能で、スレッドは対応するエンドポイントのリソースを使用して通信できます。これにより、通信用の複数のデータストリームが生成され、独立したハードウェア・コンテキストと並列に通信媒体を介して送信できます。その結果、アプリケーション・レイヤーからスレッド、MPI、OFI、およびハードウェア・レイヤーへロックなしでデータを送信できます (図 1)。
インテル® MPI ライブラリー 2019 でマルチ EP を使用する方法
マルチ EP を使用するために必要なコードと環境について考えてみましょう。ここでは、スレッド対応の MPI コードがすでに存在すると仮定します。マルチ EP は標準の MPI 機能ではないため、環境変数を設定して有効にする必要があります。
$ export I_MPI_THREAD_SPLIT=1