相关文章推荐
个性的小虾米  ·  python ...·  1 年前    · 
喝醉的骆驼  ·  cmake 编译 ...·  1 年前    · 

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