【发布时间】:2013-11-24 02:58:00
【问题描述】:
为了分析执行时间的某些属性,我打算在一个程序的单独执行中同时使用Perf 和PIN 来获取我的所有信息。 PIN 会给我指令混音,Perf 会给我这些混音的硬件性能。作为健全性检查,我分析了以下命令行参数:
g++ hello_world.cpp -o hello
所以我完整的命令行输入如下:
perf stat -e cycles -e instructions g++ hello_world.cpp -o hello
pin -t icount.so -- g++ hello_world.cpp -o hello
在 PIN 命令中,为了这篇文章,我忽略了文件的所有路径内容。此外,我更改了基本的icount.so,除了默认的动态指令计数外,还记录指令混合。结果大相径庭
PIN Results:
Count 1180608
14->COND_BR: 295371
49->UNCOND_BR: 21869
//skipping all of the other instruction types for now
Perf Results:
20,538,346 branches
105,662,160 instructions # 0.00 insns per cycle
0.072352035 seconds time elapsed
这应该通过具有大致相同的指令数和大致相同的分支分布来作为健全性检查。 为什么动态指令计数会相差 x100 倍?! 我原以为会有一些噪音,但这有点多。
此外,Perf 的分支数量为 20%,但 PIN 报告约为 25%(这似乎也有一点差异,但这可能只是大量指令计数失真的副作用)。
【问题讨论】:
-
g++ 内部启动了很多程序:cc1 编译器本身,作为汇编器,ld 链接器。将
-v选项添加到 g++ 以查看所有子程序并尝试修改您的 g++ 命令以仅启动单个工具,例如-c(编译器+汇编器)或-S(编译器)。
标签: linux profiling performancecounter perf intel-pin