如何监控SIMD指令的使用量
如何监视进程的SIMD(SSE,AVX,AVX2,AVX-512)指令使用量?例如,htop
可用于监视常规CPU使用率,但不能监视SIMD指令使用率。
回答:
我认为,对 所有 SIMD指令(不仅仅是FP数学)进行计数的唯一可靠方法是动态检测(例如,通过诸如Intel PIN / SDE之类的方法)。
请参阅如何通过获取指令类型明细来表征工作负载?以及如何确定在C程序中执行的x86机器指令的数量?专门为该运行 ,例如使用AVX编译的libsvm中的示例输出vs没有AVX
我不认为有什么办法可以像top
/ 那样htop
使它安全地附加到已经在运行的进程中,尤其是一次多线程。
也可以使用上一个分支记录的东西来获取动态指令计数,以记录/重构执行路径并计算所有内容,但是我不知道用于此目的的工具。从理论上讲,它可以附加到已经在运行的程序上而没有太大的危险,但是。不仅仅只是询问内核有关上下文切换的CPU使用情况统计信息。
您需要硬件指令计数支持,这样才能真正有效top
。
特别是对于SIMD 浮点数学运算 (不是FP随机播放,只是像FP这样的真实FP数学vaddps
),存在性能计数器事件。
例如从perf list
输出:
fp_arith_inst_retired.128b_packed_single
[已淘汰的SSE / AVX计算128位压缩单精度浮点指令的数量。 。适用于SSE 和AVX
打包的单精度浮点指令:ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD /
SUB。DPP和FM(N)ADD / SUB指令计数两次,因为它们对每个元素执行多次计算]
因此,它甚至不算微指令,而是指FLOPS。...pd
压缩双精度型还有其他事件,每个都有256位版本。(我假设在具有AVX512的CPU上,这些事件也有512位向量版本。)
您可以perf
用来统计它们在整个进程中以及在所有内核上的执行情况。或用于单个过程
## count math instructions only, not SIMD integer, load/store, or anything elseperf 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不算在内。)
( 或者按照SeeUbuntu中的建议 -如何确定CPU应用程序当前是否正在使用AVX或SSE?
您可以运行perf stat -a
全局监视所有内核,而不管正在执行什么进程。再次强调,这仅涉及FP数学,一般而言不包括SIMD。
尽管如此,它还是受硬件支持的,因此htop
,如果您使其长期运行,它对于某些东西来说可能足够便宜而不会浪费很多CPU时间。
以上是 如何监控SIMD指令的使用量 的全部内容, 来源链接: utcz.com/qa/412188.html