我可以使用“INST_RETIRED.ANY”事件通过 Vtune 分析我的 C++ 库的指令计数。
根据整数/浮点加法、乘法、除法等的数量,可以使用哪些分析类型或事件?
我可以使用“INST_RETIRED.ANY”事件通过 Vtune 分析我的 C++ 库的指令计数。
根据整数/浮点加法、乘法、除法等的数量,可以使用哪些分析类型或事件?
(tl:dr):我不认为你可以用性能计数器做任何你想做的事情。有关使用二进制检测的可能方法,请参阅此答案的结尾
另请注意,这imul
不是一项昂贵的操作,FP mul 几乎不比 add 贵。例如,在 Skylake 上,mulps
、addps
和fma
都具有相同的性能(吞吐量、延迟、微指令和执行端口的选择)。在 Skylake 之前,添加延迟更低,但吞吐量也减半,因为有一个专用的添加单元。
与其说 VTUNE 可以做什么,不如说硬件性能计数器可以计数。例如,当我搜索 Sandybridge 性能计数器时,出现了来自 Linux oprofile的性能计数器事件表。还有这个更完整的 Linux 清单perf
。如果硬件可以计算它,我假设 VTUNE 可以将它显示给您,一旦您找到正确的名称。
在具有已知行为的简单代码上测试这些计数器,以确保它们在您已经知道代码在做什么时按照您期望的方式工作。
我只查看了 Sandybridge 支持的内容。我认为 Haswell/Skylake 也有这些事件,而且可能更多。你没有说你有什么 CPU,所以我不会检查所有这些。
Pre-SnB 的性能计数器 IIRC 几乎没有那么多选择。英特尔在 SnB 中改进了很多性能计数器,以及对内核的其他重大更改。它足够大,通常被认为是一个新的微架构家族,与 P6 家族 (PPro-Nehalem) 分开。
我认为您无法区分整数 add 与 integer mul 或 FP add 与 FP mul。不过,您可以计算 FP 活动:FP_COMP_OPS_EXE
“计算浮点事件的数量”,带有 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 single precision uops 分配。奇怪的是没有类似的双精度计数器。或者也许mulss
在部分寄存器行为中有些特殊,PARTIAL_RAT_STALLS 有另一个子甚至可以计算部分寄存器合并 uops。
除法 ( div
/ divps
) 足够慢,值得拥有一个特殊的计数器,但是: SnB 的arith.fpu_div
计数器= "除法器被激活的次数,包括 INT、SIMD 和 FP。" 还有一个计数器用于分频器处于活动状态的周期数,而不是它被激活的次数。
Intel 的 Pin是一个用于 IA-32 和 x86-64 指令集架构的动态二进制检测框架,可以创建动态程序分析工具
我没有 VTUNE,但可能有一些方法可以从 VTUNE 中使用 Pin 工具。它会使你的代码运行得更慢,甚至可能更慢。我认为它可以通过从普通机器代码到检测机器代码的 JIT 编译来工作,其中检测是增加计数器的额外指令。它可能有其他操作模式,更像是单步执行原始代码并沿途计算内容。