Performance 使用子程序在fortran程序之间交换数据

Performance 使用子程序在fortran程序之间交换数据,performance,fortran,subroutine,Performance,Fortran,Subroutine,我有两个独立的(大型)fortran程序,需要在它们之间来回交换数据。它们是环境模拟器(我们称它们为A和B),在模拟完成之前,每一步都需要交换几个数组的数据。我提出的解决方案是将B转换成一个子程序,a每次调用该子程序,数据通过参数传递。因为B太大了,所以每次初始化都很慢 有没有一种方法可以将B保存在内存中,这样a就不会每次都将所有内容加载回内存?是否有其他方法使子程序调用不那么慢 有没有一种更有效的方法可以在独立的fortran程序之间以同步方式交换数据而无需子程序?除了MPI方法,您还可以设计

我有两个独立的(大型)fortran程序,需要在它们之间来回交换数据。它们是环境模拟器(我们称它们为A和B),在模拟完成之前,每一步都需要交换几个数组的数据。我提出的解决方案是将B转换成一个子程序,a每次调用该子程序,数据通过参数传递。因为B太大了,所以每次初始化都很慢

有没有一种方法可以将B保存在内存中,这样a就不会每次都将所有内容加载回内存?是否有其他方法使子程序调用不那么慢


有没有一种更有效的方法可以在独立的fortran程序之间以同步方式交换数据而无需子程序?

除了MPI方法,您还可以设计一个对象(派生类型),其中包含程序B需要知道的所有变量,以便在调用之间记住其状态。然后,您应该将程序B的功能划分为三个例程:

  • 初始化例程(在中的第一个时间步之前调用)
  • 主例程(在A中的每个时间步调用)
  • 可选:销毁(在中的最后一个时间步骤后调用)
每次从程序A调用这些例程中的任何一个时,都会向它们传递带有变量的派生类型。在第一次调用中,它们被初始化,在随后的调用中使用它们

所以程序A看起来像:

type(bdata) :: myb
...
call initialize_b(myb)
do ii = 1, ntimesteps
  ...
  call main_b(myb, data)
  ...
end do
call destruct_b(myb)
类型
bdata
必须包含程序B需要记住的所有内容,例如:

type :: bdata
  integer, allocatable :: whatever(:)
  ...
end type bdata
模块中具有程序B功能的例程如下:

!> First initialization of B (slow).
subroutine initialize_b(myb)
  type(bdata), intent(out) :: myb
  ...
end subroutine initialize_b


!> Process data comming from program A.
subroutine main_b(myb, data)
  type(bdata), intent(inout) :: myb
  ...
end subroutine main_b

如果您只需要程序B的一个实例,那么您可以通过将程序B转换为模块,并使用模块变量对其状态进行排序(而不是派生类型的字段),来执行相同的操作。但无论采用何种解决方案,您都必须以某种方式分离初始化部分,以确保它只执行一次。

我可以想象,将两者都作为一个程序的不同分支,并用MPI、共享内存线程绑定,coarrays…@VladimirF您能详细介绍一下如何在这种情况下使用共享内存线程吗?这个解决方案对我来说很有意义,但需要花费大量精力来实现,因为程序太大/太复杂了。如果没有代码,是否有人能直观地判断这种方法是否比使用MPI进行消息传递更快/更慢?它不需要任何通信,因此应该更快,尤其是在程序之间必须交换大量数据的情况下。(您可以使用子例程调用传递“指针”,而不是使用MPI发送数据。)同样,这需要大量的代码重写才能正确实现。通过使用选项“保存”子例程调用“B”之间的所有变量并在第一次调用后的所有时间步中使“B”跳到初始化后的点进行编译,可以获得类似的结果吗?