3

我试图使用 MPI 并行化 Fortran 程序。我使用 CMake 来构建我的程序。在谷歌上很难找到支持让 CMake 为 Fortran 创建一个具有 MPI 支持的工作 makefile,但据我所知,我将以下命令添加到我的 CMakeLists.txt 脚本中:

find_package(MPI REQUIRED)
add_definitions(${MPI_Fortran_COMPILE_FLAGS})
include_directories(${MPI_Fortran_INCLUDE_DIRS})
link_directories(${MPI_FortranLIBRARY_DIRS})

这将在我的系统上找到 MPI,然后设置在以下三个命令中找到的变量。在我的链接行中,我将 MPI 库变量添加到我的程序需要构建的其他库的列表中。

target_link_libraries(${exe_name} otherlibs ${MPI_FortranLIBRARY_DIRS})

cmake然后make工作来构建程序并且程序运行;但是,当我尝试向需要包含mpif.h包含文件的源添加更多内容时,由于无法找到此头文件,我的编译失败。我也不能,因为编译器在路径中 use mpi找不到文件。mpi.mod

4

3 回答 3

2

我将“消息”命令插入到我的 CMakeLists.txt 文件中,并打印出我用于包含和链接的变量的值。事实证明,这些变量MPI_Fortran_INCLUDE_DIRSMPI_FortranLIBRARY_DIRS没有被设置为任何东西。检查 CMake 实际用于设置这些变量的模块 (FindMPI.cmake) 显示这些变量不存在。我更改了 CMakeLists.txt 文件以使用正确的变量:

find_package(MPI REQUIRED)
add_definitions(${MPI_Fortran_COMPILE_FLAGS})
include_directories(${MPI_Fortran_INCLUDE_PATH})
link_directories(${MPI_Fortran_LIBRARIES})
target_link_libraries(${exe_name} otherlibs ${MPI_Fortran_LIBRARIES})

现在当我执行时make,编译器可以同时mpif.h找到mpi.mod.

更新:

我想提一下,这个解决方案适用于 cmake 版本 2.8.10.1。当我将我的 CMakeLists.txt 脚本移动到具有 cmake 版本 2.8.4 的另一台机器上时,我mpi.mod在链接阶段收到关于丢失的相同错误。我检查了 FindMPI.cmake 模块,果然,没有指定语言的变量(即没有MPI_Fortran_LIBRARIES变量,只有一个MPI_LIBRARIES变量,并且该变量没有设置为该系统上 mpi 库的正确位置。所以这个解决方案将取决于 cmake 版本。

于 2013-05-04T14:55:50.673 回答
1

听起来您没有使用 mpi 编译器。这很好,但是你必须添加很多标志。没有真正的 mpi 编译器,而是一个设置标志以便能够使用 mpi 的包装器。使用 cmake,我可以通过定义我将在调用 cmake 之前使用的 fortran 编译器来做到这一点。这不是一个很好的解决方案,因为您失去了可移植性,但它确实有效。我正在尝试找到一个更好的解决方案并在 cmake 内部定义要使用的编译器,但一直无法这样做。换句话说,这对我有用:

    FC=mpif90 cmake ../.
    make

我遇到了和你一样的问题。希望这能解决问题。如果有人找到如何在 cmake 内部定义 fortran 编译器,请发布!

于 2013-09-10T11:40:38.083 回答
0

正如您已经注意到的那样,您拼错了两个变量的名称,MPI_Fortran_LIBRARIESMPI_Fortran_LIBRARIES

添加以下内容也很有用:

cmake_minimum_required(VERSION 2.8.10)

在 CMake 的最开始,以确保将定义这些变量。

于 2014-02-19T12:56:58.150 回答