衡量一个分支被错误预测的频率

Posted

技术标签:

【中文标题】衡量一个分支被错误预测的频率【英文标题】:Measure how often a branch is mispredicted 【发布时间】:2012-01-08 20:22:21 【问题描述】:

假设我在 C++ 中有一个 if-else 分支,我如何(在代码中)测量分支被错误预测的频率?我想在分支周围添加一些调用或宏(类似于您如何进行自下而上的分析),以报告分支错误预测。

如果有一个通用方法会很好,但让我们先使用 Intel i5 2500k。

【问题讨论】:

可能类似于 Valgrind 的 massif 分析器...我怀疑您是否可以“在代码中”执行它,因为程序执行对程序本身是完全透明的。 根据 CPU,您可能能够访问 CPU 的性能寄存器,但该问题缺乏足够的细节来提供具体建议。 请注意,您获得的结果非常依赖于 cpu,并且您可能无法通过任何侵入性获得准确的测量值(因为更改分支周围的任何代码都会改变其位置,这确实可以有对分支预测的影响)。但是,您究竟希望从这些信息中获得什么?对您而言,错误预测特定分支的频率是否重要(而不是执行需要多长时间,这可能很重要)? @LuchianGrigore:见en.wikipedia.org/wiki/Branch_prediction。 所以我添加了CPU信息。我希望获得的收获是更好地了解要进行哪些优化 - 即,当我查看分支时,我想看看错误预测是否是一个问题。 【参考方案1】:

如果您使用的是 AMD CPU,AMD 的CodeAnalyst 正是您所需要的(适用于 Windows 和 Linux)*。

如果您不这样做,那么您可能需要购买 VTune 许可证或使用说明手册中的 CPU 性能寄存器和计数器详细信息构建一些东西。

您还可以查看 gperf 和 OProfile(仅限 Linux),看看它们的性能如何(我从未使用过这些,但我看到它们被提及很多)。

*CodeAnalyst 应该可以在 Intel CPU 上工作,只是你没有得到很好的 CPU 级别分析。

【讨论】:

【参考方案2】:

OProfile

OProfile 相当复杂,但它可以分析您的 CPU 跟踪的任何内容。

查看 Event Type Reference 并查找您的特定 CPU。

例如这里是core2 events。快速搜索后,我没有看到 core2 架构上错过分支预测的任何事件计数器。

【讨论】:

【参考方案3】:

我想知道是否可以从g++ -fprofile-arcs 中提取此信息?它必须准确地测量这一点,以便反馈给优化器以优化分支。

【讨论】:

以上是关于衡量一个分支被错误预测的频率的主要内容,如果未能解决你的问题,请参考以下文章

如果计算相对拒绝频率,如何衡量与显着性水平是不是显着不同? (R中的正态性检验)

测量分支预测命中率的方法

sktime ARIMA 无效频率

SpringBoot限制接口访问频率

查找数组的最高频率以及具有该频率的所有元素

电路的频率响应---带宽的定义