【发布时间】:2015-08-10 03:27:09
【问题描述】:
我有一些 Fortran 代码调用 RESHAPE 对矩阵进行重新排序,这样我现在要循环的维度成为第一个可变维度(Fortran 中的列优先顺序)。
这与 C/Fortran 互操作性无关。
现在矩阵相当大,当我调用RESHAPE 函数时,我得到一个段错误,我非常确信这是堆栈溢出。我知道这一点,因为我可以使用 -heap-arrays 在 ifort 中编译我的代码,问题就消失了。
我不想修改堆栈大小。此代码需要可移植到任何计算机上,而用户不必担心堆栈大小。
有没有办法让RESHAPE 函数的这个调用使用堆而不是堆栈来使用它的内部内存。
在最坏的情况下,我将不得不为此实例“滚动我自己的”RESHAPE 函数,但我希望有更好的方法。
【问题讨论】:
-
重塑是否比修改循环来处理数组的结构更便宜? (例如,真的有必要重塑吗?)
-
我相信是的。我需要的是循环切片。要么我使用
reshape进行一些预处理,以使这些切片预先在内存中连续,要么在我请求不连续的内存时产生大量临时数组。 -
编译器创建一个临时的。如果没有编译器选项,您不能可移植地指示它把它放在堆上。我会手动进行转置。
-
为什么编译器不能只检查请求的临时数组的大小,将其与堆栈大小进行比较,并相应地使用堆(提示提示 Intel)?
-
英特尔已经提供了解决方案;它是-heap-arrays。这个选项也有一个尺寸截止值,这正是您的建议。
标签: fortran stack-overflow reshape heap-memory stack-memory