fortran - 包含'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)
解决方案
如评论中所示,发生的“问题”是因为您使用了模块而不是包含文件,所以接口现在在范围内,编译器现在可以检测到您正在尝试使用不正确的参数调用 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)
推荐阅读
- c# - MVVM WPF:根据所选项目从 DataGridComboBoxColumn 中删除元素
- forms - 当我单击输入登录表单时,应在 ionic 4 中提交
- python-3.x - 为什么在 Ubuntu 19.10 中安装 tensorflow-gpu 后 tensorflow 不工作?
- javascript - Material-table:是否可以默认打开detailsPanel?
- php - 试图获取非对象的属性“cover_image”(查看:C:\Users\BWB\Documents\Laravel\asperablogs\resources\views\blogs\blogs.blade.php)
- python - Pandas DataFrame 分组索引匹配列表 - 索引分别小于 list[i+1] 和大于 list[i]
- javascript - 带有 HTML 内容的 JSON 响应
- laravel - Laravel push 从模型和关系中获取所有更改
- python - 从 pandas 数据框中识别特征名称
- python - monkeypatch.setattr 不适用于请求调用