【问题标题】:Fortran global work array vs. local dynamically allocated arraysFortran 全局工作数组与本地动态分配数组
【发布时间】:2011-09-16 20:52:35
【问题描述】:

我正在使用已升级到 F9X 的旧 F77 代码。它仍然具有一些较旧的“遗留”代码结构,我对以遗留方式或现代方式添加代码的性能方面感到好奇。我们有一个单独的 F9x 代码,我们正在尝试将其集成到这个旧代码中,并尽可能多地使用他们的过程,而不是重写我们自己的版本。另请注意,假设所有这些过程都没有显式接口。

具体来说,旧代码在主程序中分配了一个大的 rank-1 工作数组,并且随着该数组被更深入地传递到程序中,它被拆分并在需要的地方使用。本质上,只有一次分配/解除分配,并且该数组的唯一开销涉及找到所需临时数组的起始索引(微不足道)并将工作数组的这些部分传递到过程中。

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

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

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

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

【问题讨论】:

  • 您说“5% 的性能提升可能意味着在代码执行中节省了许多小时”。编写健壮的代码可以节省很多天甚至几周的调试和维护时间;不仅在最初,而且在此代码的整个生命周期中。这显然取决于程序的使用场景(是每天/每周运行还是偶尔运行),但这些都是要牢记的注意事项。
  • 这是一个已建立且不断更新的 CFD 代码,分发给各种个人/组织。我们正在谈论尽可能频繁地运行具有数百万个单元的几何图形,更高的周转率意味着节省数小时(和 $)。

标签: arrays performance memory memory-management fortran


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多