Ubuntu21.04+CMake+Modules切换运行OpenMPI库和MPICH库
有时候需要在同一系统下调用不同版本的并行库。这里使用环境变量管理工具Modules。
具体可见:
1、
在1的基础上,在ubuntu21.04系统上安装:
2、编译安装openmpi4.1.1
3、编译安装mpich4.0.a2
安装完毕后,有:
代码如下:
CMakeLists.txt:
cmake_minimum_required ( VERSION 3.15 )
project ( mpi_prj )
set ( PRJ_SRC_LIST )
set ( PRJ_HEADER_LIST )
set ( PRJ_LIBRARIES )
set ( PRJ_INCLUDE_DIRS )
set ( MPI_INCLUDE_DIRS "$ENV{MPI_HOME_INC}" CACHE PATH "path to mpi headers" )
set ( MPI_LIBRARIES "$ENV{MPI_HOME_LIB}" CACHE PATH "path to mpi library" )
file ( GLOB root_header_files "${CMAKE_CURRENT_SOURCE_DIR}/*.h" )
file ( GLOB root_src_files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" )
list ( APPEND PRJ_HEADER_LIST ${root_header_files} )
list ( APPEND PRJ_SRC_LIST ${root_src_files} )
list ( APPEND PRJ_INCLUDE_DIRS ${MPI_INCLUDE_DIRS} )
list ( APPEND PRJ_LIBRARIES ${MPI_LIBRARIES} )
add_executable ( ${PROJECT_NAME} ${PRJ_SRC_LIST} ${PRJ_HEADER_LIST} )
target_include_directories ( ${PROJECT_NAME}
PRIVATE
${PRJ_INCLUDE_DIRS}
target_compile_features ( ${PROJECT_NAME}
PUBLIC
cxx_std_20
target_link_libraries ( ${PROJECT_NAME}
PRIVATE
${PRJ_LIBRARIES}
main.cpp:
#include "mpi.h"
#include <iostream>
int main(int argc, char* argv[])
int rank, size, len;
char version[MPI_MAX_LIBRARY_VERSION_STRING];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Get_library_version(version, &len);
std::cout << "Hello, world! I am " << rank << " of " << size
<< "(" << version << ", " << len << ")" << std::endl;
MPI_Finalize();
return 0;
在ubuntu21.04下,使用命令 module avail
有:
使用 module load eric/openmpi-4.1.1
此时可以看到高亮显示loaded
cmake ../
cmake --build . --parallel 4
mpirun -np 2 ./mpi_prj
eric@ubuntu:~/work/mpi_work/helloworld/build$ mpirun -np 2 ./mpi_prj
Hello, world! I am 0 of 2(Open MPI v4.1.1, package: Open MPI eric@ubuntu Distribution, ident: 4.1.1, repo rev: v4.1.1, Apr 24, 2021, 106)
Hello, world! I am 1 of 2(Open MPI v4.1.1, package: Open MPI eric@ubuntu Distribution, ident: 4.1.1, repo rev: v4.1.1, Apr 24, 2021, 106)
这样通过上述步骤实施了openmpi-4.1.1 编译运行简单mpi代码。
下面测试mpich:
先清理:
使用 module load eric/mpich-4.0.a2
cmake ../
cmake --build . --parallel 4
此时有:
即:
eric@ubuntu:~/work/mpi_work/helloworld/build$ mpirun -np 2 ./mpi_prj
Hello, world! I am 0 of 2(MPICH Version: 4.0a2
MPICH Release date: Fri Jun 11 07:24:31 CDT 2021
MPICH ABI: 0:0:0
MPICH Device: ch4:ucx
MPICH configure: FFLAGS=-fallow-argument-mismatch --prefix=/home/eric/software/mpich/4.0.a2 --with-device=ch4:ucx
MPICH CC: gcc -O2
MPICH CXX: g++ -O2
MPICH F77: gfortran -fallow-argument-mismatch -O2
MPICH FC: gfortran -O2
, 341)
Hello, world! I am 1 of 2(MPICH Version: 4.0a2
MPICH Release date: Fri Jun 11 07:24:31 CDT 2021
MPICH ABI: 0:0:0
MPICH Device: ch4:ucx
MPICH configure: FFLAGS=-fallow-argument-mismatch --prefix=/home/eric/software/mpich/4.0.a2 --with-device=ch4:ucx
MPICH CC: gcc -O2
MPICH CXX: g++ -O2
MPICH F77: gfortran -fallow-argument-mismatch -O2
MPICH FC: gfortran -O2
, 341)
这样通过上述步骤实施了mpich4.0.a2编译运行简单mpi代码。
从而,实现了同一环境下,同一代码调用不同并行库的管理。
这里具体的modules文件如下:
openmpi-4.4.1
#%Module1.0
module-whatis "openmpi-4.1.1 modulefile"
set topdir "/home/eric/software/openmpi/4.1.1"
prepend-path PATH "${topdir}/bin"
setenv MPI_HOME_INC "${topdir}/include"
setenv MPI_HOME_LIB "${topdir}/lib/libmpi.so"
mpich-4.0.a2
#%Module1.0