我有一个程序有一个嵌套循环,它的父级运行在执行浮点运算的复杂性。
我看到编译时代码的性能icc与g++ -ffast-math.
这是否意味着 icc 正在-ffast-math隐式打开等效项?
我有一个程序有一个嵌套循环,它的父级运行在执行浮点运算的复杂性。
我看到编译时代码的性能icc与g++ -ffast-math.
这是否意味着 icc 正在-ffast-math隐式打开等效项?
对于一阶近似,icc-ffast-math默认使用。
如果你运行icc --help,它会显示它的选项。其中一个部分是Floating Point,它的开头是这样的:
Floating Point
--------------
-fp-model <name>
enable <name> floating point model variation
[no-]except - enable/disable floating point semantics
fast[=1|2] - enables more aggressive floating point optimizations
precise - allows value-safe optimizations
source - enables intermediates in source precision
strict - enables -fp-model precise -fp-model except, disables
contractions and enables pragma stdc fenv_access
double - rounds intermediates in 53-bit (double) precision
extended - rounds intermediates in 64-bit (extended) precision
这里没有说,但在这里的 icc 文档中,它说这fast=1是默认设置。
其他类似的选项-ffast-math是:
-[no-]prec-sqrt
determine if certain square root optimizations are enabled
-[no-]prec-div
improve precision of FP divides (some speed impact)
-[no-]fast-transcendentals
generate a faster version of the transcendental functions
...
-[no-]ftz
enable/disable flush denormal results to zero
-[no-]fma
enable/disable the combining of floating point multiplies and
add/subtract operations
但是 和 之间的对应关系-ffast-math可能-fp-model fast=1不是很精确 - 很可能包含其他一些特定选项fast-math(可以在这里看到)但不包括在内,fp-model fast=1反之亦然。在我看来,除其他外,它-ffast-math会禁用非有限浮点算术(inf, nan),而 icc 默认情况下不会这样做。
您可以通过要求 icc 和 g++ 打印出所有实际启用的优化开关来查找。查看每个选项的详细程度选项。