Fortran:在编译时已知的数组大小VS执行时已知的数组大小

时间:2016-04-22 11:57:16

标签: arrays fortran

此问题类似于this one

假设您有一个子程序foo,它将在您的程序中被调用数千次。此子例程使用几个小的本地数组,这些值不需要在连续调用中存储。子程序如下所示:

SUBROUTINE foo(globalArray)

USE MYMODULE 

REAL, DIMENSION(:)           :: globalArray

REAL, DIMENSION(myDimension) :: localArray1, localArray2, localArray3

...
Do computations with globalArray and localArray*
...

END SUBROUTINE

大小myDimension在执行时,在预处理例程中计算,并存储在模块MYMODULE中。它总是很小(4到35之间)。我有三个以上的本地阵列(通常是15-20)。另外,我应该说对这个例程的调用占我代码执行时间的95%。

我注意到一些与上面的链接非常相​​似的东西。对于完全相同(小)的情况和相同(短)计算(但可以更大,更长时间复制),在具有相同编译器的同一台机器上:

  • (1)如果确实在执行时确定myDimension,我整个节目的挂载时间为2.13秒;
  • (2)如果我用一个显式值(比如4)替换上面的myDimension,我的整个程序的挂载时间是1.31秒;
  • (3)如果我用可分配的数组替换本地数组(例如存储在MYMODULE中),我在预处理步骤中分配它们,在我的子程序中使用它们并在后处理步骤中释放它们,然后挂载时间我的整个节目是2.57秒。

然后我的问题是:

  • 如何在案例(1)和(2)之间处理不同的内存? localArray *是否在case(2)中进入堆栈,而在(1)情况下它们是否在堆上?
  • 有没有办法避免因执行时已知的大小而导致的低性能?

提前感谢您的回答!

0 个答案:

没有答案