【发布时间】:2011-09-16 20:52:35
【问题描述】:
我正在使用已升级到 F9X 的旧 F77 代码。它仍然具有一些较旧的“遗留”代码结构,我对以遗留方式或现代方式添加代码的性能方面感到好奇。我们有一个单独的 F9x 代码,我们正在尝试将其集成到这个旧代码中,并尽可能多地使用他们的过程,而不是重写我们自己的版本。另请注意,假设所有这些过程都没有显式接口。
具体来说,旧代码在主程序中分配了一个大的 rank-1 工作数组,并且随着该数组被更深入地传递到程序中,它被拆分并在需要的地方使用。本质上,只有一次分配/解除分配,并且该数组的唯一开销涉及找到所需临时数组的起始索引(微不足道)并将工作数组的这些部分传递到过程中。
我们的新代码通常使用旧代码中的较低级别的过程,其中多个虚拟数组源自旧代码的全局工作数组。无需创建我们自己的工作数组、查找起始索引以及传递所有这些数组部分及其起始索引的麻烦,我可以在需要它们的地方创建动态分配的数组。但是,在代码执行期间,这些过程可能会被调用数千次(对于一些较低级别的例程可能是数百万次),我担心每次使用这些过程中的任何一个时分配和释放的开销。此外,这些临时数组可能包含数百万个双精度元素。
我也曾涉足自动数组,但当我开始遇到堆栈溢出问题时就停止了,现在几乎只使用动态数组。关于不同类型数组的内存存储方式,我听说过关于堆栈和堆的不同内容,但我真的不知道区别以及哪个更好(性能、效率等)。
长话短说,这些动态分配(或自动)的数组是否会因为开销问题而显着降低效率?我也意识到动态分配的数组在代码的生命周期中更加健壮,但我真正追求的是性能。 5% 的性能提升可能意味着代码执行时间可以节省很多时间。
我意识到由于编译器优化和其他因素的差异,我可能无法得到明确的答案,但我很好奇是否有人可能对类似的东西有一些知识/经验。感谢您的帮助。
【问题讨论】:
-
您说“5% 的性能提升可能意味着在代码执行中节省了许多小时”。编写健壮的代码可以节省很多天甚至几周的调试和维护时间;不仅在最初,而且在此代码的整个生命周期中。这显然取决于程序的使用场景(是每天/每周运行还是偶尔运行),但这些都是要牢记的注意事项。
-
这是一个已建立且不断更新的 CFD 代码,分发给各种个人/组织。我们正在谈论尽可能频繁地运行具有数百万个单元的几何图形,更高的周转率意味着节省数小时(和 $)。
标签: arrays performance memory memory-management fortran