为什么执行的AVX指令数随处理器系列

时间:2018-03-15 15:07:40

标签: assembly performancecounter avx icc

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

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

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

据我所知,生成的汇编程序指令在体系结构之间没有差异,因为未使用-march=native

执行和编写的操作的区别来自哪里?某些硬件/指令是否存在某种微代码仿真。或者是否存在一些特定于体系结构的过度计数?

1 个答案:

答案 0 :(得分:3)

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

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

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

    使程序更简单。在任何循环外只留下一条AVX指令。 PAPI将报告什么?留下他们的零。 PAPI的报告是否仍符合预期?

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