在Fortran中处理MPI通信器的正确方法是什么?

Tar*_*rek 5 fortran mpi openmpi

我读到建议使用MPI模块而不是包含mpif.h文件。但是,出现以下错误

错误:通用的“ mpi_comm_split”没有特定的子例程

当我运行这个程序

program hello_world
  use mpi_f08
  implicit none
  ! include 'mpif.h'
  integer :: ierr, num_procs, my_id,newcomm
  integer :: color,key

  call MPI_INIT ( ierr )
  color =1; key=0
  call MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr)
  call MPI_COMM_SIZE (MPI_COMM_WORLD, num_procs, ierr)

  call MPI_Comm_split(MPI_COMM_WORLD, color,key,newcomm, ierr)

  call MPI_FINALIZE ( ierr )

end
Run Code Online (Sandbox Code Playgroud)

如果我包含“ mpif.h”而不是使用MPI模块,则错误消失。这是为什么?

Hri*_*iev 5

use mpi_f08接口为不同的MPI句柄对象引入了不同的包装器类型。虽然mpif.huse mpi接口的所有手柄只需INTEGER秒,在use mpi_f08接口有TYPE(MPI_Comm)TYPE(MPI_File)等等。这使编译器执行的东西像检查合格的传播者处理情况的文件句柄的预期。

这是源代码级的重大更改,因为必须重写代码,例如,

INTEGER :: newcomm
Run Code Online (Sandbox Code Playgroud)

变成

TYPE(MPI_Comm) :: newcomm
Run Code Online (Sandbox Code Playgroud)

在二进制级别上没有变化,因为所有这些MPI_Xyz类型都只是INTEGER包装在TYPE说明符中,这使它们在布局上兼容。旧的Fortran代码仍然可以与现代的Fortran代码交换MPI句柄,反之亦然- INTEGER可以通过设置或提取句柄值newcomm%MPI_VAL

  • MPI_DOUBLE对应于C / C ++ double类型。不能在Fortran代码中使用它。使用`MPI_REAL`或`x`和`y`的任何类型(`MPI_DOUBLE_PRECISION`等)。 (5认同)