Linux perf有branches与branch-misses计数器,在英特尔x86上,这些计数器Map到BR_INST_RETIRED.ALL_BRANCHES与BR_MISP_RETIRED.ALL_BRANCHES,分别测量所有失效的分支与所有失效的预测失误分支。 perf list还包含branch-loads和branch-load-misses,但没有解释它们的作用。奇怪的是,内核源代码只在PowerPC [1]的上下文中引用它们。在x86上,它们似乎只是Map到branches和branch-misses,因为它们返回相同的值:
$ perf stat -e branches,branch-misses,branch-loads,branch-load-misses -- /bin/true
Performance counter stats for '/bin/true':
415,881 branches
8,787 branch-misses # 2.11% of all branches
415,881 branch-loads
8,787 branch-load-misses
2条答案
按热度按时间r1zk6ea11#
Linux
perf
有branches
与branch-misses
计数器,在英特尔x86上,这些计数器Map到BR_INST_RETIRED.ALL_BRANCHES
与BR_MISP_RETIRED.ALL_BRANCHES
,分别测量所有失效的分支与所有失效的预测失误分支。perf list
还包含branch-loads
和branch-load-misses
,但没有解释它们的作用。奇怪的是,内核源代码只在PowerPC [1]的上下文中引用它们。在x86上,它们似乎只是Map到branches
和branch-misses
,因为它们返回相同的值:关于您最初的问题,请记住分支机构的影响来自两个部分:预测失误的分支数量和分支解析时间(计算实际分支结果的时间,可能取决于长延迟负载)。前者可以使用
branch-misses
事件进行测量。要量化后者,最好使用TopDown分析[2]之类的方法。[1][https://github.com/torvalds/linux/blob/master/arch/powerpc/perf/generic-compat-pmu.c](https://github.com/torvalds/linux/blob/master/arch/powerpc/perf/generic-compat-pmu.c)
[2][https://perf.wiki.kernel.org/index.php/Top-Down_Analysis](https://perf.wiki.kernel.org/index.php/Top-Down_Analysis)
bnlyeluc2#
要测量分支预测与分支预测失误率,可以使用“VTune档案器”。下载链接:https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/vtune-profiler.html#gs.bh5zrq
只需创建包含2个事件的自定义VTune分析:
BR_INST_RETIRED.ALL_BRANCHES
BR_MISP_RETIRED.ALL_BRANCHES
不过,您需要手动将它们一个一个地相除,才能获得比率。
BR_INST_RETIRED.ALL_BRANCHES
:统计所有失效的(宏)分支指令。BR_MISP_RETIRED.ALL_BRANCHES
:统计处理器预测失误的所有失效的分支指令。当处理器错误地预测分支的目标时,就会发生分支预测失误。
当在执行时发现预测失误时,必须丢弃在错误(推测性)路径中执行的所有指令,并且处理器必须从正确的路径开始读取。
如果您不知道-VTune中的自定义分析可以通过选择任何预定义的分析并按右上角的“自定义...”按钮来创建。
例如,您可以选择“微体系结构探索”,取消选中所有复选框,按“自定义...”,向下滚动到CPU事件表,取消选中所有不需要的/添加需要的事件。
问候