# GPU-Aware MPI
## 定義
GPUデバイスメモリ上のバッファを、標準MPI API(`MPI_Send`/`MPI_Recv`等)へホストメモリ上のバッファと同じように直接渡せるようにするMPIライブラリの設計方針。UVA(Unified Virtual Addressing)でバッファのメモリ種別(ホスト/デバイス)を判定し、MPIライブラリ内部でCPU-GPU間のデータ移動・バッファ管理・非連続データのpack/unpackを隠蔽することで、プログラマがCUDAとMPIの2つのプログラミングモデルを明示的に橋渡しする必要をなくす。
## 設計要素
- **メモリ種別の統一検出**: UVAによりMPI呼び出しごとに送受信バッファがホスト/デバイスいずれかを判定し、リクエスト単位でキャッシュする([[@2014__TPDS__GPU-Aware MPI on RDMA-Enabled Clusters - Design, Implementation and Evaluation]])。
- **連続データ通信**: デバイスメモリ上のバッファを、ホストメモリ上のステージングバッファ(vbuf)経由でRDMA転送する。GPUDirect RDMA環境ではこのホスト経由ステージングを省略できる([[GPUDirect RDMA]])。
- **非連続データ(派生データ型)対応**: MPI派生データ型(vector・subarray・struct等)をベクトル表現に変換し、GPUカーネルで一括pack/unpackすることで、非連続データもデバイスメモリ上で直接扱えるようにする。
- **非同期パイプライン**: データpack/unpack・PCIe転送・ネットワーク転送をブロック単位で重ね合わせ、通信全体のレイテンシを削減する。
## 未編纂の観察
[実装] MVAPICH2はGPU-Aware MPIの代表的な実装であり、UVAによるメモリ種別検出とホスト経由/GDR切り替えの双方を備える。GPUDirect RDMA非搭載環境では常にホスト経由パイプラインを使うが、GPUDirect RDMA搭載環境では小メッセージでGDRの低レイテンシ経路、大メッセージでホスト経由パイプラインを使い分ける実装が報告されている(Source: [[@2014__TPDS__GPU-Aware MPI on RDMA-Enabled Clusters - Design, Implementation and Evaluation]]、[[GPUDirect RDMA]])。
## 未解決の問い
- GPUDirect RDMAが標準搭載された環境で、本論文が提案する非連続データ用ベクトル化・パイプライン設計は、GDR単体の性能とどこまで整合的に組み合わさるか(著者ら自身が将来課題として言及)。
- ブロックサイズ等のチューニングパラメータは、GPU世代・PCIe世代・ネットワーク世代が変わるたびに再チューニングが必要か、自動チューニング手法は存在するか。
## 関連
- 概念: [[GPUDirect RDMA]]
- 概念: [[RDMA]]
- 概念: [[格子ボルツマン法]]
- エンティティ: [[MVAPICH2]]
- エンティティ: [[Hao Wang]]
- エンティティ: [[Dhabaleswar K. Panda]]
## 出典
- [[@2014__TPDS__GPU-Aware MPI on RDMA-Enabled Clusters - Design, Implementation and Evaluation]] — UVAベースのメモリ種別検出、ベクトル化アルゴリズム、非同期パイプライン設計を提案。