当Fortran生成大型内部临时阵列时,如何避免堆栈溢出?

时间:2015-05-27 20:39:32

标签: stack fortran heap stack-overflow reshape

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

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

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

我不想修改堆栈大小。这个代码需要可以在任何计算机上移植,而用户不必担心堆栈大小。

是否有某种程度上我可以调用RESHAPE函数来使用堆而不是堆栈用于内部内存使用。

最糟糕的情况是我必须自己推出自己的' RESHAPE函数用于此实例,但我希望有更好的方法。

1 个答案:

答案 0 :(得分:4)

Fortran标准根本没有谈论堆栈和堆,这是一个实现细节。记忆中放置了哪些内容,是否有任何限制是实现定义的。

因此,无法从Fortran代码本身控制堆栈或堆行为。如果要指定编译器,则必须通过其他方式指示编译器,并使用编译器选项。默认情况下,英特尔Fortran使用堆栈并具有-heap-arrays n选项(n是以kB为单位的限制),gfortran稍有不同,并且具有相反的-fstack-arrays选项(包含在-Ofast中,但可以是禁用)。

这适用于各种临时和自动阵列。