如何监控SIMD指令的使用量

如何监控SIMD指令的使用量,第1张

如何监控SIMD指令的使用量

我认为,对 所有 SIMD指令(不仅仅是FP数学)进行计数的唯一可靠方法是动态检测(例如,通过诸如Intel PIN / SDE之类的方法)。

请参阅如何通过获取指令类型明细来表征工作负载?以及如何确定在C程序中执行的x86机器指令的数量?专门为该运行

sde64 -mix -- ./my_program

打印程序的指令混合
,例如使用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位压缩单精度浮点指令的数量。 每个计数代表4个计算 。适用于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不算在内。)

您可以

perf
使用
-p PID
而不是命令来附加到正在运行的进程。
或者按照SeeUbuntu中的建议 使用
perftop
-如何确定CPU应用程序当前是否正在使用AVX或SSE?

您可以运行

perf stat -a
全局监视所有内核,而不管正在执行什么进程。再次强调,这仅涉及FP数学,一般而言不包括SIMD。

尽管如此,它还是受硬件支持的,因此

htop
,如果您使其长期运行,它对于某些东西来说可能足够便宜而不会浪费很多CPU时间。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5006587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存