Sandybridge和IvyBridge上的sse和avx性能

时间:2016-06-27 16:38:45

标签: visual-studio-2015 sse simd avx

我在SandyBridge处理器(i7-3820)上对一组应用程序进行基准测试。 该基准包含两个不同的版本。 这两个版本包含相同的代码,唯一的区别是第一个版本使用sse / sse2 instrinsics而第二个版本使用avx instrinsics。

为了编译基准测试,我正在使用Visual Studio 2015。

在x64或x86上使用sse instrinsics编译版本,执行时间几乎相同。但是用x64的avx instrinsics编译基准测试,执行时间最差(几乎是两倍),将基准测试与avx instrinsisc进行比较并为x86编译。此外,使用x86编译的avx基准测试的执行时间仅比sse instrinsics的基准测试成功率稍高(x8%)。

最后,我在Ivy Bridge处理器(i7-3770)上测试了上述配置,并且对于avx instrincis,x64和x86之间的执行时间是相同的。但是avx内在函数没有显示出对sse的任何改进。

是否有任何关于avx instrinsics在Sandy Bridge上用于编译x64的糟糕性能的解释?

为什么两个体系结构没有显示针对sse指令的avx指令的任何加速?

此外,我尝试了从arch:AVX到/ arch:SSE2的不同编译切换,反之亦然,但在执行时没有任何改变。但如果我是对的,那么visual studio中的“启用增强指令集”属性只会影响矢量化。

提前致谢。

1 个答案:

答案 0 :(得分:2)

  

使用avx instrinsics为x64编译基准测试,执行时间最差

几乎可以肯定来自mixing legacy SSE with 256bit AVX instructions without a vzeroupper的AVX< - > SSE转换延迟。

另见Using AVX CPU instructions: Poor performance without "/arch:AVX"

x64二进制文件可能使用传统的SSE2指令进行标量FP数学运算。如果在启用AVX的情况下编译 all 您的代码,那些指令应使用VEX编码。但是你仍然需要vzeroupper来调用库函数。

您的x86 32位二进制文​​件可能不会在AVX函数之间使用任何传统的SSE2指令,甚至可能在库函数调用中也不会。

编辑:i7-3820 is 32nm SandyBridge-E,而不是IvyBridge,我的错误。如果您对SnB和IvB之间的区别感到好奇,请参阅Agner Fog's microarch pdf标记维基。

我认为你说AVX在你的IvB上比SSE更快。 IvB的主要新功能之一是mov-elimination。它在重命名阶段处理movdqa xmm,xmm register->寄存器移动,延迟为零,无需执行单元。

如果您只在一台计算机上看到AVX转换延迟,可能您正在使用不同的库或编译器版本进行编译。

如果您想要更多答案,请在项目符号列表中放置一些实际数字,以便我们轻松查看。