我想我不会在任何教科书中找到这一点,因为回答这个问题需要经验。我目前正处于测试/验证我的代码/寻找错误以使其进入生产状态的阶段,任何错误都会导致许多人遭受痛苦,例如黑暗的一面。
当您为 Fortran 编译程序以进行调试时,您设置了哪些标志?
你为生产系统设置了什么样的标志?
在部署之前你会做什么?
生产版本ifort
用作编译器,但我使用gfortran
. 我做错了吗?
我想我不会在任何教科书中找到这一点,因为回答这个问题需要经验。我目前正处于测试/验证我的代码/寻找错误以使其进入生产状态的阶段,任何错误都会导致许多人遭受痛苦,例如黑暗的一面。
当您为 Fortran 编译程序以进行调试时,您设置了哪些标志?
你为生产系统设置了什么样的标志?
在部署之前你会做什么?
生产版本ifort
用作编译器,但我使用gfortran
. 我做错了吗?
-Og
/-O0
-O0
基本上告诉编译器不要进行优化。优化器可以删除一些局部变量,合并一些代码块等,结果它可以使调试变得不可预测。-O0
选项的代价是代码执行速度非常慢,但从 4.8 版 GCC 编译器(包括 Fortran 编译器)开始接受新引入的优化级别-Og
:
-Og
优化调试体验。-Og 启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的首选优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。
因此,如果可能使用-Og
,否则使用-O0
。
-g
此选项实际上通过请求编译器生成旨在由交互式调试器 (GDB) 使用的调试信息来使调试成为可能。
他们有很多。我认为最有用的是:
-Wall
“启用所有关于一些用户认为有问题的结构的警告,并且很容易避免(或修改以防止警告),即使与宏一起使用。”
-Wextra
“启用 -Wall 未启用的一些额外警告标志。”
-pedantic
生成有关 gfortran 支持但不属于官方 Fortran 95 标准的语言功能的警告。甚至可能更加“迂腐”并使用-std=f95
标志警告成为错误。
-fimplicit-none
“指定不允许隐式类型,除非被显式 IMPLICIT 语句覆盖。这相当于在每个过程的开头添加隐式无。”
-fcheck=all
“启用运行时测试”,例如数组边界检查。
-fbacktrace
“指定当遇到运行时错误或发出致命信号(分段错误、非法指令、总线错误或浮点异常)时,Fortran 运行时库应输出错误的回溯。”
对于调试,我使用:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace
. 对于尚未解释的内容,请查看 gfortran 手册。 -fcheck=all
包括-fcheck=bounds
.
对于生产我使用:-O3 -march=native -fimplicit-none -Wall -Wline-truncation -fwhole-file -std=f2008
. 运行时检查(例如边界检查)会增加生成的可执行文件的执行时间。我发现成本经常低得惊人,但也可能很高。因此,对生产编译没有运行时检查。