查找错误预测分支的源位置
Posted
技术标签:
【中文标题】查找错误预测分支的源位置【英文标题】:Find source location where a branch was mispredicted 【发布时间】:2014-04-12 17:45:32 【问题描述】:我正在尝试在函数中查找最常错误预测分支的位置。我试了一下perf,如下:
perf record ./a.out
a.out
是按照手册的建议使用选项 -ggdb -fno-omit-frame-pointer
编译的。
我怎样才能找到这些景点?
【问题讨论】:
【参考方案1】:默认情况下perf record
对cycles 事件执行采样。每次发生给定数量的周期事件时,都会记录一个内部包含不同事物(例如指令指针)的样本。有了这个,您可以主要观察您在代码的哪一部分花费了时间。
使用 -e 选项指定要对其执行采样的事件。可能您可以尝试指定分支错误预测的事件(根据您的硬件),并且样本只会在该事件的每 X 次出现时生成。但我不确定是否可以对所有事件进行采样。
我不知道它的真正含义,但在我的性能版本 3.11 上,存在以下选项:
-j, --branch-filter 启用采取的分支堆栈采样。每个样本捕获一系列连续的分支。每个样本捕获的分支数量取决于底层 硬件、感兴趣的分支类型和执行的代码。可以选择通过启用过滤器捕获的分支类型。
【讨论】:
"-j" 是 LBR - Intel 最后一个分支记录(由 CPU 执行的 N 个先前分支的列表)。 @user46317 需要perf record -e branch-misses
,并且大多数 CPU 事件都支持周期性采样(硬件每 X 事件生成 perf 中断)。我认为,只有非核心事件不能产生 perf 中断,并且可能只轮询当前值或总值。以上是关于查找错误预测分支的源位置的主要内容,如果未能解决你的问题,请参考以下文章
类型错误:预测()缺少 1 个必需的位置参数:'params'