代码在包含 'mpif.h' 时编译但在切换到使用 mpi 时失败

Code get compiled when include 'mpif.h' but failed when switch to use mpi

我正在尝试将 mpi 用于我拥有的一些旧 Fortran 代码。编译代码时出现一些奇怪的错误。

Error: There is no specific subroutine for the generic 'mpi_type_indexed' at (1)

当我尝试在代码中切换到 'use mpi' 时。如果我使用“include 'mpif.h'”,则程序已编译并能够正确 运行。

我写了一个紧凑的例子来验证程序。代码和我的示例都是在 gcc/8.1.0 和 openmpi/3.1.2.

下编译的
program bt

use mpi

implicit none

!include 'mpif.h'

contains

subroutine read_me()
implicit none
integer :: my_n, my_disp, my_type
integer :: ierr

my_n = 2
my_disp = 4
call MPI_Type_indexed(1, my_n, my_disp, MPI_INTEGER, my_type, ierr)

end subroutine

end program

不带标志编译:mpif90 bt.F90

use mpi committed 和 include 'mpif.h' uncommitted,一切正常。 使用未提交的 mpi 并已提交包含 'mpif.h',我收到错误提示

bt.F90:23:67:

call MPI_Type_indexed(1, my_n, my_disp, MPI_INTEGER, my_type, ierr)
                                                               1
Error: There is no specific subroutine for the generic 'mpi_type_indexed' at (1)

如评论中所述,发生的 "problem" 是因为您使用了模块而不是包含文件,现在接口在范围内,编译器现在可以检测到您正在尝试使用不正确的参数调用 MPI_Type_indexed,因为第二个和第三个参数应该是数组 - 查看 https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report/node79.htm#Node79 以了解接口应该是什么。

看你的例子,原作者似乎假设标量和 1 元素数组是同一件事——事实并非如此,因为前者是等级 0 而后者是等级 1。我说这作为第一个参数指定数组应该有多大,在您的情况下它的值为 1。因此第二个和第三个参数应该是单个元素数组,而不是您拥有的标量。最简单的解决方案,因为这些参数是 Intent( In ),将它们放在方括号中充当数组构造函数

call MPI_Type_indexed(1, [ my_n ], [ my_disp ], MPI_INTEGER, my_type, ierr)