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

时间:2017-01-06 14:47:28

标签: 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

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

1 个答案:

答案 0 :(得分:3)

use mpi_f08接口为不同的MPI句柄对象引入了不同的包装器类型。在mpif.huse mpi接口中,所有句柄都只是INTEGER s,use mpi_f08界面中有TYPE(MPI_Comm)TYPE(MPI_File)等。这允许编译器执行检查,例如传递期望文件句柄的通信器句柄。

这是源级别的重大变化,因为必须重写代码,例如,

INTEGER :: newcomm

变为

TYPE(MPI_Comm) :: newcomm

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