当前Intel CPU是否有整数性能计数器?稀疏矩阵计算性能测量问询
Intel CPU整数性能计数器相关问题解答
嘿,这俩问题我刚好有不少实践经验,给你详细拆解下:
1. 当前Intel CPU是否存在整数性能计数器?
那必须有啊!Intel从Nehalem之后的主流CPU架构开始,就配备了和浮点/双精度计数器并行的、完善的整数性能监控事件——只是平时大家更关注浮点计算性能,所以这些整数计数器容易被忽略而已。
2. 稀疏矩阵-矩阵计算的整数性能测量方案
针对你想统计的整数加法、乘法、融合加乘(FMA)、比较操作,Intel CPU确实有对应的性能事件。至于你用likwid-perfctr没找到,大概率是事件名称的架构差异性导致的——不同Intel架构的性能事件命名区别很大,而且有些事件需要指定正确的PMU(性能监控单元)或者用架构专属的别名,不是通用的名字。
下面给你整理主流架构(Skylake、Ice Lake、Sapphire Rapids)对应的常见可用事件:
- 整数加法/通用整数运算:
- 通用兜底:
INST_RETIRED.ANY可以统计所有退休指令,要是想精准过滤加法,还能结合OPCODE_MASK指定加法类指令的操作码; - 架构专属:Skylake上用
ALU_INST_RETIRED.ADD,Ice Lake及之后可以用INT_ALU_OPS.ADD,都是直接统计退休的整数加法指令数。
- 通用兜底:
- 整数乘法:
- Skylake及后续:用
ALU_INST_RETIRED.MUL统计退休的整数乘法指令;Ice Lake+可以用INT_MUL_OPS.ALL,还能看UOPS_EXECUTED.INT_MUL统计实际执行的乘法微操作数。
- Skylake及后续:用
- 整数融合加乘(FMA):
- 注意:Intel只有Ice Lake及之后的架构支持硬件整数FMA,对应的事件是
INT_FMA_OPS.ALL或者ALU_INST_RETIRED.FMA;要是你用的是Skylake这类更早的架构,整数FMA都是软件模拟的,这时候得同时统计加法+乘法的指令数来间接估算。
- 注意:Intel只有Ice Lake及之后的架构支持硬件整数FMA,对应的事件是
- 整数比较操作:
- 这类操作要么跟着分支走,要么归类在ALU操作里:可以用
BR_INST_RETIRED.CONDITIONAL统计条件分支(很多比较操作后会触发分支),部分架构也有ALU_INST_RETIRED.CMP直接统计退休的比较指令;也可以用INST_RETIRED.OPCODE_MASK精准过滤比较类指令的操作码。
- 这类操作要么跟着分支走,要么归类在ALU操作里:可以用
为啥likwid-perfctr没找到这些事件?
可能是这几个原因:
- 你用了通用事件组,没指定架构专属事件:likwid的事件组是分架构的,用
likwid-perfctr -a能列出当前CPU架构支持的所有事件,或者直接用likwid-perfctr -e <事件名>指定单个事件; - 权限不够:有些性能事件需要root权限才能读取,或者得把
sysctl kernel.perf_event_paranoid设为0或-1(宽松模式),不然会被系统限制访问; - 选了错误的PMU:有些整数事件只能在核心PMU(core PMU)上读取,不能用uncore PMU的事件组。
实操小建议
- 先确认你的CPU架构:用
cat /proc/cpuinfo | grep model name或者likwid-topology就能拿到详细信息; - 筛选整数相关事件:
likwid-perfctr -a | grep -i int或者likwid-perfctr -a | grep -i alu,能快速定位所有整数/ALU相关的事件; - 测试单个事件:比如统计整数加法,就跑
likwid-perfctr -e ALU_INST_RETIRED.ADD ./your_sparse_matrix_program(记得根据你的架构调整事件名); - 备选工具:如果likwid用着不顺,还可以试试
perf工具(和likwid底层都是用perf_event_open接口),比如perf stat -e alu_inst_retired.add ./your_program,有时候它的事件命名更直观。
内容的提问来源于stack exchange,提问作者Simon




