heyheytower

日々のメモです。誰かのお役に立てれば幸いです。

CUDA対応ビデオカード搭載の複数ホスト間でGPGPU ( その4: CUDA-aware 対応のため OpenMPI のコンパイル )

Open_MPI_logo.png
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" コンパイルも成功し、利用時のエラー対応も行うことができた。

以上。