Fortran全局工作数组与本地动态分配数组之比较



我使用的是一个已升级到F9X的旧F77代码。它仍然有一些旧的"遗留"代码结构,我很好奇以遗留方式或现代方式添加代码的性能方面。我们有一个单独的F9x代码,我们正试图将其集成到这个旧代码中,并尽可能多地使用它们的过程,而不是重写我们自己的版本。还要注意,假设所有这些过程都没有明确接口。

具体来说,旧代码有一个大的秩为1的工作数组,它在主程序中分配,随着这个数组深入到过程中,它被拆分并在需要的地方使用。本质上有一个分配/解除分配,这个数组的唯一开销包括找到所需临时数组的起始索引(琐碎的),并将工作数组的这些部分传递到过程中。

我们的新代码通常使用旧代码中的较低级别过程,其中多个伪数组源自旧代码的全局工作数组。我可以在需要的地方创建动态分配的数组,而不用麻烦地创建我们自己的工作数组、查找起始索引并传递所有这些数组部分及其起始索引。然而,在代码执行过程中,这些过程可以被调用数千次(对于一些较低级别的例程可能是数百万次),我担心每次使用这些过程时分配和释放的开销。此外,这些临时数组可能包含数百万个双精度元素。

我也尝试过自动数组,但当我开始遇到堆栈溢出问题时就停止了,现在几乎只使用动态数组。关于不同类型数组的内存存储方式,我听说过堆栈和堆的不同之处,但我真的不知道它们之间的区别,以及哪一个更好(性能、效率等)

长话短说,这些动态分配(或自动)阵列是否会因为开销问题而显著降低效率?我还意识到,动态分配的数组在代码的生命周期中更健壮,但我真正追求的是性能。5%的性能提升可能意味着代码执行可以节省许多小时。

我意识到,由于编译器优化和其他因素的差异,我可能无法得到确切的答案,但我很好奇是否有人对类似的东西有一些知识/经验。谢谢你的帮助。

我认为任何答案都将是猜测和推测。我的猜测是:创建数组将是一个非常低的CPU负载。除非这些子例程所做的计算量可以忽略不计,否则不同数组类型的不同开销不会明显。但唯一可以确定的方法是尝试两种不同的方法并对它们进行计时,例如,使用Fortran内在的cpu_time。

自动数组通常放在堆栈上,但有些编译器会将大型自动数组放在堆上。某些编译器可以选择更改此行为。可分配的可能在堆上。

最新更新