Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 更新:我应该将MPI放入模块还是模块';什么是子程序?_Fortran_Mpi_Modulo_Subroutine - Fatal编程技术网

Fortran 更新:我应该将MPI放入模块还是模块';什么是子程序?

Fortran 更新:我应该将MPI放入模块还是模块';什么是子程序?,fortran,mpi,modulo,subroutine,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 “应该只调用一次MPI_INIT

更新:我有一个问题,我不知道它是什么。我有一个测试程序,它的主体中有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代码吗

您应该在程序中只初始化和完成一次MPI。调用MPI_Finalize后,不允许您执行进一步的MPI操作。标准上说:

一旦MPI_FINALIZE返回,就不能调用任何MPI例程(甚至不是MPI_INIT),除了MPI_GET_版本、MPI_GET_LIBRARY_版本、MPI_INITIALIZED、MPI_FINALIZED和任何前缀为MPI_T_的函数(在第14.3.4节列出的具有此前缀的函数的约束范围内)

(MPI3,p361,l25)

对更新的答复: 不允许将可执行语句放入代码的声明部分。关键是,在您的执行中应该只调用一次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的示例可以在中找到,例如在中,我们使用它来设置非常通用的东西

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


你能换个说法吗?我不明白。MPI函数和变量应该在MPI模块中,如果有多个独立的程序调用它们,它们都必须“使用”MPI模块。独立程序也可以让MPI_Init和MPI_各自完成。也许您可以发布一个简短的代码示例,说明您想要实现什么以及您的问题所在。

您应该在程序中只初始化和完成一次MPI。调用MPI_Finalize后,不允许您执行进一步的MPI操作。标准上说:

一旦MPI_FINALIZE返回,就不能调用任何MPI例程(甚至不是MPI_INIT),除了MPI_GET_版本、MPI_GET_LIBRARY_版本、MPI_INITIALIZED、MPI_FINALIZED和任何前缀为MPI_T_的函数(在第14.3.4节列出的具有此前缀的函数的约束范围内)

(MPI3,p361,l25)

对更新的答复: 不允许将可执行语句放入代码的声明部分。关键是,在您的执行中应该只调用一次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的示例可以在中找到,例如在中,我们使用它来设置非常通用的东西

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


你能换个说法吗?我不明白。MPI函数和变量应该在MPI模块中,如果有多个独立的程序调用它们,它们都必须“使用”MPI模块。独立程序也可以让MPI_Init和MPI_各自完成。也许您可以发布一个简短的代码示例,说明您想要实现什么以及您的问题所在。

是的,在主程序开始时初始化MPI,并在结束时完成。感谢您的回复!是的,在主程序开始时初始化MPI,并在结束时完成。感谢您的回复!MPI-3.0只有两个月的历史,目前没有MPI实现支持它。你最好在接下来的一年左右引用MPI-2.2:)更新了我的答案,试图涵盖你更新的问题。MPI-3.0只有两个月的历史,目前没有MPI实现支持它。接下来的一年左右,你最好引用MPI-2.2:)更新了我的答案,试图涵盖你更新的问题。