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

标签 c++ performance x86 profiling intel-vtune

我能够使用“INST_RETIRED.ANY”事件通过 Vtune 分析我的 C++ 库的指令计数。

在整数/ float 加法、乘法、除法等方面可以使用哪些分析类型或事件?

最佳答案

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

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


与其说是VTUNE能做什么,不如说是硬件性能计数器能统计什么。例如this table of perf-counter events当我搜索 Sandybridge 性能计数器时,出现了来自 Linux oprofile 的内容。还有 this more-complete listing for Linux perf .如果硬件可以计算它,我想一​​旦您找到正确的名称,VTUNE 就可以向您展示它。

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

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

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


我认为您无法区分整数加法和整数乘法,或者 FP 加法和 FP mul。不过,您可以计算 FP 事件:FP_COMP_OPS_EXE“计算浮点事件的数量”,使用 x87 和 {packed,scalar}{single,double} 的掩码。

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

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

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


divide (div/divps) 足够慢,值得拥有一个特殊的计数器,不过:SnB 的 arith.fpu_div counter = "除法器被激活的次数,包括INT、SIMD和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 编译从普通机器代码到检测机器代码,其中检测是增加计数器的额外指令。它可能有其他操作模式,更像是单步执行原始代码并沿途计算内容。

关于c++ - 如何使用 vtune 分析加法、乘法等的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650210/

相关文章:

c++ - 链接 Bullet Physics 时出现编译错误

java - 为数据类型分配相同的值是否会降低效率?

performance - 使用查找表或左/右位移位来获得 2 整数次方哪个更快?

assembly - 汇编代码解释

x86 - 反汇编一条 'faddl'指令

当程序从终端运行时,clock_gettime 需要更长的时间来执行

c++ - 将位置写入纹理 OpenGL/GLSL

c++ - C包括守卫

c++ - 尝试使用特定模式对列表进行排序时遇到问题

c++ - 如何执行用c++编写的程序的运行时间?