42

我想我不会在任何教科书中找到这一点,因为回答这个问题需要经验。我目前正处于测试/验证我的代码/寻找错误以使其进入生产状态的阶段,任何错误都会导致许多人遭受痛苦,例如黑暗的一面。

  • 当您为 Fortran 编译程序以进行调试时,您设置了哪些标志?

  • 你为生产系统设置了什么样的标志?

  • 在部署之前你会做什么?

生产版本ifort用作编译器,但我使用gfortran. 我做错了吗?

4

2 回答 2

62

最低限度


-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 运行时库应输出错误的回溯。”

于 2010-09-12T07:40:15.237 回答
19

对于调试,我使用:-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. 运行时检查(例如边界检查)会增加生成的可执行文件的执行时间。我发现成本经常低得惊人,但也可能很高。因此,对生产编译没有运行时检查。

于 2013-08-09T00:44:45.287 回答