如何监控进程的SIMD (SSE,AVX,AVX2,AVX-512)指令的使用量?例如,htop
可以用于监视一般的CPU使用情况,但不能专门用于监视SIMD指令的使用情况。
发布于 2020-02-07 04:19:14
我认为计算所有SIMD指令(不仅仅是FP数学)的唯一可靠方法是动态测试(例如,通过像Intel PIN /SDE这样的工具)。
请参见sde64 -mix -- ./my_program
(特别是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? )以打印该运行的程序的指令组合,例如libsvm compiled with AVX vs no AVX中的输出。
如果能够安全地连接到已经运行的进程,特别是多线程一次,我不认为有一种好的方法可以像top
/ htop
这样。
可能还可以使用最后一个分支记录来获取动态指令计数,以记录/重构执行路径并对所有内容进行计数,但我不知道有哪些工具可用于此。理论上,这可以附加到已经运行的程序中,而不会有太大的危险,但是需要大量的计算(分解和计数指令)才能对所有正在运行的进程()进行实时计算。不只是向内核询问它在上下文开关上跟踪的CPU使用情况统计数据。
你需要硬件指令计数的支持,这样才能像top
那样有效。
对于SIMD浮点数学(不是FP洗牌,而是像vaddps
这样的实际FP数学),会有一些特殊的计数器事件。
例如,从perf list
输出:
fp_arith_inst_retired.128b_packed_single
SSE/AVX计算128位单精度浮点指令退役数。每个计数表示4个计算。适用于SSE*和AVX*打包的单精度浮点指令:添加子MUL、DIV、最小、最大RCP、RSQRT、SQRT、DPP、FM(N)、ADD / SUB。DPP和FM(N)添加/子指令在每个元素执行多个计算时计算两次
所以这根本不是在计算,而是在计算失败。对于每个版本的...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.
(海事组织,故意省略fp_arith_inst_retired.scalar_{double,single}
,因为您只询问了关于SIMD和XMM寄存器上的标量指令不算在内。)
(您可以通过使用perf
-p PID
而不是命令将附加到正在运行的进程。
您可以运行perf stat -a
来对所有内核进行全局监视,而不管正在执行的是什么进程。但同样,这只是计算FP的数学,而不是一般的SIMD。
尽管如此,它仍然是硬件支持的,因此,如果你让它长期运行,它就足够便宜,可以在不浪费大量CPU时间的情况下使用htop
。
https://stackoverflow.com/questions/60104698
复制相似问题