gpt4 book ai didi

Fortran 隐含 do 不起作用

转载 作者:行者123 更新时间:2023-12-02 17:02:37 27 4
gpt4 key购买 nike

我正在使用 Fortran90,但我对它不太熟悉。

在代码的某些地方,我想在 t0 和 tf 之间创建一个由 n 个线性等距点组成的数组,所以我尝试了以下方法:

t = t0+(/(i,i=0,n-1)/)*(tf-t0)/(n-1)

这与以下内容相同:

do while(i<=n)
t(i) = i-1
i=i+1
end do

t = t*(tf-t0)/(n-1)+t0

但是,如果 n 太大(n=2000001 或更大),则第一个选项不起作用。我收到错误:

forrtl:严重(170):程序异常 - 堆栈溢出

这是为什么呢?我该怎么做才能使隐含的 do 循环适用于 n 个大的对象?

最佳答案

一些 Fortran 处理器使用硬件堆栈来存储在表达式求值期间创建的临时变量。当表达式涉及大型对象(例如大型数组)时,临时对象所需的存储空间可能会超过硬件堆栈可用的总存储空间,从而导致堆栈溢出。

在第一种情况下,您的 Fortran 处理器可能正在创建一个大型临时文件来保存数组构造函数的结果。

不同的处理器在不需要临时变量的情况下计算表达式的能力不同 - 例如,您可能会发现某些处理器在第二个示例中也存在堆栈溢出问题 - 分配给的变量 t 也在右侧引用side 表达式对于某些 Fortran 处理器来说可能足以要求将整个右侧评估为临时值。

您的选择是(可能是组合):

  • 使用操作系统或编译器开关为硬件堆栈留出更多存储空间。

  • 使用编译器开关或类似的命令来指示处理器在堆而不是堆栈上创建临时变量。

  • 以不同的方式重述整个操作,以便编译器不再创建临时变量(正如您已经探索过的那样)。这可能包括将操作重新转换为 do 循环中的逐元素操作,而不是直接在数组上使用操作。

这些方法是特定于平台的。根据错误消息,我猜您在 Windows 上使用 Intel Fortran(或祖先) - 如果是这样,请参阅 /heap-arrays 编译器选项和 Windows 链接器选项 /stack。如果您使用的是 Linux,请参阅 ulimit 命令。

关于Fortran 隐含 do 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29022909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com