查找错误预测分支的源位置

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'

预测某个位置使用全局特征和使用周围特征的区别

类型错误:预测()缺少 1 个必需的位置参数:'y_train'

是啥导致分支预测出现峰值 Vtune

如何用python实现运动目标位置的简单预测