大家好 :)
我正在努力理解有关浮点数、SIMD/数学内置函数和gcc的fast-math标志的一些概念。更具体地说,我在x86 cpu上使用带有gcc v4.5.0的MinGW。
我已经搜索了一段时间,现在我(认为自己)明白的是:
当我不使用任何标志进行编译时,任何fp代码都将是标准的x87,没有simd内置函数,并且math.h函数将从msvcrt.dll链接。
当我使用 mfpmath、mssen 和/或 march 以便启用 mmx/sse/avx 代码时,gcc实际上只有在我还指定了一些优化标志,例如 On 或 ftree-vectorize 时才使用simd指令。此时,intrinsics由gcc自动选择,某些数学函数(我仍然在谈论math.h上的标准数学函数)将变成内置函数或通过内联代码进行优化,其他一些将仍然来自 msvcrt.dll。如果我不指定优化标志,会发生任何变化吗?
当我使用特定的simd数据类型(那些作为gcc扩展名可用的,如 v4si 或 v8qi)时,我有选择直接调用内置函数的选项,或者再次将自动决策留给gcc。如果我不通过适当的标志启用simd指令,gcc仍然可以选择标准的x87代码。同样,如果我不指定优化标志,会发生任何变化吗?
如果我的陈述中有任何错误,请纠正我 :p
现在是问题:
- 我是否必须包含 x86intrin.h 才能使用内置函数?
- 我是否必须链接 libm?
- fast-math 与任何事情有关吗?我了解它放松了IEEE标准,但是具体而言,它如何放松呢?使用其他标准函数?链接其他库?还是只设置了一些标志并且标准库的行为有所不同?
Translated:
大家好 :)
我正在努力理解浮点数、SIMD/数学内置函数和gcc的fast-math标志的相关概念。更具体地说,我在x86 cpu上使用带有gcc v4.5.0的MinGW。
我已经搜索了一段时间,现在我(认为自己)明白的是:
当我不使用任何标志进行编译时,任何fp代码都将是标准的x87,没有simd内置函数,并且math.h函数将从msvcrt.dll链接。
当我使用 mfpmath、mssen 和/或 march 以便启用 mmx/sse/avx 代码时,gcc实际上只有在我还指定了一些优化标志,例如 On 或 ftree-vectorize 时才使用simd指令。此时,intrinsics由gcc自动选择,某些数学函数(我仍然在谈论math.h上的标准数学函数)将变成内置函数或通过内联代码进行优化,其他一些将仍然来自 msvcrt.dll。如果我不指定优化标志,会发生任何变化吗?
当我使用特定的simd数据类型(那些
感谢任何愿意帮忙的人 :D