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

标签 fortran stack-overflow reshape heap-memory stack-memory

我有一些 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/

相关文章:

对于 Fortran 文件,Vim 自动转到第 80 列之后的下一行

fortran - 停止变量中的代码?

java - 尾递归java

performance - 减少 reshape 的计算时间

fortran - LAPACK 程序 (Fortran 90) 的数值精度不够?

C++ 堆栈溢出错误

c++ - 堆栈溢出大数组但不是同样大的 vector ?

R:将二进制分类变量转换为长数据格式

arrays - 修改大型元胞数组以在 MATLAB 中查找满足条件的某些行

fortran - 此代码是否演示了 GFortran 中的错误?