当前位置: 首页 > 面试题库 >

如何监控SIMD指令的使用量

冀弘厚
2023-03-14
问题内容

如何监视进程的SIMD(SSE,AVX,AVX2,AVX-512)指令使用量?例如,htop可用于监视常规CPU使用率,但不能监视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 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不算在内。)

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

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

尽管如此,它还是受硬件支持的,因此htop,如果您使其长期运行,它对于某些东西来说可能足够便宜而不会浪费很多CPU时间。



 类似资料:
  • 有没有我们可以用来进行指令集检测的宏? 我知道我们有运行时程序: 但我们是否已经定义了这方面的符号,例如。 如果没有,我们可以创建一个或我们有一个解决办法吗? 在玩反编译器的时候,我发现了一个奇怪的“递归”。但我想ILSpy漏了。 此外,当我查看一个简单的代码时,我注意到以下内容: ASM 正如您所看到的,它不知怎么弄明白了Avx是受支持的,并且不包括分支。这是正常和明确的行为吗?

  • 在C/C中,可以对SIMD(如AVX和AVX2)指令使用内部函数。有没有办法在Rust中使用SIMD?

  • 我有int的向量,我需要找到并用特定的值替换一些元素。他们都是一样的 例如:将所有元素的4替换为8。 我正在尝试c中循环中的直接内存访问。但对我来说还是很慢。 更新: 我正在上使用OpenCV对象: 函数仅在释放模式下通过指针返回值

  • 我想尝试使用SIMD指令编写一个atoi实现,以包含在RapidJSON(一个C JSON阅读器/写入器库)中。它目前在其他地方进行了一些SSE2和SSE4.2优化。 如果是速度增益,可以并行完成多个结果。这些字符串最初来自JSON数据的缓冲区,因此多原子函数必须执行任何所需的滑动。 我提出的算法如下: 我可以用以下方式初始化长度为N的向量:[10^N..10^1] 我将缓冲区中的每个字符转换为一

  • 问题内容: 我需要大致了解一下在高性能数字代码中使用Cython可以获得的性能。我感兴趣的一件事是找出优化的C编译器是否可以向量化Cython生成的代码。因此,我决定编写以下小示例: 我知道有Numpy函数可以完成这项工作,但是我想编写一个简单的代码来了解Cython的功能。事实证明,生成的代码是: 并致电: 生成一个看起来像这样的C代码循环: 此代码的主要问题是,编译器在编译时不知道数组的元素在

  • 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑。所以,依靠强大的监控系统,收集尽可能多的指标,意义重大。但哪些指标才是有意义的呢,本着从实践中来的思想,各位工程师在长期摸爬滚打中总结出来的经验最有价值。 在各位运维工程师长期的工作实践中,我们总结了在系统运维过程中,经常会参考的一些指标,主要包括以下几个类别: CPU Load 内存 磁盘 IO 网络相关 内核参数 ss 统计输出 端口采