11

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

我已经搜索了一段时间,这就是我(认为我)目前所理解的:

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

当我使用mfpmathmssen和/或march以便启用 mmx/sse/avx 代码时,gcc只有在我还指定一些优化标志(如Onftree-vectorize )时才实际使用 simd 指令。在这种情况下,内在函数由 gcc 自动选择,并且一些数学函数(我仍在谈论 math.h 上的标准数学函数)将成为内在函数或由内联代码优化,其他一些仍然来自 msvcrt。 dll。如果我不指定优化标志,这会改变吗?

当我使用特定的 simd 数据类型(可用作 gcc 扩展的那些,如v4siv8qi)时,我可以选择直接调用内部函数,或者再次将自动决策留给 gcc。如果我没有通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。同样,如果我不指定优化标志,这会发生任何变化吗?

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

现在的问题:

  1. 我是否必须包含 x86intrin.h 才能使用内在函数?
  2. 我是否必须链接 libm?
  3. 快速数学与任何事情有什么关系?我知道它放宽了 IEEE 标准,但是,具体来说,如何?使用其他标准功能?链接了其他一些库?或者只是在某处设置了几个标志,标准库的行为不同?

感谢任何愿意提供帮助的人:D

4

1 回答 1

6

好的,我正在为像我这样难以掌握这些概念的人提供帮助。

使用 Ox 进行的优化适用于任何类型的代码、fpu 或 sse

快速数学似乎只适用于 x87 代码。此外,它似乎并没有改变 fpu 控制字 o_O

始终包含内置函数。对于某些带有一些标志(如严格或无内置函数)的内置函数,可以避免这种行为。

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

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

欢迎任何更正:)

有用的链接:
fpu / sse control
gcc math
和gcc manual on "Vector Extensions", "X86 Built-in functions" and "Other Builtins"

于 2011-02-11T20:12:07.507 回答