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

时间:2019-04-14 15:19:28

标签: fortran mpi gfortran openmpi

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

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

当我尝试在代码中切换为“使用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

在使用mpi的情况下提交并包括未提交的“ mpif.h”,一切正常。 取消使用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)

1 个答案:

答案 0 :(得分:0)

如注释中所示,发生的“问题”是因为您使用了模块而不是包含文件,所以现在范围内是一个接口,并且编译器现在可以检测到您正在尝试以错误的方式调用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)