如何使用 vtune 分析加法、乘法等的数量

How to profile the number of additions, mutltiplications etc. with vtune

我可以使用 'INST_RETIRED.ANY' 事件通过 Vtune 分析我的 C++ 库的指令计数。

根据 integer/floating 点加法、乘法、除法等的数量,可以使用哪些分析类型或事件?

(tl:dr):我不认为你可以用性能计数器做任何你想做的事情。有关使用二进制检测的可能方法,请参阅此答案的结尾

另请注意,imul 不是一个昂贵的操作,FP mul 仅比 add 昂贵。例如在 Skylake 上,mulpsaddpsfma 都具有相同的性能(吞吐量、延迟、微指令和执行端口的选择)。在 Skylake 之前的版本上,添加的延迟较低,但吞吐量只有一半,因为有一个专用的添加单元。


与其说是VTUNE能做什么,不如说是硬件性能计数器能统计什么。例如this table of perf-counter events from Linux oprofile came up when I searched for Sandybridge perf counters. Also this more-complete listing for Linux perf。如果硬件可以算,我想 VTUNE 可以给你看,一旦你找到了正确的名字。

在具有已知行为的简单代码上测试这些计数器,以便在您已经知道代码正在做什么时确保它们按照您期望的方式工作。

我只浏览了 Sandybridge 支持的内容。我假设 Haswell/Skylake 也有这些事件,而且可能更多。你没有说你有什么CPU,所以我不会检查所有的。

Pre-SnB 没有那么广泛的性能计数器选择,IIRC。英特尔在 SnB 中大大改进了性能计数器,同时对内核进行了其他重大更改。足够大以至于它通常被认为是一个新的微体系结构系列,与 P6 系列 (PPro-Nehalem) 分开。


我认为您无法区分整数加法和整数乘法,或者 FP 加法和 FP mul。您可以计算 FP activity,但是:FP_COMP_OPS_EXE "Counts number of floating point events",使用 x87 和 {packed,scalar}{single,double} 的掩码。

还有 SIMD_FP_256,它只计算 256b 向量 FP 操作。

有一个用于 FP 辅助事件的计数器(当 FP 操作需要回退到微码以处理异常或其他事件时)。

我不确定这是否正确,但 perf 列表显示有一个 PARTIAL_RAT_STALLS with Umask-02 : 0x80: [MUL_SINGLE_UOP]: Number of Multiply packed/scalar 已分配单精度微指令。奇怪的是没有类似的双精度计数器。或者也许 mulss 在部分寄存器行为中有某种特殊之处,PARTIAL_RAT_STALLS 有另一个子偶数来计算部分寄存器合并 uops。


divide (div / divps) 足够慢,值得拥有一个特殊的计数器,但是:SnB 的 arith.fpu_div 计数器 = "Number of times that the divider is actived, includes INT, SIMD and FP." 还有一个计数器,用于计数 周期数 分频器处于活动状态,而不是它被激活的 数。


如何计算指令:

Intel's Pin is a dynamic binary instrumentation framework for the IA-32 and x86-64 instruction-set architectures that enables the creation of dynamic program analysis tools

我没有 VTUNE,但可能有一些方法可以在 VTUNE 中使用 Pin 工具。它会让你的代码 运行 变慢,可能会慢很多。我认为它的工作原理是通过 JIT 编译从普通机器代码到检测机器代码,其中检测是增加计数器的额外指令。它可能有其他操作模式,更像是单步执行原始代码并沿途计算内容。