众所周知,在高性能程序中MPI是一种很普遍的模型。而当程序中调用CUDA程序时,GPU的内存要进行通信的时候,一般就要经过CPU,可能会造成不必要的性能开销。而CUDA-aware MPI可以避免这样的问题,在节点内的通信如下图所示:
在节点间的通信的加速如下图:
在这里先只谈CUDA-aware MPI的环境配置,使用的细节会在以后的博客中描述。
在目前流行的openmpi、mpich和intelmpi中,我选择了openmpi。根据 Building CUDA-aware Open MPI 中的流程,安装步骤如下:
配置依赖
集群使用的是spack包管理软件,并且预先装好了gcc、gdrcopy、cuda和numactl,用spack加载进环境。
1 2 3 4
| spack load gcc@7.5.0 spack load gdrcopy@1.3%gcc@7.5.0 spack load cuda@10.1.243%gcc@7.5.0 spack load numactl@2.0.14%gcc@7.5.0
|
编译安装ucx
根据文档我们安装的ucx应该支持gdrcopy。在安装的时候,我最开始使用gdrcopy 2.1,但是因为推荐版本的ucx较老,出现了接口和openmpi中代码不相匹配的问题,因此我找了一个较老的版本,避开了这个坑。安装过程如下:
1 2 3 4 5 6
| wget https://github.com/openucx/ucx/releases/download/v1.4.0/ucx-1.4.0.tar.gz tar zxvf ucx-1.4.0.tar.gz cd ucx-1.4.0 mkdir build ./configure --prefix=/your_path/ucx-1.4.0/build --with-cuda=/your-path/cuda --with-gdrcopy=/your-path/gdrcopy CFLAGS='-g -O3' CXXFLAGS='-g -O3' make -j && make install
|
然后编写将ucx写到环境变量的脚本ucx.sh,如下:
1 2 3 4 5 6 7 8 9 10
| spack load gcc@7.5.0 spack load gdrcopy@1.3%gcc@7.5.0 spack load cuda@10.1.243%gcc@7.5.0 spack load numactl@2.0.14%gcc@7.5.0
export ucx_home=/your-path/ucx-1.4.0 export PATH=$PATH:$ucx_home/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ucx_home/lib export LIBRARY_PATH=$LIBRARY_PATH:$ucx_home/lib export CPATHS=$CPATHS:$ucx_home/bin
|
需要使用ucx的时候对脚本使用source命令即可。
编译安装openmpi with CUDA-aware
在这里我选择了3.1.6版本的openmpi,安装过程如下:
1 2 3 4 5 6
| wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.6.tar.gz tar -vxzf openmpi-3.1.6.tar.gz cd openmpi-3.1.6 mkdir build ./configure --prefix=/your-path/openmpi-3.1.6/build --with-cuda=/your-path/cuda --with-ucx=/your-path/ucx-1.4.0/build CCFLAGS='-g -O3' CXXFLAGS='-g -O3' FCFLAGS='-g -O3' make -j && make install
|
编写环境脚本openmpi.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13
| source /your-path/ucx.sh
export mpidir=/your-path/openmpi-3.1.6/build export PATH=$PATH:$mpidir/bin export CPATH=$CPATH:$mpidir/include export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$mpidir/lib export LIBRARY_PATH=$LIBRARY_PATH:$mpidir/lib export MPI_BIN=$MPI_BIN:$mpidir/bin export MPI_INCLUDE=$MPI_INCLUDE:$mpidir/include export MPI_LIB=$MPI_LIB:$mpidir/lib export MPI_HOME=$mpidir export MANPATH=$MANPATH:$mpidir/share/man export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$mpidir/lib/pkgconfig
|
只要source openmpi.sh即可。
用
1
| ompi_info --parsable --all | grep mpi_built_with_cuda_support:value
|
查看,如下:
说明安装的openmpi带有cuda-aware支持。