首页 > 解决方案 > 包含'mpif.h'时编译代码但切换到使用mpi时失败

问题描述

我正在尝试将 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)

标签: fortranmpigfortranopenmpi

解决方案


如评论中所示,发生的“问题”是因为您使用了模块而不是包含文件,所以接口现在在范围内,编译器现在可以检测到您正在尝试使用不正确的参数调用 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)

推荐阅读