CUDA-aware OpenMPIのビルド
OpenMPIはCUDA-awareをサポートしている。 すなわち、集団通信実行の際に、(ホストメモリでなく)CUDA上のメモリポインタを渡してもそのまま動作するというもの。
https://www.open-mpi.org/faq/?category=runcuda#mpi-cuda-aware-support のコードを実行することで、自身のOpenMPIがCUDA-awareをサポートしているかを確認できる。
OpenMPIのビルド
自身でCUDA-awareサポートのOpenMPIをビルドする場合は
./configure実行時に次のオプションを追加する。
- --with-cuda (=/usr/local/cuda)
- --with-cuda-libdir=/usr/local/cuda/lib64/stubs
二つ目のオプションはなんでstubs?となるが、こうしないとうまくMPIがCUDA-awareであると認識してもらえない。チェックコードを実行してThis MPI library does not have CUDA-aware support という結果になったり、ompi_info --parsable --all | grep mpi_built_with_cuda_support:valueの出力がfalseになったりする。
参考:
このstubsはリンク用のダミーであり、実行時には用いないこと。
UCXとUCCのビルド
UCXやUCCもCUDA対応させたい場合は、こちらもconfigureのオプションにcudaを追加する。
-- with-cuda (=/usr/local/cuda)
UCCでは
--with-nvcc-gencode
でビルドするNVIDIA GPUのアーキテクチャを指定できる。例: --with-nvcc-gencode="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_70,code=compute_70 -gencode=arch=compute_80,code=sm_80 -gencode=arch=compute_80,code=compute_80"
テスト
CUDA対応できているか次のプログラムでテストする。
- テストプログラム: test_ucc_cuda.c · GitHub
- コンパイル: Makefile · GitHub
出力のCOLL_SCORE_MAPに次のようにCuda メモリの欄があることを確認する。
ucc_team.c:471 UCC INFO ===== COLL_SCORE_MAP (team_id 0, size 1) =====
ucc_coll_score_map.c:206 UCC INFO Allgather:
ucc_coll_score_map.c:206 UCC INFO Host: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO Cuda: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO CudaManaged: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO Rocm: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO RocmManaged: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO Allgatherv:
ucc_coll_score_map.c:206 UCC INFO Host: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO Cuda: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO CudaManaged: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO Rocm: {0..inf}:TL_SELF:10
ucc_coll_score_map.c:206 UCC INFO RocmManaged: {0..inf}:TL_SELF:10
...
...
ucc_team.c:474 UCC INFO ================================================