gcc,simd内在函数和快速数学概念

时间:2011-02-11 07:13:58

标签: gcc simd intrinsics fast-math

大家好:) 我试图了解一些关于浮点,SIMD /数学内在函数和gcc的快速数学标志的概念。更具体地说,我在x86 cpu上使用MinGW和gcc v4.5.0。

我现在已经搜索了一段时间,这就是我(我想)我现在所理解的:

当我没有标志编译时,任何fp代码都是标准x87,没有simd内在函数,math.h函数将从msvcrt.dll链接。

当我使用 mfpmath mssen 和/或 march 以便启用mmx / sse / avx代码时,gcc实际上使用了simd指令如果我还指定了一些优化标记,例如 On ftree-vectorize 。在这种情况下,内部函数是由gcc自动选择的,并且一些数学函数(我仍在谈论math.h上的标准数学函数)将成为内在函数或通过内联代码进行优化,其他函数仍将来自msvcrt。 DLL。 如果我没有指定优化标志,那么这会改变吗?

当我使用特定的simd数据类型(可用作gcc扩展名,如 v4si v8qi )时,我可以选择直接调用内部函数,或者再次离开对gcc的自动决定。如果我没有通过正确的标志启用simd指令,Gcc仍然可以选择标准的x87代码。 同样,如果我没有指定优化标志,那么这会改变吗?

如果我的任何陈述错误,请纠正我:p

现在问题:

  1. 我是否必须包含x86intrin.h才能使用内在函数?
  2. 我是否需要链接libm?
  3. 什么快速数学与任何东西有关?我理解它放宽了IEEE标准,但具体来说,如何?使用其他标准功能?其他一些lib链接?或者只是在某处设置了几个标志,标准的lib表现不同?
  4. 感谢任何有帮助的人:D

1 个答案:

答案 0 :(得分:6)

好的,对于那些正在努力掌握像我这样的概念的人来说,我感到很紧张。

使用Ox进行优化可以处理任何类型的代码,fpu或sse

fast-math似乎只适用于x87代码。此外,它似乎没有改变fpu控制字o_O

随时都包含Builtins。对于某些内置函数,可以避免这种行为,并使用一些标志,例如strict或no-builtins。

libm.a用于glibc中没有包含的一些东西,但是mingw它只是一个虚拟文件,所以目前链接到它是没用的

使用gcc的特殊向量类型似乎只在直接调用内在函数时才有用,否则代码无论如何都会被矢量化。

欢迎任何更正:)

有用的链接:
fpu / sse control
gcc math
和关于“Vector Extensions”,“X86内置函数”和“其他内置函数”的gcc手册