【发布时间】: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