小编Bil*_*rst的帖子

为什么我的 SSE 程序集在发布版本中变慢?

我一直在玩一些 x64 程序集和 XMM 寄存器来做一些浮点数学,我看到一些让我感到困惑的性能。

作为自学练习,我编写了一些 SSE 程序集来近似“sin”函数(使用泰勒级数),并在循环中从一些基本的 C++ 调用它以与标准库版本进行比较。代码如下,之后我粘贴了一些典型运行的输出。(我不是在寻找对代码或方法的批评,只是想了解性能数字)。

我不明白的是为什么使用“发布”构建,其中实际运行的程序集是相同的(我已经通过调试器进行了仔细检查),始终慢了大约 40 - 50 个周期。(取消对 LFENCE 指令的注释会为 Debug 和 Release 增加大约 100 个周期,因此增量保持不变)。作为一个额外的问题,为什么第一次迭代通常是数千次!!

我知道这些东西非常复杂,并且受到许多因素的微妙影响,但是作为潜在原因出现在我脑海中的一切都是没有意义的。

我已经在两次运行中检查了 MSCSR 标志,这在构建中也是相同的(默认值为 1f80h,它屏蔽了所有异常)。

知道什么会导致这种情况吗?我可以做哪些进一步的分析来更深层次地解决这个问题?

集会

_RDATA segment
    pi  real4 3.141592654
    rf3 real4 0.1666666667
    rf5 real4 0.008333333333
    rf7 real4 0.0001984126984
_RDATA ends


_TEXT segment

; float CalcSin(float rads, int* cycles)
CalcSin PROC
    ; "leaf" function - doesn't use the stack or any non-volatile registers
    mov r8, rdx                ; Save the 'cycles' pointer …
Run Code Online (Sandbox Code Playgroud)

cpu performance assembly sse microbenchmark

1
推荐指数
1
解决办法
147
查看次数

标签 统计

assembly ×1

cpu ×1

microbenchmark ×1

performance ×1

sse ×1