CUDA対応ビデオカード搭載の複数ホスト間でGPGPU ( その4: CUDA-aware 対応のため OpenMPI のコンパイル )
By Open MPI [BSD or Attribution], via Wikimedia Commons
目次
目的
以前、ubuntu(12.04) 4台で NFS にてファイル共有を行い、OpenMPI でホスト間通信させることで、Linuxクラスタ環境を構築しました。
そしてこのクラスタ環境の2ホスト上にCUDA対応ビデオカードを追加し、2ホスト間でGPGPUを行うことを目的として
CUDA対応ビデオカード配置と、前エントリでは対応するビデオカードドライバと CUDA Toolkit のインストールを行いました。
今回は表題の通り"CUDA-aware 対応のため OpenMPI のコンパイル" を行います。
実は "CUDA-aware" は同一ホスト上で複数GPUを利用する場合に、 "Unified Virtual Memory" を利用するために設定するもので、
本環境のGPUをそれぞれ積んだ複数ホスト間でGPGPUする場合は、GPU間で "Remote Direct Memory Access" できるはずがないので不要なのですが、
当時その意味を知らずにコンパイルを行いトラブルシュートした経緯があるので、その知見を記録するという目的で記事を残します。
方法
下記の OpenMPI の FAQ を参考にした。
FAQ: Building CUDA-aware Open MPI
OpenMPI のコンパイル
自分の環境特有のコンパイルオプションは下記です。
- mpicc のバックエンドには /opt 以下にある intel コンパイラを使う
- /opt 配下に openmpi をインストールする
- ジョブ管理に "sun grid engine" を使う
- OpenMPI の "CUDA-aware" を有効にする
管理者権限で下記を実行します。
wget http://www.open-mpi.org/software/ompi/v1.8/downloads/openmpi-1.8.2.tar.bz2 tar xjf openmpi-1.8.2.tar.bz2 cd openmpi-1.8.2 source /opt/intel/bin/compilervars.sh intel64 ./configure CC=icc CFLAGS=-m64 CXX=icpc CXXFLAGS=-m64 LDFLAGS="-shared-intel" --prefix=/opt/openmpi --with-sge --enable-mpi-thread-multiple --enable-mpirun-prefix-by-default --enable-mpi-interface-warning --with-wrapper-cflags=-m64 --with-wrapper-cxxflags=-m64 --with-cuda --disable-mpi-fortran make -j 4 make install
インストール後のコマンド実行も大丈夫そうです。
$ mpicc -v icc バージョン 14.0.1 (gcc バージョン 4.6.0 互換)
mpirun 実行時の "CUDA-aware support is disabled" エラー出力
各ノード間の CUDA Card 情報を収集して表示するプログラムを、下記サイトからコピーし利用しました。
Example MPI C / CUDA device query program | ClusterVision Service Portal
コンパイル後、下記のように実行するとエラー出力がありました。
$ mpirun -n 3 -host calc0,calc1,calc2 ./mpi4cuda.out -------------------------------------------------------------------------- The library attempted to open the following supporting CUDA libraries, but each of them failed. CUDA-aware support is disabled. libcuda.so.1: cannot open shared object file: No such file or directory libcuda.so.1: cannot open shared object file: No such file or directory -------------------------------------------------------------------------- We have 3 processors Spawning from calc0 CUDA MPI Probing nodes... Node Psid CUDA Cards (devID) ----------- ----- ---- ---------- + calc1 1 1 Tesla C1060 (0) + calc2 2 1 Quadro 4000 (0) [calc1:02049] 2 more processes have sent help message help-mpi-common-cuda.txt / dlopen failed [calc1:02049] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages
これは下記サイトを見ると、64-bit 用の libcuda.so.1 を見つけられないからのようで、
次のコマンド実行で解決しました。
http://www.open-mpi.org/community/lists/users/2015/03/26543.php
sudo rm /usr/lib/i386-linux-gnu/libcuda.so.1 sudo ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.346.46 /usr/lib/i386-linux-gnu/libcuda.so.1
結果
"CUDA-aware" 対応の "OpenMPI" コンパイルも成功し、利用時のエラー対応も行うことができた。
以上。