assembly - 为什么执行的 AVX 指令数量会随着处理器系列的不同而变化

标签 assembly performancecounter avx icc

我使用内部函数实现了一个简单的 AVX 程序,该程序是使用 icc 和 -march=core-avx2 -O3 进行编译的。该程序不支持多线程。

在分析程序的执行时,我使用 PAPI 库测量了实际执行的 AVX(256 位浮点运算)的数量。

当我在不同的处理器(即 Sandy Bridge、Haswell 和 Skylake 的 Core-i7)上执行程序时,SB 和 Skylake 架构的执行指令数几乎相同,但 Haswell 架构的执行指令数更高(+50%)。

据我了解,生成的汇编指令在架构之间没有差异,因为未使用 -march=native

执行操作和写入操作的差异从何而来?是否有针对某些硬件/指令的某种微代码模拟。或者是否发生了某些特定于架构的过度计数?

最佳答案

问题应至少分为两个问题:1)两次运行之间的计数器是否应该相同? 2)报告的数字可信吗?第一个问题解决了您的方法中可能存在的差异来源,第二个问题解决了您使用的工具的具体情况(PAPI 及其使用的底层硬件计数器)。

  1. 在两个系统上运行相同的二进制文件。不是从同一源编译的两个程序,而是复制到它们的相同的二进制文件。如果这将 AVX 指令的测量结果放在一起,那么问题就在于单独的编译会生成不同的代码。

  2. 简化程序代码,以便猜测结果的指令数。使用具有硬编码迭代次数的循环,内部有线性代码块,并且 PAPI 调用就在循环周围。这样,您就可以预测结果,并将其与报告的数字进行比较。您使用内部函数,因此人们可能会认为编译器优化不应影响从它们生成的代码。但将优化级别降低到 -O0 以确保编译器使用最少的技巧,例如动态处理器调度。

    使程序更加简单。在任何循环之外仅保留一条 AVX 指令。 PAPI 会报告什么?留下零个。 PAPI的报告是否仍符合预期?

这些技术应该足以从逻辑上推断出问题是否在于独立二进制文件的构建过程中的差异、不同硬件上的单个二进制文件中选择的运行时路径的差异、不正确的 PAPI 使用或普通的 PAPI 错误(可能是由底层硬件引起的)计数指令不可靠。顺便说一句,您没有显示任何代码,因此您很可能忘记初始化某些内容,或者迭代次数不同,或者方法中存在类似的遗漏。

关于assembly - 为什么执行的 AVX 指令数量会随着处理器系列的不同而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302962/

相关文章:

linux - NASM 除法使用变量而不是实际值

arrays - MIPS中的冒泡排序算法

assembly - 我对这次 assembly 的理解正确吗?

.net - Azure SDK 2.7.1 诊断配置

c++ - AVX指令中寄存器和指针的客观区别

c - 加速牛顿法求 n 次根的速度

c++ - 如何使用 SIMD 指令使预乘 alpha 函数更快?

c - GDB 脚本问题

c# - 在 C# 程序中,我试图获取应用程序的 CPU 使用率百分比,但它始终显示 100

asp.net - 最好监视的 ASP.NET 性能计数器是什么?