linux - 如何监控 SIMD 指令的使用量

标签 linux intel cpu-usage

如何监控进程的 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/

相关文章:

Linux、C、Gtk。一段时间后关闭窗口

带有线性插值的 x86 程序集衰落 bmp

android - WebView 在 WebViewCoreThread 后台使用 30%

c - 错误 : libtool - while compiling an MPI program

node.js - 当服务器作为 Linux 服务启动时,readFileSync 抛出错误

linux - Debian 中的硬件加速 NVidia 和 Intel 显卡

real-time - 是否可以将 core i7 用于硬实时操作系统?

iphone - RunWebThread 在 iPhone App 上占用 33% 的 CPU 时间

java - 在 Android 上查找应用程序的 CPU 使用率

c++ - GCC 和 MinGW (C++) 之间奇怪的输出差异