【问题标题】:gcc, simd intrinsics and fast-math conceptsgcc、simd 内在函数和快速数学概念
【发布时间】:2011-06-25 09:18:22
【问题描述】:

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

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

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

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

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

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

现在的问题:

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

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

【问题讨论】:

标签: gcc simd intrinsics fast-math


【解决方案1】:

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

Ox 优化适用于任何类型的代码,fpu 或 sse

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

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

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

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

欢迎任何更正:)

有用的链接:
fpu / sse control
gcc math
以及关于“向量扩展”、“X86 内置函数”和“其他内置函数”的 gcc 手册

【讨论】:

  • 因为 gcc 现在是 v4.7,就像我在最后写的一样,仍然欢迎任何更正:)
  • 对于 32 位 x86 上的 gcc,您必须使用 -msse2-march=whatever 才能使用 SSE/SSE2 数学。然后要让编译器实际使用它,您可以使用-mfpmath=sse。默认情况下,x86-64 上的 gcc 已经将 SSE/SSE2 用于浮点/双精度,因为 ABI 在 XMM 寄存器中传递和返回浮点和双精度参数,而不是 x87 堆栈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多