Visual studio 2015 Sandybridge和IvyBridge上的sse和avx表现

Visual studio 2015 Sandybridge和IvyBridge上的sse和avx表现,visual-studio-2015,sse,simd,avx,x86,Visual Studio 2015,Sse,Simd,Avx,X86,我正在SandyBridge处理器i7-3820上对一组应用程序进行基准测试。 基准测试由两个不同的版本组成。 这两个版本包含相同的代码,唯一的区别是第一个版本使用sse/sse2 instrinsics,第二个版本使用avx instrinsics 对于基准的编译,我使用的是Visual Studio 2015 在x64或x86上编译使用sse Instrinsic的版本时,执行时间几乎相同。但是,使用avx Instrinsic为x64编译基准测试时,执行时间比使用avx Instrinsi

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

对于基准的编译,我使用的是Visual Studio 2015

在x64或x86上编译使用sse Instrinsic的版本时,执行时间几乎相同。但是,使用avx Instrinsic为x64编译基准测试时,执行时间比使用avx Instrinsic和为x86编译的基准测试最差,几乎是两倍。此外,使用x86编译的avx基准测试的执行时间与sse instrinsics的基准测试相比仅成功提高了x8%的速度

最后,我在常春藤网桥处理器i7-3770上测试了上述配置,avx instrincis在x64和x86之间的执行时间是相同的。但与上证综指相比,avx intrinsics并未表现出任何改善

对于为x64编译的Sandy Bridge上的avx Instrinsic性能不佳,有什么解释吗

为什么这两种体系结构没有显示avx指令相对于sse指令的任何加速

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

提前谢谢

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

几乎可以肯定,从AVXSSE转换延迟,从

另见

x64二进制文件可能使用传统的SSE2指令进行标量FP运算。如果您在编译所有启用AVX的代码时,这些指令应该使用VEX编码。但仍然需要vzeroupper来调用库函数

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

编辑:,不是艾维布里奇,是我的错。如果您对SnB和IvB之间的区别感到好奇,请参阅和标签wiki

我想你是说AVX在你的IvB上比SSE更快。IvB的主要新特性之一是mov消除。它在重命名阶段以零延迟处理movdqa xmm、xmm寄存器->寄存器移动,而不需要执行单元

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


如果您想得到更多的答案,请将一些实际数字放在项目符号列表表中,这样我们就可以很容易地看到它们。

您也可以发布代码吗?这取决于您使用的是哪种AVX指令-有些指令与SSE指令相比没有任何好处。然而,没有看到你的代码,我们只能猜测,这不是很有建设性。请张贴相关代码,最好是a./arch:AVX效果大于矢量化,它允许vex编码指令,即如果您尝试使用没有/arch:AVX的AVX intrinsics,它将不起作用。s/instrinsics/intrinsics/gw为什么OP观察Sandy Bridge的过渡延迟,而不使用Ivy Bridge?OP写道,我在常春藤网桥处理器i7-3770上测试了上述配置,avx instrincis在x64和x86之间的执行时间相同。但与上证综指相比,avx intrinsics并未表现出任何改善。因此,可以推断,这意味着OP在常青藤桥上使用AVX时,x86-64的性能不会更差。@Zboson:哦,我甚至没有注意到他把自己的一个i7-3xxx CPU称为IvB。我看了看这些数字,发现它们都是IvB,所以我假设它们是同一个微芯片,没有听清他所说的性能差异。一些易于查看的格式(如项目符号列表或表格)的实际数字将大大有助于使这成为一个更好的问题。无论如何,如果OP在不同的计算机上使用不同的编译器或库,可能其中一个会自动执行vzeroupper?@Zboson:oops,我刚刚意识到i7-3820是Sandybridge-E。Intel有一个恼人的编号方案,其中-E部分与常规的下一代部分具有相同的前导数字。是的,OP应该包括一些代码和数字,其中任何一个都会有帮助。