大家好:)
我正在尝试了解一些关于浮点、SIMD/数学内在函数和 gcc 的快速数学标志的概念。更具体地说,我在 x86 cpu 上使用 MinGW 和 gcc v4.5.0。
我已经搜索了一段时间,这就是我(认为我)目前所理解的:
当我在没有标志的情况下编译时,任何 fp 代码都将是标准的 x87,没有 simd 内在函数,并且 math.h 函数将从 msvcrt.dll 链接。
当我使用mfpmath、mssen和/或march以便启用 mmx/sse/avx 代码时,gcc只有在我还指定一些优化标志(如On或ftree-vectorize )时才实际使用 simd 指令。在这种情况下,内在函数由 gcc 自动选择,并且一些数学函数(我仍在谈论 math.h 上的标准数学函数)将成为内在函数或由内联代码优化,其他一些仍然来自 msvcrt。 dll。如果我不指定优化标志,这会改变吗?
当我使用特定的 simd 数据类型(可用作 gcc 扩展的那些,如v4si或v8qi)时,我可以选择直接调用内部函数,或者再次将自动决策留给 gcc。如果我没有通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。同样,如果我不指定优化标志,这会发生任何变化吗?
如果我的任何陈述有误,请纠正我:p
现在的问题:
- 我是否必须包含 x86intrin.h 才能使用内在函数?
- 我是否必须链接 libm?
- 快速数学与任何事情有什么关系?我知道它放宽了 IEEE 标准,但是,具体来说,如何?使用其他标准功能?链接了其他一些库?或者只是在某处设置了几个标志,标准库的行为不同?
感谢任何愿意提供帮助的人:D