armflang - 使用 armflang 在 -Ofast 级别编译时的 Fortran 程序段错误
问题描述
我有一个 Fortran 程序,它可以armflang
在-O3
级别上使用,但在-Ofast
优化级别上会出现段错误。可能出了什么问题?
更新:问题并非特定于工作负载。某些 NCAR 工作负载和 WRF 3.9.1 会发生这种情况。
解决方案
这可能是因为-fstack-arrays
默认情况下在-Ofast
级别启用的选项。根据 Arm Fortran 编译器armflang 文档,-fstack-arrays
未在-O3
级别启用。
该-fstack-arrays
选项将所有大小的自动数组放在本地堆栈上。这通常会带来更好的性能,因为它避免了对本地数组和临时数组的间接malloc()
调用free()
。在典型的 Linux 系统上,每个进程的堆栈大小默认为 8192 kB(通常可以增加,因为硬限制是“无限的”)。这会给具有巨大数组的程序带来问题,从而导致不明显的段错误。
有两种方法可以解决此问题
改为使用
-Ofast -fno-stack-arrays
,这将禁用在本地堆栈上放置自动数组,但保留所有其他-Ofast
优化。ulimit -s unlimited
如果系统允许,请在运行程序之前调用。这会将堆栈设置为比默认值更大的大小。
推荐阅读
- java - Java/LWJGL 3 优化和渲染错误
- kubernetes - 使用 kubectl grep 多个 pod/service 日志以获取特定短语
- asp.net-mvc - ASP.NET MVC Syncfusion 条形图图例形状不起作用
- google-chrome-extension - 在跨多个来源运行内容脚本的 chrome 扩展中使用 auth0 (oauth2) 对用户进行身份验证的最佳方法是什么?
- haskell - 基于指令标记“fgl”图的边
- flutter - 在重建之间保持状态
- java - 即使满足等价条件/第一个 if 语句,程序也会重复用户输入
- google-cloud-bigtable - google cloud BigTable 有数据浏览器吗?
- java - 如何将 JSON 值添加到 Java 中的 ArrayList
- node.js - 使用自制程序更新 nodejs 困境:需要更多权限但 brew 不适用于 sudo?