在 Fortran 中从数组复制到另一个数组时出现堆栈问题?
Stack problems when copying from array to another in Fortran?
如果我在 Fortran 中进行以下复制
arr(i1:i2) = u(1:n)
其中 SIZE(arr(i1:i2)) == SIZE(u(1:n))
并且大小相对较大,例如 2M 双精度元素。
如果变量 arr
是另一个可分配数组的指针别名。 Fortran 会使用堆栈或堆内存来处理复制分配吗?
如果它正在使用堆栈,是否有任何特定的选择原因?
如何避免编译器使用堆栈来避免 Whosebug,而不必在 Linux 终端上 运行 ulimit -s unlimited
。?
如果变量是指针,那么编译器几乎肯定会使用堆栈为副本创建临时文件,因为它必须假设可能存在重叠。它可能也不是简单的重叠,具有不连续的段,因此以不同的顺序进行复制并不总是有效。
Fortran 的语义是赋值的右侧在左侧被改变之前被完全求值。除非编译器可以证明没有重叠(使用 ALLOCATABLE
就足够了),否则它通常会使用堆栈临时文件进行复制。 Intel Fortran 有一个选项 -heap-arrays
告诉它在堆上分配这些临时变量,避免堆栈溢出。
如果我在 Fortran 中进行以下复制
arr(i1:i2) = u(1:n)
其中 SIZE(arr(i1:i2)) == SIZE(u(1:n))
并且大小相对较大,例如 2M 双精度元素。
如果变量 arr
是另一个可分配数组的指针别名。 Fortran 会使用堆栈或堆内存来处理复制分配吗?
如果它正在使用堆栈,是否有任何特定的选择原因?
如何避免编译器使用堆栈来避免 Whosebug,而不必在 Linux 终端上 运行 ulimit -s unlimited
。?
如果变量是指针,那么编译器几乎肯定会使用堆栈为副本创建临时文件,因为它必须假设可能存在重叠。它可能也不是简单的重叠,具有不连续的段,因此以不同的顺序进行复制并不总是有效。
Fortran 的语义是赋值的右侧在左侧被改变之前被完全求值。除非编译器可以证明没有重叠(使用 ALLOCATABLE
就足够了),否则它通常会使用堆栈临时文件进行复制。 Intel Fortran 有一个选项 -heap-arrays
告诉它在堆上分配这些临时变量,避免堆栈溢出。