相关疑难解决方法(0)

缓慢的jmp指令

作为我的问题后续问题在x86-64中使用32位寄存器/指令的优点,我开始测量指令的成本.我知道这已经多次完成了(例如Agner Fog),但我这样做是为了娱乐和自我教育.

我的测试代码非常简单(为简单起见,这里是伪代码,实际上是汇编程序):

for(outer_loop=0; outer_loop<NO;outer_loop++){
    operation  #first
    operation  #second
    ...
    operation #NI-th
} 
Run Code Online (Sandbox Code Playgroud)

但是应该考虑一些事情.

  1. 如果循环的内部部分很大(大NI>10^7),则循环的整个内容不适合指令高速缓存,因此必须一遍又一遍地加载,使得RAM的速度定义执行所需的时间.例如,对于大的内部部分,xorl %eax, %eax(2个字节)比xorq %rax, %rax(3个字节)快33%.
  2. 如果NI是小,整个循环可轻松放入指令缓存,比xorl %eax, %eaxxorq %rax, %rax同样快速,可以执行每时钟周期的4倍.

然而,这个简单的模型并没有为jmp建筑提供水.对于jmp-instruction,我的测试代码如下所示:

for(outer_loop=0; outer_loop<NO;outer_loop++){
    jmp .L0
    .L0: jmp .L1
    L1: jmp L2
    ....
}
Run Code Online (Sandbox Code Playgroud)

结果是:

  1. 对于"大"循环大小(已经用于NI>10^4),我测量4.2 ns/ - jmp指令(相当于从RAM加载的42个字节或在我的机器上大约12个时钟周期).
  2. 对于小环路尺寸(NI<10^3),我测量1 ns/jmp-指令(大约3个时钟周期,听起来似乎合理--Agner Fog的表显示了2个时钟周期的成本).

该指令jmp LX使用2字节eb 00 …

performance x86 assembly intel cpu-architecture

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

当Skylake CPU错误预测分支时会发生什么?

我试图详细了解当分支预测错误时,skylake CPU管道的各个阶段中的指令会发生什么,以及从正确的分支目标开始执行指令的速度如何。

因此,让我们在这里将两个代码路径标记为红色(一个预测但未实际采用)和绿色(一个已预测但未预期)。所以问题是:1.在红色指令开始被丢弃之前,分支必须经过管道多远(以及在管道的哪个阶段被丢弃)?2.绿色指令(在分支到达的流水线阶段方面)多久可以开始执行?

我看过Agner Fogg的文档和许多讲义,但这些观点并不清楚。

x86 intel cpu-architecture speculative-execution branch-prediction

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