我可以使用' INST_RETIRED.ANY'使用Vtune来分析我的C ++库的指令计数。事件
可以使用哪些分析类型或事件在整数/浮点数加法,乘法,除法等方面进行分析?
答案 0 :(得分:1)
(tl:dr):我不认为你可以用perf计数器做你想做的一切。有关使用二进制检测的可能方法,请参阅本答案的结尾
另请注意,imul
并不是一项昂贵的操作,而且FP mul比添加更加昂贵。例如在Skylake上,mulps
,addps
和fma
都具有相同的性能(吞吐量,延迟,uops和执行端口选择)。在Skylake之前,添加的是较低的延迟,但也是一半的吞吐量,因为这是一个专用的添加单元。
VTUNE可以做的事情并不像硬件性能计数器可以计算的那么多。例如当我搜索Sandybridge perf计数器时,来自Linux oprofile的this table of perf-counter events出现了。 this more-complete listing for Linux perf
也是Intel's Pin。如果硬件可以计算,我会假设VTUNE可以在找到正确名称后向您显示。
在具有已知行为的简单代码上测试这些计数器,以确保它们在您已经知道代码正在执行的操作时以您期望的方式工作。
我只看了Sandybridge支持的内容。我假设Haswell / Skylake也有这些事件,可能还有更多。你没有说出你拥有的CPU,所以我不会检查所有的CPU。
Pre-SnB几乎没有选择性能计数器,IIRC。英特尔在SnB中改进了很多性能计数器,以及核心的其他重大变化。足够大,它通常被认为是一个新的微架构系列,与P6系列(PPro-Nehalem)分开。
我不认为您可以区分整数添加与整数mul,或FP添加FP mul 。但是,您可以计算FP活动:FP_COMP_OPS_EXE
"计算浮点事件的数量",使用x87的掩码和{packed,scalar} {single,double}。
还有SIMD_FP_256
,它只计算256b矢量FP操作。
有一个FP辅助事件的计数器(当FP操作需要回退到微码以处理非正规事件时)。
我不确定这是否正确,但是perf
列表显示' sa PARTIAL_RAT_STALLS
与Umask-02:0x80:[MUL_SINGLE_UOP]
:Number of Multiply packed / scalar单精度uops已分配。奇怪的是,那里没有类似的双精度计数器。或者mulss
在部分寄存器行为中可能有些特殊,PARTIAL_RAT_STALLS有另一个子偶数来计算部分寄存器合并微量。
除以(div
/ divps
)足够慢,值得拥有一个特殊的计数器,但是: SnB' arith.fpu_div
计数器 =& #34;分频器激活的次数,包括INT,SIMD和FP。"还有一个周期数的计数器,分频器处于活动状态,而不是激活它的次的数量。
{{3}}是IA-32和x86-64指令集架构的动态二进制检测框架,可以创建动态程序分析工具
我没有VTUNE,但可能有办法在VTUNE中使用Pin工具。它会使您的代码运行速度变慢,可能会慢得多。我认为它可以通过JIT编译从正常的机器代码到已检测的机器代码,其中检测是增加计数器的额外指令。它可能有其他操作模式,更像是单步执行原始代码并沿途计算内容。