gcc、simd 内在函数和快速数学概念
大家好:)
我正在尝试掌握一些有关浮点、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)时,我可以选择直接调用内部函数,或者再次保留自动决策到海湾合作委员会。如果我不通过正确的标志启用 simd 指令,Gcc 仍然可以选择标准 x87 代码。 同样,如果我不指定优化标志,这会发生变化吗?
如果我的任何陈述有误,请纠正我:p
现在的问题是:
- 我是否必须包含 x86intrin.h 才能使用内在函数?
- 我是否需要链接 libm?
- 快速数学与什么有关系?我知道它放宽了 IEEE 标准,但具体是如何放宽的呢?使用其他标准函数吗?链接了其他一些库吗?或者只是在某处设置了几个标志而标准库的行为有所不同?
感谢任何愿意提供帮助的人:D
Hi all :)
I'm trying to get a hang on a few concepts regarding floating point, SIMD/math intrinsics and the fast-math flag for gcc. More specifically, I'm using MinGW with gcc v4.5.0 on a x86 cpu.
I've searched around for a while now, and that's what I (think I) understand at the moment:
When I compile with no flags, any fp code will be standard x87, no simd intrinsics, and the math.h functions will be linked from msvcrt.dll.
When I use mfpmath, mssen and/or march so that mmx/sse/avx code gets enabled, gcc actually uses simd instructions only if I also specify some optimization flags, like On or ftree-vectorize. In which case the intrinsics are chosen automagically by gcc, and some math functions (I'm still talking about the standard math funcs on math.h) will become intrinsics or optimized out by inline code, some others will still come from the msvcrt.dll.
If I don't specify optimization flags, does any of this change?
When I use specific simd data types (those available as gcc extensions, like v4si or v8qi), I have the option to call intrinsic funcs directly, or again leave the automagic decision to gcc. Gcc can still chose standard x87 code if I don't enable simd instructions via the proper flags.
Again, if I don't specify optimization flags, does any of this change?
Plese correct me if any of my statements is wrong :p
Now the questions:
- Do I ever have to include x86intrin.h to use intrinsics?
- Do I ever have to link the libm?
- What fast-math has to do with anything? I understand it relaxes the IEEE standard, but, specifically, how? Other standard functions are used? Some other lib is linked? Or are just a couple of flags set somewhere and the standard lib behaves differently?
Thanks to anybody who is going to help :D
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好吧,我正在为那些像我一样在掌握这些概念上遇到困难的人解答。
Ox 的优化适用于任何类型的代码,fpu 或 sse
fast-math 似乎仅适用于 x87 代码。另外,它似乎并没有改变 fpu 控制字 o_O
内置函数总是包含在内。对于某些内置函数,可以通过一些标志来避免这种行为,例如严格或无内置函数。
libm.a 用于一些 glibc 中未包含的内容,但对于 mingw,它只是一个虚拟文件,因此目前链接到它是没有用的
使用 gcc 的特殊向量类型似乎仅在调用内在函数时才有用直接,否则代码无论如何都会被矢量化。
欢迎任何更正:)
有用的链接:
fpu / sse 控制
gcc 数学
以及关于“矢量扩展”、“X86 内置函数”和“其他内置函数”的 gcc 手册
Ok, I'm ansewring for anyone who is struggling a bit to grasp these concepts like me.
Optimizations with Ox work on any kind of code, fpu or sse
fast-math seems to work only on x87 code. Also, it doesn't seem to change the fpu control word o_O
Builtins are always included. This behavior can be avoided for some builtins, with some flags, like strict or no-builtins.
The libm.a is used for some stuff that is not included in the glibc, but with mingw it's just a dummy file, so at the moment it's useless to link to it
Using the special vector types of gcc seems useful only when calling the intrinsics directly, otherwise the code gets vectorized anyway.
Any correction is welcomed :)
Useful links:
fpu / sse control
gcc math
and the gcc manual on "Vector Extensions", "X86 Built-in functions" and "Other Builtins"