我有一个简单的位读取器,它使用SHLD指令(__shiftleft128)读取位流。

这很好。但是,我一直在进行性能分析,并且我注意到SHLD指令之后的任何指令都会花费很多时间。

    Assembly                    CPU Time    Instructions Retired
add r10b, r9b                   19.000ms    92,000,000
cmp r10b, 0x40                  58.000ms    180,000,000
jb 0x140016fa6 <Block 24>
        Block 23:
and r10b, 0x3f                  43.000ms    204,000,000
mov r15, r11                    30.000ms    52,000,000
mov qword ptr [rbp+0x20], r11
add rbx, 0x8                    16.000ms    78,000,000
mov qword ptr [rbp+0x10], rbx
mov r11, qword ptr [rbx]        6.000ms     44,000,000
bswap r11                       2.000ms
mov qword ptr [rbp+0x28], r11   8.000ms     20,000,000
        Block 24:
mov rdx, r15                    61.000ms    208,000,000
movzx ecx, r10b                 1.000ms     6,000,000
**shld** rdx, r11, cl           24.000ms    58,000,000
inc edi                       **127.000ms** 470,000,000

正如您在inc指令上方的表中看到的那样,shld指令需要花费很多时间(8%的CPU时间)。

我想进一步了解为什么会这样,如何避免这种情况?是否有任何指令可以在cpu级别上与shld并行运行?

我记得在某些AMD优化手册中读过有关shld的信息,但我再也找不到了。

最佳答案

很难说,但延迟似乎是某些异常处理例程的结果。

行为

但是,英特尔手册为shld指定了一些情况,其中调用了 undefined 的响应:-



shld 的异​​常:-

In Protected Mode --> #GP(0),#SS(0),#PF(fault-code),#AC(0),#UD

更新::陷阱:->
首先定义:


inc edi **127.000ms** 470,000,000 (已淘汰说明)
从上面的定义中可以很明显地看出,该指令进入了太多的微操作,还是同时运行了一些中断处理程序。

08-16 10:50