我有一个简单的位读取器,它使用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 (已淘汰说明)
从上面的定义中可以很明显地看出,该指令进入了太多的微操作,还是同时运行了一些中断处理程序。