编译CUDA-aware MPI

众所周知,在高性能程序中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支持。