Fortran 生成大型内部临时数组时如何避免堆栈溢出?

How can I avoid a stack overflow when Fortran produces a large, internal, temporary array?

我有一些 Fortran 代码调用 RESHAPE 对矩阵重新排序,以便我现在要循环的维度成为第一个变化的维度(Fortran 中的列主顺序)。

这与 C/Fortran 互操作性无关。

现在矩阵相当大,当我调用 RESHAPE 函数时出现段错误,我非常确信这是堆栈溢出。我知道这一点,因为我可以用 -heap-arrays 在 ifort 中编译我的代码,问题就消失了。

我不想修改堆栈大小。此代码需要可移植到任何计算机,而用户不必关心堆栈大小。

有什么方法可以调用 RESHAPE 函数来使用堆而不是堆栈来使用其内部内存。

最坏的情况下我将不得不 'roll my own' RESHAPE 函数,但我希望有更好的方法。

Fortran 标准根本没有谈到堆栈和堆,那是一个实现细节。在内存的哪一部分放置某些东西以及是否有任何限制由实现定义。

因此无法从 Fortran 代码本身控制堆栈或堆的行为。如果你想指定这个并且编译器选项用于那个,则必须通过其他方式指示编译器。 Intel Fortran 默认使用堆栈并具有 -heap-arrays n 选项(n 是 kB 的限制),gfortran 略有不同并具有相反的 -fstack-arrays 选项(包含在 -Ofast 中,但可以已禁用)。

这对所有类型的临时数组和自动数组都有效。