【问题标题】:VTune profiling shows no metrics for branch prediction on polymorphic function?VTune 分析没有显示多态函数的分支预测指标?
【发布时间】:2014-03-25 19:04:20
【问题描述】:

我正在分析处理数百万条消息的两种设计之间的差异。一种设计使用多态,而另一种则不使用——每条消息都将由多态子类型表示。

我已经使用 VTune 分析了这两种设计。高级摘要数据似乎是有道理的——与使用 IF 语句实现的非多态版本相比,多态设计具有更高的“分支错误预测”率、更高的 CPI 和更高的“ICache 未命中”率。

多态设计有这样一行源码:

object->virtualFunction();

这被称为数百万次(子类型每次都会更改)。由于分支目标错误预测/指令未命中,我预计多态设计会变慢。如上所述,VTune“摘要”选项卡似乎证实了这一点。但是,当我转到源代码行旁边的指标时,绝对没有指标,除了:

  • 已填充的管道槽总数 -> 停用 -> 全面停用
  • 已填充管道槽自我 -> 停用 -> 常规停用
  • 未填充的管道插槽总数 -> 前端绑定 -> 前端带宽 -> 前端带宽 MITE
  • 未填充的管道槽自身 -> 前端绑定 -> 前端带宽 -> 前端带宽 MITE

分支预测列都没有数据,指令缓存未命中列也没有??

有人可以评论一下这是否合理吗?对我来说,它没有——对于一行多态代码,分支目标将不断变化每条消息,怎么可能没有分支错误预测或指令缓存未命中统计信息?

这不可能是由于编译器优化/内联,因为编译器不知道要优化的对象的子类型。

我应该如何使用 VTune 分析多态性的开销?

【问题讨论】:

  • 在该语句中,程序计数器实际花费了多少时间(wall-time)?这是一个方法调用,这意味着除非该方法几乎什么都不做,否则与执行该方法的内容相比,调用该方法所花费的时间可能非常少。因此,虽然这可能是一个有趣的学术问题,但实际上您可能有更大的加速机会。
  • 您没有看到指令本身的分支错误预测,因为样本将在分支之后的下一条指令中“聚合”。
  • @Elalfer 你能详细说明一下吗?谢谢
  • 查看intel的优化手册intel.com/content/dam/www/public/us/en/documents/manuals/… section "B.6.3.2 Virtual Tables and Indirect Calls": "18. Virtual Table Misuse: BR_CALL_MISSP_EXEC / BR_INST_RETIRED.MISPRED"

标签: c++ performance polymorphism profiling intel-vtune


【解决方案1】:

我将尝试回答问题的第一部分:

有人可以评论一下这是否合理吗?对我来说 不——怎么可能没有分支错误预测或指令缓存 分支目标所在的一行多态代码的缺失统计信息 每条消息都会不断变化?

这不可能是由于编译器优化/内联,因为 编译器不知道要优化的对象的子类型。

编译器实际上有一种方法可以内联对虚函数的调用,这是一个有趣的技巧,当我了解到它时我感到很惊讶。

您可以观看this Eric Brumer's talk 了解更多详情,从 22:30 分开始,他谈到了间接调用优化。

基本上,编译器不会向该虚函数指针发出简单的跳转指令,而是首先添加一些比较,并且对于某些已知的指针值预测调用的特定虚函数,然后可以将该调用内联到该分支中。在这种情况下,不可预测的指针值跳转变成了简单的比较分支预测,现代 CPU 擅长于此。因此,如果大多数调用都将进入相同的特定虚拟函数实现,您可能会看到良好的预测数和低指令缓存未命中数。

我建议查看该函数调用的反汇编。它是诚实地使用 vtable 指针间接跳转到代码,还是通过一些优化避免 vtable 跳转。

如果编译器没有优化调用,CPU 仍有一些方法可以推测,请深入了解Branch Target Buffer。例如,如果这个函数在同类型对象的紧密循环中被调用,那么它是否是虚拟的可能并不重要,它的地址是可以预测的......

HTH。

【讨论】:

    【解决方案2】:

    您没有看到指令本身的分支错误预测,因为样本将在分支之后的下一条指令中“聚合”。

    同样适用于所有非精确事件(最后没有_PS)。只需检查常规代码配置文件,就可以很容易地找到它。例如,有更高的可能性会发现简单的add 上的CPU_CLK_UNHALTED 样本比在add 之前出现的重度imul 上的样本更多。

    要查看事件发生的“准确”指令,您必须使用精确事件,例如BR_MISP_RETURED.ALL_BRANCHES_PS

    我不能 100% 确定这个“问题”的真实性质,我知道应该可以修复它,但出于某种原因,VTune 采样驱动程序的人不想这样做。我认识一个人在过去 6 年里一直在与这个问题作斗争,每次我检查 asm VTune 个人资料时都会考虑到这一点:)

    PS。关于带有虚拟功能的原始测试。我也对其进行了测试,它确实会产生很多分支错误预测。函数指针也是如此。解决它的一种方法是尽可能使用模板类。

    【讨论】:

    • 我在某处读到,使用精确事件会降低整个 CPU 的速度,这就是为什么使用它应该是最后的手段。
    • 从未听说过。请注意“Sample after”值
    猜你喜欢
    • 2014-12-02
    • 2014-04-25
    • 2014-03-03
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多