1

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

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

4

1 回答 1

1

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

另请注意,这imul不是一项昂贵的操作,FP mul 几乎不比 add 贵。例如,在 Skylake 上,mulpsaddpsfma都具有相同的性能(吞吐量、延迟、微指令和执行端口的选择)。在 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_STALLSwith 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 编译来工作,其中检测是增加计数器的额外指令。它可能有其他操作模式,更像是单步执行原始代码并沿途计算内容。

于 2016-04-16T00:52:02.623 回答