gpt4 book ai didi

c++ - VTune 分析显示多态函数的分支预测没有指标?

转载 作者:太空狗 更新时间:2023-10-29 21:21:45 26 4
gpt4 key购买 nike

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

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

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

object->virtualFunction();

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

  • 已填充的管道槽总数 -> 退休 -> 一般退休
  • 已填充管道槽自身 -> 退休 -> 一般退休
  • 未填充的管道槽总数 -> 前端边界 -> 前端带宽 -> 前端带宽 MITE
  • 未填充的管道槽自身 -> 前端绑定(bind) -> 前端带宽 -> 前端带宽 MITE

分支预测列都没有数据,指令缓存也没有遗漏列??

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

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

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

最佳答案

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

Could somebody please comment on whether this seems sensible? To me it doesn't- how can there be no branch misprediction or instruction cache miss statistics for a line of polymorphic code where the branch target will constantly be changing per message?

This cannot be due to compiler optimizations/inlining because the compiler wouldn't know the subtype of the object to optimize.

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

你可以看this Eric Brumer's talk有关更多详细信息,从 22:30 分钟开始,他谈到了间接调用优化。

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

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

如果调用没有被编译器优化,CPU 仍然可以通过某种方式进行推测,深入研究 Branch Target Buffer .例如,如果在同一类型的对象上的紧密循环中调用此函数,那么它是否是虚拟的可能无关紧要,它的地址可能会被预测...

HTH.

关于c++ - VTune 分析显示多态函数的分支预测没有指标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com