- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在分析处理数百万条消息的两种设计之间的差异。一种设计使用多态性,而另一种则不使用 - 每条消息都将由多态子类型表示。
我已经使用 VTune 分析了这两种设计。高级摘要数据似乎是有道理的——与使用 IF 语句实现的非多态版本相比,多态设计具有更高的“分支预测错误”率、更高的 CPI 和更高的“ICache 未命中”率。
多态设计有一行源码是这样的:
object->virtualFunction();
这被调用了数百万次(每次子类型都会改变)。由于分支目标预测错误/指令未命中,我预计多态设计会变慢。如上所述,VTune 的“摘要”选项卡似乎证实了这一点。但是,当我转到源代码行旁边的指标时,绝对没有指标,除了:
分支预测列都没有数据,指令缓存也没有遗漏列??
有人可以评论一下这是否合理吗?对我来说,它没有——对于一行多态代码,在每条消息中分支目标不断变化的情况下,怎么可能没有分支预测错误或指令缓存未命中统计信息呢?
这不可能是编译器优化/内联造成的,因为编译器不知道要优化的对象的子类型。
我应该如何使用 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/
我正在为我的 linux 应用程序热点收集使用 Intel(R) VTune(TM) Amplifier XE 2013 Update 5 (build 274450),但报告说“[在任何已知模块之外
我过去用过几次vtune,通常没有太大的麻烦。不幸的是,每次使用之间的间隔通常太长,以至于我每次都忘记了如何使用它的某些方面。我知道行号和符号信息需要以某种方式存储。我以为只需要用“程序数据库”(/Z
在以前版本的 VTune 中,有一个名为 dsep.exe 的程序,可用于从 VTune 定期轮询硬件计数器(特别与 DRAM 读/写相关)。这使我能够及时收集有关每个实例的计数器数据,而不是在最后汇
我正在分析处理数百万条消息的两种设计之间的差异。一种设计使用多态性,而另一种则不使用 - 每条消息都将由多态子类型表示。 我已经使用 VTune 分析了这两种设计。高级摘要数据似乎是有道理的——与使用
我正在将小型库的使用添加到现有的大型软件中,并希望分析(在查找器中的详细信息,而不仅仅是输入和输出 rdtsc() 或 gettimeofday 调用)小型库的开销及其属性。使用 rdtsc() 之类
我正在使用 Intel Vtune 进行一些分析:内存访问、访问争用等,但我收到此错误:无法显示数据。无法显示数据:没有适用于数据的视口(viewport)。 我使用的是 Debian 6、Intel
我有一个程序,其基本结构如下: main() { some malloc() allocations and file reads into these buffers call t
我有一个程序,其基本结构如下: main() { some malloc() allocations and file reads into these buffers call t
使用英特尔 Vtune 分析数据包处理应用程序。 仅此说明中的时间利用率很低 add $0x100, %r8 (7%) 单个 if 检查的时间利用率很低 if(unlikely(VALUE == so
我发现有些代码非常慢(将 10 秒的应用程序变成 60 秒的应用程序)。我发现使用“随机暂停应用程序并查看它在哪里”技巧的慢速代码。慢速代码位于检查许可证服务器是否有有效许可证的第 3 方许可功能调用
这是对现有线程的跟进 (http://stackoverflow.com/questions/12724887/caching-in-a-high-performance-financial-appl
浏览完有关分析工具的所有问题后,我惊讶地发现VTune by Intel我以前没听说过。 700美元,比AQTime还要贵. 但是在我决定为 AQTime 投入大笔资金之前,是否有人使用过 Delph
我能够使用“INST_RETIRED.ANY”事件通过 Vtune 分析我的 C++ 库的指令计数。 在整数/ float 加法、乘法、除法等方面可以使用哪些分析类型或事件? 最佳答案 (tl:dr)
我正在使用以下代码进行测试: const int num = 5000; int test[num][num]; int _tmain(int argc, _TCHAR* argv[]) {
有没有办法在 Intel VTune Amplifier XE 中多次运行相同的测试(例如轻量级热点)???多次单击以执行单个测试很烦人。我查看了文档,但一无所获。 谢谢! 最佳答案 有两点建议: 第
我已经安装了 Intel Vtune Analyzer 9 以从带有 AMD Turion X2 TL-58 处理器的 Windows 7 PC 上的 win32 应用程序中获取调用图和计数器监控
我刚刚开始使用英特尔 VTune Amplifier XE,看起来默认情况下只有 cpu 时间测量。是否可以设置 VTune 以根据挂钟时间(实时)获得结果?实际上我的目标是从磁盘 I/O 操作中获取
我正在使用 Intel Vtune 来分析需要在另一台机器上进行 sudo 访问的远程应用程序。之前我已经能够在不需要 sudo 访问的那台机器上分析远程应用程序,但英特尔 Vtune 不适用于需要
我正在使用英特尔 VTune Amplifier XE 2011 来分析我的程序的性能。我希望能够在分析结果中查看源代码,文档说我需要提供符号信息。不幸的是,它没有说明在编译我的程序时如何生成该符号信
我正在使用英特尔 VTune Amplifier XE 2011 来分析我的程序的性能。我希望能够在分析结果中查看源代码,文档说我需要提供符号信息。不幸的是,它没有说明在编译我的程序时如何生成该符号信
我是一名优秀的程序员,十分优秀!