首页 > 解决方案 > 使用 armflang 在 -Ofast 级别编译时的 Fortran 程序段错误

问题描述

我有一个 Fortran 程序,它可以armflang-O3级别上使用,但在-Ofast优化级别上会出现段错误。可能出了什么问题?

更新:问题并非特定于工作负载。某些 NCAR 工作负载和 WRF 3.9.1 会发生这种情况。

标签: armflang

解决方案


这可能是因为-fstack-arrays默认情况下在-Ofast级别启用的选项。根据 Arm Fortran 编译器armflang 文档-fstack-arrays未在-O3级别启用。

-fstack-arrays选项将所有大小的自动数组放在本地堆栈上。这通常会带来更好的性能,因为它避免了对本地数组和临时数组的间接malloc()调用free()。在典型的 Linux 系统上,每个进程的堆栈大小默认为 8192 kB(通常可以增加,因为硬限制是“无限的”)。这会给具有巨大数组的程序带来问题,从而导致不明显的段错误。

有两种方法可以解决此问题

  1. 改为使用-Ofast -fno-stack-arrays,这将禁用在本地堆栈上放置自动数组,但保留所有其他-Ofast优化。

  2. ulimit -s unlimited如果系统允许,请在运行程序之前调用。这会将堆栈设置为比默认值更大的大小。


推荐阅读