我有一些 Fortran 代码,它调用 RESHAPE
来重新排序矩阵,以便我现在要循环的维度成为第一个变化维度(Fortran 中的列主序)。
这与 C/Fortran 互操作性无关。
现在矩阵相当大,当我调用RESHAPE
函数时,我得到一个段错误,我非常确信这是堆栈溢出。我知道这一点是因为我可以使用 -heap-arrays
在 ifort 中编译我的代码,然后问题就消失了。
我不想修改堆栈大小。该代码需要对于任何计算机都是可移植的,而用户不必关心堆栈大小。
是否可以通过某种方式调用 RESHAPE
函数来使用堆而不是堆栈来使用内部内存。
最坏的情况是,我将不得不为此实例“推出我自己的”RESHAPE
函数,但我希望有更好的方法。
最佳答案
Fortran 标准根本没有谈论堆栈和堆,这是一个实现细节。某些东西被放置在内存的哪一部分以及是否有任何限制是实现定义的。
因此,无法从 Fortran 代码本身控制堆栈或堆行为。如果您想指定这一点并且使用编译器选项,则必须通过其他方式指示编译器。 Intel Fortran 默认使用堆栈并具有 -heap-arrays n 选项(n 是以 kB 为单位的限制),gfortran 略有不同,具有相反的 -fstack-arrays 选项选项(包含在 -Ofast
中,但可以禁用)。
这对于所有类型的临时数组和自动数组都有效。
关于fortran - 当 Fortran 生成大型内部临时数组时,如何避免堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30492710/