【发布时间】:2014-10-10 04:08:31
【问题描述】:
我有一个由许多小子例程和一个主子例程组成的模块,这是唯一一个公开的。其余子例程是私有的,由主子例程或在其中调用。主子例程必须接受所有必要的参数来执行它的工作,但通常当它向私有子例程交付任务时,它必须再次传递一些参数。我想在处理数组时避免这种情况。使用标量数字,我可以简单地定义一个模块范围的变量并在主子程序中为其分配相应的值:
module test
integer, private :: m, n
private :: foo
public :: main
contains
subroutine main(matrixA, m0, n0)
integer, intent(in) :: m0, n0
real, intent(inout) :: matrixA(m0,n0)
!assign values to module variables m & n
m = m0
n = n0
...
!no need to pass m0 & n0
call foo(matrixA)
end subroutine
subroutine foo(matrixA)
real, intent(inout) :: matrixA(m,n)
...
end subroutine
end module
我也想根本不需要传递matrixA。做这个的最好方式是什么?最好,我的意思是提供最好的性能。
【问题讨论】:
-
您是否分析了代码以声称参数传递是瓶颈?如果您发现在 looos 中假设的形状数组太慢,请尝试使用
contiguous属性。 -
是的,它肯定更慢,比如显式形状需要 30 秒,而假设形状需要 40 秒多一点。此外,我尝试使用模块范围的指针,因此在 main 中我只需将这些指针分配给矩阵,并让其余的子例程使用这些指针。它甚至更慢(48 秒)。我将尝试
contiguous,它在 Fortran 90 中有效吗?这个link 有更多关于假设形状性能的信息。 -
contiguous是 Fortran 2008。Fortran 90 基本上已经死了,不要关心早于 95 的任何东西。 -
您能否展示对
main的调用和声明的主要程序部分?
标签: module fortran subroutine