如何监视进程的SIMD(SSE,AVX,AVX2,AVX-512)指令使用量?例如,htop
可用于监视常规CPU使用情况,但不能专门用于监视SIMD指令使用情况。
我认为对all SIMD指令(不仅仅是FP数学)进行计数的唯一可靠方法是动态检测(例如,通过诸如Intel PIN / SDE之类的东西)。
请参见How to characterize a workload by obtaining the instruction type breakdown?和How do I determine the number of x86 machine instructions executed in a C program?,特别是[sde64 -mix -- ./my_program
以打印程序的指令组合]对于该运行,示例输出为libsvm compiled with AVX vs no AVX
[使用上次分支记录的东西来记录/重构执行路径并计算所有内容,但也可能不知道使用什么工具。
特别是对于SIMD 浮点数学(不是FP随机播放,只是像vaddps
这样的真实FP数学),有性能计数器事件。
例如从perf list
输出:
fp_arith_inst_retired.128b_packed_single
[SSE / AVX计算的128位压缩单精度数浮点指令已退休。 每个数字代表4计算。适用于SSE *和AVX *打包的单精度浮点指令:ADD SUB MUL DIV MIN MAX RCP RSQRT SQRTDPP FM(N)ADD / SUB。 DPP和FM(N)ADD / SUB指令的计数是他们对每个元素执行多次计算]
因此,它甚至没有计算uops,而是计算FLOPS。 ...pd
压缩双精度型还有其他事件,每个事件都有256位版本。 (我假设在具有AVX512的CPU上,这些事件也有512位向量版本。)
您可以使用perf
来统计它们在进程之间以及在所有内核上的执行情况。或对于单个过程
## count math instructions only, not SIMD integer, load/store, or anything else
perf stat -e cycles:u,instructions:u,fp_arith_inst_retired.{128,256}b_packed_{double,single}:u ./my_program
(有意省略fp_arith_inst_retired.scalar_{double,single}
,因为您只询问过XMM寄存器上的SIMD和标量指令,IMO不计。]