更新:我遇到了问题,我不知道它是什么。我有一个MPI_INIT和MPI_FINALIZE测试程序。我有一个包含5个子程序的模块:3个子程序是相关的,独立于2个其他子程序。我想将测试程序中的MPI代码放入此模块中。我将MPI_INIT放在声明变量的模块中以及子例程之前。我使用相同的错误消息获取了一系列错误:
This statement must not appear in the specification part of a module
“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
或在每个子程序中?
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
我看到了解决方案1遵循粗粒原理的优点。如果程序调用子程序1,它是否也会在子程序外执行MPI代码?
答案 0 :(得分:6)
您应该在程序中初始化并完成一次MPI。调用MPI_Finalize后,不允许进行进一步的MPI操作。标准说:
MPI_FINALIZE返回后,除了MPI_GET_VERSION,MPI_GET_LIBRARY_VERSION,MPI_INITIALIZED,MPI_FINALIZED以及具有前缀MPI_T_的任何函数(在第14.3节中列出的具有此前缀的函数的约束内)之外,不会调用MPI例程(甚至不是MPI_INIT)。 4)。
(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
如果你想在程序开头做各种初始化工作,你当然可以将它组合在模块子程序中并在那里调用mpi_init。如果您为模块使用测试程序,请在那里使用mpi_init和mpi_finalize。 在一些子例程中调用mpi_init和mpi_finalize的示例可以在我们用来设置非常通用的env_module of the treelm library中找到。
如果有多个独立的程序,每个调用该模块的子程序多次,我应该把MPI函数和变量放在哪里?
你能改一下吗?我不明白。 MPI函数和变量应该在mpi模块中,如果你有多个独立程序调用它们,它们都必须“使用”mpi模块。独立程序也可以单独使用MPI_Init和MPI_Finalize。也许您可以发布一个简短的代码示例,您想要实现的目标以及您的问题。