使用CMake构建MPICH

时间:2017-12-17 23:32:48

标签: cmake mpich

我需要强制 Cmake 使用 MPICH 构建和链接我的MPI代码。我的MPICH是使用Ubuntu软件包管理器在标准位置/usr/lib/mpich/安装的。但是,CMake仍然会查找我不使用的 OpenMPI 库。 如何指示CMake寻找MPICH?

下面,您可以看到一些基本诊断的输出:

$ whereis openmpi
openmpi:

$ whereis mpich
mpich: /usr/lib/mpich /usr/include/mpich

$ mpicc -v
mpicc for MPICH version 3.2

下面,我还提供了Cmake脚本以及我从cmake和 mpirun.mpich 获得的错误。我的Cmake是3.5.1,我在Ubuntu Xenial 16.04上运行。

cmake_minimum_required(VERSION 3.0)

message (STATUS "Adding mpiService")

find_package(MPI REQUIRED)

set(CMAKE_C_COMPILER mpicc)
set(CMAKE_CXX_COMPILER mpicxx)
set(MPI_GUESS_LIBRARY_NAME MPICH2)

message(STATUS ${MPI_INCLUDE_PATH}) 
message(STATUS ${MPI_C_LIBRARIES}) 

#add_definitions(-DOMPI_SKIP_MPICXX)

add_executable(mpiService main.cpp)

set(CMAKE_VERBOSE_MAKEFILE ON)

include_directories(SYSTEM ${MPI_INCLUDE_PATH})

target_link_libraries(
    mpiService
    PRIVATE
    ${MPI_C_LIBRARIES}
    )

从Cmake STATUS我得到以下输出:

/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include/usr/lib/openmpi/include/usr/lib/openmpi/include/openmpi
/usr/lib/openmpi/lib/libmpi.so

当我运行二进制文件时,我得到以下内容:

ubuntu@node1:~$ mpirun.mpich -np 2 --host node1,node2 mpiService
mpiService: error while loading shared libraries: libmpi.so.12: cannot open shared object file: No such file or directory
mpiService: error while loading shared libraries: libmpi.so.12: cannot open shared object file: No such file or directory

2 个答案:

答案 0 :(得分:1)

  

我如何指示CMake寻找MPICH?

根据FindMPI documentation,您可以将MPI_<lang>_COMPILER变量设置为所需的MPI编译器:

  

将MPI_&lt; lang&gt; _COMPILER设置为您的MPI包装器(mpicc等)      选择和重新配置。 FindMPI将尝试确定所有      使用THAT编译器的编译和链接标志的必要变量。

set(MPI_CXX_COMPILER <path-to-mpich-compiler>)
find_package(MPI REQUIRED)

或者,由于CMake version 3.10,因此可以设置变量MPI_EXECUTABLE_SUFFIX

  

附加到所有正在查找的名称的后缀。例如,您可以将此设置为.mpich或.openmpi以优先选择Debian及其衍生产品中的一个。

set(MPI_EXECUTABLE_SUFFIX ".mpich")
find_package(MPI REQUIRED)

答案 1 :(得分:0)

这是我目前的解决方案。

find_package(MPI REQUIRED)

# ----------------
# This is the only thing that made it work
# ----------------
set(MPI_C_LIBRARIES "/usr/lib/mpich/lib/libmpich.so")
set(MPI_INCLUDE_PATH "/usr/include/mpich")
# ----------------

add_executable(mpiService main.cpp)

include_directories(SYSTEM ${MPI_INCLUDE_PATH})

target_link_libraries(
    mpiService
    ${MPI_C_LIBRARIES}
    )

我个人不喜欢这个解决方案,因为我必须明确指定路径。任何其他提议的解决方案仍然使用OpenMPI构建。如果我找到更好的选择,我会重新发布。