Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance x86-64相对jmp性能_Performance_Assembly_X86_X86 64_Micro Optimization - Fatal编程技术网

Performance x86-64相对jmp性能

Performance x86-64相对jmp性能,performance,assembly,x86,x86-64,micro-optimization,Performance,Assembly,X86,X86 64,Micro Optimization,我目前正在做一项任务,用于测量各种x86-64命令(at&t语法)的性能 我有点困惑的命令是“无条件jmp”命令。我就是这样实现的: .global uncond uncond: .rept 10000 jmp . + 2 .endr mov $10000, %rax ret 这相当简单。代码创建了一个名为“uncd”的函数,该函数使用.rept指令调用jmp命令10000次,然后将返回值设置为调用jmp命令的次数 “.”在at&t语法中是指当前地址,我将其增加2个字节以说明jm

我目前正在做一项任务,用于测量各种x86-64命令(at&t语法)的性能

我有点困惑的命令是“无条件jmp”命令。我就是这样实现的:

    .global uncond
uncond:

.rept 10000
jmp . + 2
.endr


mov $10000, %rax
ret
这相当简单。代码创建了一个名为“uncd”的函数,该函数使用.rept指令调用jmp命令10000次,然后将返回值设置为调用jmp命令的次数

“.”在at&t语法中是指当前地址,我将其增加2个字节以说明jmp指令本身(因此jmp.+2只需移动到下一条指令)

我没有显示的代码计算处理10000个命令所需的周期数

我的结果表明jmp非常慢(处理一条jmp指令需要10个周期),但从我对流水线的理解来看,无条件跳转应该非常快(没有分支预测错误)


我错过什么了吗?我的代码错了吗?

CPU没有针对无操作
jmp
指令进行优化,因此它无法处理继续解码和管道化直接跳到下一个insn的jmp指令的特殊情况

不过,CPU针对循环进行了优化<代码>jmp。在许多CPU上每时钟运行一个insn,或在某些CPU上每2个时钟运行一个insn


跳转在指令获取中创建气泡。一次很好的预测跳跃是可以的,但是除了跳跃什么都不跑是有问题的。我在core2 E6600(Merom/Conroe微阵列)上复制了您的结果:

使用以下工具构建和运行:

gcc -static -nostartfiles jmp-test.S
perf stat -e task-clock,cycles,instructions,branches,branch-misses ./a.out

 Performance counter stats for './a.out':

       3318.616490      task-clock (msec)         #    0.997 CPUs utilized          
     7,940,389,811      cycles                    #    2.393 GHz                      (49.94%)
     1,012,387,163      instructions              #    0.13  insns per cycle          (74.95%)
     1,001,156,075      branches                  #  301.679 M/sec                    (75.06%)
           151,609      branch-misses             #    0.02% of all branches          (75.08%)

       3.329916991 seconds time elapsed
从另一次运行:

 7,886,461,952      L1-icache-loads           # 2377.687 M/sec                    (74.95%)
     7,715,854      L1-icache-load-misses     #    2.326 M/sec                    (50.08%)
 1,012,038,376      iTLB-loads                #  305.119 M/sec                    (75.06%)
           240      iTLB-load-misses          #    0.00% of all iTLB cache hits   (75.02%)
(每行末尾以(%)表示的数字是计数器活动的总运行时间的多少:
perf
必须为您多路传输,当您要求它计数的内容超过硬件一次可以计数的内容时)

因此,实际上并不是I-cache未命中,而是由不断跳转引起的指令获取/解码前端瓶颈

我的SnB机器坏了,所以我不能在上面测试数字,但是每jmp 8个周期的持续吞吐量与您的结果非常接近(可能来自不同的微体系结构)

有关更多详细信息,请参阅,以及来自标记wiki的其他链接。

的可能重复项。那个更详细的问题有一个更好更详细的答案。
 7,886,461,952      L1-icache-loads           # 2377.687 M/sec                    (74.95%)
     7,715,854      L1-icache-load-misses     #    2.326 M/sec                    (50.08%)
 1,012,038,376      iTLB-loads                #  305.119 M/sec                    (75.06%)
           240      iTLB-load-misses          #    0.00% of all iTLB cache hits   (75.02%)