在 Fortran 中处理 MPI 通信器的正确方法是什么?
What is the proper way to handle MPI communicators in Fortran?
我读到建议使用 MPI 模块而不是包含 mpif.h 文件。但是,我收到以下错误
Error: There is no specific subroutine for the generic ‘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 模块,错误就会消失。这是为什么?
use mpi_f08
接口为不同的 MPI 句柄对象引入了不同的包装器类型。在mpif.h
和use mpi
接口中,所有句柄都是简单的INTEGER
,而在use mpi_f08
接口中,有TYPE(MPI_Comm)
、TYPE(MPI_File)
等。这允许编译器执行检查,例如在需要文件句柄的地方传递通信器句柄。
这是源代码级别的重大更改,因为必须重写代码,例如,
INTEGER :: newcomm
变成
TYPE(MPI_Comm) :: newcomm
在二进制级别没有变化,因为所有这些 MPI_Xyz
类型只是包裹在 TYPE
说明符中的 INTEGER
,这使它们的布局兼容。旧的 Fortran 代码仍然可以与现代 Fortran 代码交换 MPI 句柄,反之亦然 - INTEGER
句柄值可以通过 newcomm%MPI_VAL
.
设置或提取
我读到建议使用 MPI 模块而不是包含 mpif.h 文件。但是,我收到以下错误
Error: There is no specific subroutine for the generic ‘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 模块,错误就会消失。这是为什么?
use mpi_f08
接口为不同的 MPI 句柄对象引入了不同的包装器类型。在mpif.h
和use mpi
接口中,所有句柄都是简单的INTEGER
,而在use mpi_f08
接口中,有TYPE(MPI_Comm)
、TYPE(MPI_File)
等。这允许编译器执行检查,例如在需要文件句柄的地方传递通信器句柄。
这是源代码级别的重大更改,因为必须重写代码,例如,
INTEGER :: newcomm
变成
TYPE(MPI_Comm) :: newcomm
在二进制级别没有变化,因为所有这些 MPI_Xyz
类型只是包裹在 TYPE
说明符中的 INTEGER
,这使它们的布局兼容。旧的 Fortran 代码仍然可以与现代 Fortran 代码交换 MPI 句柄,反之亦然 - INTEGER
句柄值可以通过 newcomm%MPI_VAL
.