如何监控进程的 SIMD(SSE、AVX、AVX2、AVX-512)指令使用量?例如,htop
可用于监控一般 CPU 使用情况,但不能监控具体的 SIMD 指令使用情况。
最佳答案
我认为计算所有 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 中
如果甚至可以安全地附加到已经运行的进程,尤其是多进程,我认为没有一个好的方法可以使之像 top
/htop
那样。线程一次。
也可能使用最后分支记录的东西来记录/重建执行路径并计算所有内容来获取动态指令计数,但我不知道有什么工具可以做到这一点。理论上,可以附加到已经运行的程序而没有太大危险,但是需要大量计算(反汇编和计数指令)才能为所有正在运行的进程动态执行此操作。不像只是向内核询问它在上下文切换时跟踪的 CPU 使用统计信息。
您需要硬件指令计数支持才能像 top
那样真正高效。
对于 SIMD float 学(不是 FP 洗牌,只是真正的 FP 数学,如 vaddps
),有性能计数器事件。
例如来自性能列表
输出:
fp_arith_inst_retired.128b_packed_single
[Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element]
所以它甚至不计算 uops,而是计算 FLOPS。还有其他针对 ...pd
打包 double 事件以及每个事件的 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
# fixme: that brace-expansion doesn't expand properly; it separates with spaces not commas.
(故意省略 fp_arith_inst_retired.scalar_{double,single}
因为您只询问了 XMM 寄存器上的 SIMD 和标量指令,IMO。)
(您可以使用 -p PID
而不是命令将 perf
附加到正在运行的进程。或者使用 perf top
如建议的那样
请参阅Ubuntu - how to tell if AVX or SSE, is current being used by CPU app?
您可以运行 perf stat -a
来全局监控所有内核,无论正在执行什么进程。但同样,这仅计算 FP 数学,而不是一般的 SIMD。
不过,它是硬件支持的,因此对于 htop
之类的东西来说足够便宜,如果你让它长期运行的话,不会浪费大量的 CPU 时间。
关于linux - 如何监控 SIMD 指令的使用量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60104698/