我认为,对 所有 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时间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)