gpt4 book ai didi

c++ - 如何控制 C 数学是否使用 SSE2?

转载 作者:IT老高 更新时间:2023-10-28 21:47:57 27 4
gpt4 key购买 nike

我在 fp:strict 模式下使用 MSVC 进入了 C 库的超越数学函数的汇编。它们似乎都遵循相同的模式,这就是 sin 发生的情况。

首先有一个来自名为“disp_pentium4.inc”的文件的调度例程。它检查变量 ___use_sse2_mathfcns 是否已设置;如果是,则调用 __sin_pentium4,否则调用 __sin_default

__sin_pentium4(在“sin_pentium4.asm”中)首先将参数从 x87 fpu 传输到 xmm0 寄存器,使用 SSE2 指令执行计算,然后将结果加载回 fpu。

__sin_default(在“sin.asm”中)将变量保存在 x87 堆栈中并简单地调用 fsin

所以在这两种情况下,操作数都被压入 x87 堆栈并在其上返回,使其对调用者透明,但如果定义了 ___use_sse2_mathfcns,则操作实际上是在 SSE2 中执行的而不是 x87。

这种行为对我来说非常有趣,因为 x87 超越函数因根据实现而具有略微不同的行为而臭名昭著,而给定的 SSE2 代码应该始终给出可重现的结果。

有没有办法在编译或运行时确定将使用 SSE2 代码路径?我不擅长编写程序集,所以如果这涉及编写任何程序集,将不胜感激。

最佳答案

我通过仔细研究 math.h 找到了答案。这由称为 _set_SSE2_enable 的方法控制。这是记录在 here 中的公共(public)符号:

Enables or disables the use of Streaming SIMD Extensions 2 (SSE2) instructions in CRT math routines. (This function is not available on x64 architectures because SSE2 is enabled by default.)

这会导致将上述 ___use_sse2_mathfcns 标志设置为提供的值,从而有效地启用或禁用 _pentium4 SSE2 例程的使用。

文档中提到这仅影响某些先验函数,但从反汇编来看,这似乎影响了它们中的每个人。

编辑:步入每个函数表明它们在 SSE2 中都可用,但以下内容除外:

  • fmod
  • 辛赫
  • cosh
  • tanh
  • sqrt

Sqrt 是最大的罪魁祸首,但在 SSE2 中使用内在函数实现它是微不足道的。对于其他人,除了可能使用第三方库之外,没有简单的解决方案,但我可能可以不用。

关于c++ - 如何控制 C 数学是否使用 SSE2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com