xuh*_*dev 1 linux intel cpu-usage
如何监控进程的 SIMD(SSE、AVX、AVX2、AVX-512)指令使用量?例如,htop可用于监控一般的 CPU 使用情况,但不是专门的 SIMD 指令使用情况。
我认为计算所有SIMD 指令(不仅仅是 FP 数学)的唯一可靠方法是动态检测(例如通过英特尔 PIN/SDE 之类的东西)。
请参阅如何通过获取指令类型细分来表征工作负载?以及如何确定在 C 程序中执行的 x86 机器指令的数量?专门sde64 -mix -- ./my_program为您的程序打印指令组合,以使用 AVX 与不使用 AVX 编译的 libsvm 中的示例输出
如果甚至可以安全地附加到已经运行的进程,尤其是多线程一次,我认为没有什么好方法可以使之像top/一样htop。
也可以使用 last-branch-record 来记录/重建执行路径并计算所有内容来获取动态指令计数,但我不知道有什么工具可以做到这一点。从理论上讲,它可以附加到已经运行的程序上而没有太大的危险,但需要大量计算(反汇编和计数指令)才能对所有正在运行的进程即时执行。不像只是询问内核它在上下文切换时跟踪的 CPU 使用统计信息。
您需要硬件指令计数支持才能真正高效top。
特别是对于 SIMD浮点数学(不是 FP shuffle,只是真正的 FP 数学,如vaddps),有性能计数器事件。
例如从perf list输出:
fp_arith_inst_retired.128b_packed_single
[已停用的 SSE/AVX 计算 128 位打包单精度浮点指令的数量。每个计数代表 4 次计算。适用于 SSE* 和 AVX* 压缩单精度浮点指令:ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP 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
# fixme: that brace-expansion doesn't expand properly; it separates with spaces not commas.
Run Code Online (Sandbox Code Playgroud)
(故意省略,fp_arith_inst_retired.scalar_{double,single}因为您只询问了 SIMD,而 XMM 寄存器上的标量指令不算在内,IMO。)
(您可以将perf使用到正在运行的进程-p PID,而不是一个命令。 或者使用perf top在看到建议Ubuntu的-如何判断AVX和SSE,是当前正在使用的CPU的应用程序?
perf stat -a无论正在执行什么进程,您都可以运行以在所有内核中进行全局监控。但同样,这仅计算 FP 数学,而不是一般的 SIMD。
尽管如此,它是硬件支持的,因此htop如果长期运行,它可能足够便宜,可以使用而不会浪费大量 CPU 时间。