首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VTune分析没有显示用于多态函数分支预测的度量标准?

VTune分析没有显示用于多态函数分支预测的度量标准?
EN

Stack Overflow用户
提问于 2014-02-24 08:19:09
回答 2查看 953关注 0票数 3

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

我使用VTune分析了这两种设计。高级汇总数据似乎是有意义的-多态设计比使用IF语句实现的非多态版本具有更高的“分支误判”率、更高的CPI和更高的"ICache缺失“率。

多态设计有一行源代码,如下所示:

代码语言:javascript
复制
object->virtualFunction();

这被称为数百万次(每一次子类型都会改变)。我期望多态设计会因为分支目标错误预测/指令失误而变慢。如前所述,VTune“汇总”选项卡似乎证实了这一点。但是,当我转到源代码行旁边的度量标准时,除了以下指标之外,绝对没有其他度量标准:

  • 填充管道槽总->退休->通用退休
  • 填充管道槽自->退休->通用退休
  • 未填充管道槽总->前端->前端带宽->前端带宽
  • 未填充管道槽自->前端约束->前端带宽->前端带宽

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

有人能评论一下这是否明智吗?对我来说,它没有--怎么可能没有分支错误预测或指令缓存丢失统计数据,因为在多态代码行中,分支目标将在每条消息中不断更改?

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-05-05 22:10:54

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

有人能评论一下这是否明智吗?对我来说,它没有--怎么可能没有分支错误预测或指令缓存丢失统计数据,因为在多态代码行中,分支目标将在每条消息中不断更改? 这不能归因于编译器优化/内联,因为编译器不知道要优化的对象的子类型。

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

您可以查看埃里克·布鲁默的谈话的更多细节,从22:30分钟开始,他谈到了间接调用优化。

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

我建议查看函数调用的dis-程序集。它是使用vtable指针间接跳转到代码,还是通过一些优化避免vtable跳转。

如果编译器没有对调用进行优化,那么仍然有一些方法可以让CPU推测、挖掘分支目标缓冲器。例如,如果这个函数是在同一类型的对象上的一个紧循环中调用的,那么不管它是否是虚拟的,它的地址都可以被预测.

HTH。

票数 2
EN

Stack Overflow用户

发布于 2014-02-25 14:55:57

您不会看到分支错误地预测指令本身,因为样本将在分支之后的下一个指令上被“聚合”。

对于所有不精确的事件也是如此(最后没有_PS )。只要检查常规代码配置文件,就可以很容易地找到它。例如,如果有更高的可能性,人们会发现在一个简单的CPU_CLK_UNHALTED上有更多的add样本,而在一个重量级的imul上,它就出现在add之前。

为了查看事件发生的“确切”指令,您必须使用精确的事件(如BR_MISP_RETURED.ALL_BRANCHES_PS )。

我不是百分之百肯定这个“问题”的真实性质,我知道它应该是可能的,但出于某种原因,VTune抽样驱动程序的人不想这样做。我认识一个在过去6年里一直在努力解决这个问题的人,我每次查看asm VTune配置文件时都会考虑到这一点:)

PS。关于使用虚拟函数的原始测试。我也测试过它,它确实产生了很多分支错误预测。函数指针也是如此。修复它的一种方法是使用模板类,如果可能的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21982324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档