更新:我应该将MPI放在模块或模块的子程序中吗?

Pip*_*ppi 0 fortran mpi modulo subroutine

更新:我有问题,我不知道它是什么.我有一个MPI_INIT和MPI_FINALIZE测试程序.我有一个包含5个子程序的模块:3个子程序是相关的,独立于2个其他子程序.我想将测试程序中的MPI代码放入此模块中.我将MPI_INIT放在声明变量的模块中以及子例程之前.我使用相同的错误消息获取了一系列错误:

This statement must not appear in the specification part of a module
Run Code Online (Sandbox Code Playgroud)

"MPI_INIT和MPI_FINALIZE应该只调用一次"如何影响Fortran程序,模块和子程序?如果有多个独立的程序,每个调用该模块的子程序多次,我应该把MPI函数和变量放在哪里?

~~~~~~~~~我有一个包含一系列子程序的模块,其中包含我希望并行化的do循环.子例程是公共的,其他程序使用.我应该在子程序之外定义MPI:

module ...
call MPI_INIT
subroutine 1
... (MPI code)
subroutine 2
subroutine 3
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

或者在每个子程序里面?

module ...
subroutine 1
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 2
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 3
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

我认为遵循粗粒原理的优点是解决方案1.如果一个程序调用子程序1,它还会在子程序之外执行MPI代码吗?

har*_*dkl 6

您应该在程序中初始化并最终确定MPI一次.调用MPI_Finalize后,不允许进行进一步的MPI操作.标准说:

一旦MPI_FINALIZE返回,除了MPI_GET_VERSION,MPI_GET_LIBRARY_VERSION,MPI_INITIALIZED,MPI_FINALIZED以及具有前缀MPI_T_的任何函数(在第14.3.4节中列出的具有此前缀的函数的约束内)之外,不能调用MPI例程(甚至不是MPI_INIT).

(MPI3,p361,l25)MPI3 PDF

回复更新:不允许将可执行语句放入代码的声明部分.关键是,执行中只需要调用一次MPI_Init和MPI_Finalize就意味着这一点.您的应用程序可以读取类似的内容:

program mini
  use mpi
  implicit none
  integer :: iError
  call mpi_init(iError)
  call do_some_stuff()
  call mpi_finalize(iError)
end program mini
Run Code Online (Sandbox Code Playgroud)

如果你想在程序开头有各种初始化的东西,你当然可以将它组合在模块子程序中并在那里调用mpi_init.如果您为模块使用测试程序,请在那里使用mpi_init和mpi_finalize.在一些子例程中调用mpi_init和mpi_finalize的示例可以在treelm库env_module中找到,我们用它来设置非常通用的东西.

如果有多个独立的程序,每个调用该模块的子程序多次,我应该把MPI函数和变量放在哪里?

你能改写一下吗?我不明白.MPI函数和变量应该在mpi模块中,如果你有多个独立程序调用它们,它们都必须"使用"mpi模块.独立程序也可以单独使用MPI_Init和MPI_Finalize.也许您可以发布一个简短的代码示例,您想要实现的目标以及您的问题.