【问题标题】:sse and avx performance on Sandybridge and IvyBridgeSandybridge 和 IvyBridge 上的 sse 和 avx 性能
【发布时间】:2016-10-29 18:28:15
【问题描述】:

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

为了编译基准,我使用的是 Visual Studio 2015。

在 x64 或 x86 上使用 sse instrinsics 编译版本,执行时间几乎相同。但是使用 avx instrinsisc 为 x64 编译基准测试,执行时间是最差的(几乎是两倍)与 avx instrinsisc 和为 x86 编译的基准相比。此外,与 sse instrinsics 的基准相比,使用 x86 编译的 avx benchmark 的执行时间仅成功了一小部分(x8%)。

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

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

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

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

提前致谢。

【问题讨论】:

  • 您也可以发布代码吗?
  • 这真的取决于您使用的 AVX 指令 - 有些指令与 SSE 等效指令相比没有任何好处。但是,如果没有看到您的代码,我们只能猜测,这不是很有建设性。请发布相关代码,最好是minimal reproducible example
  • /arch:AVX 不仅仅影响矢量化,它还允许使用 vex 编码指令,即如果您尝试使用没有 /arch:AVX 的 AVX 内部函数,它将无法工作。
  • s/instrinsics/intrinsics/g

标签: visual-studio-2015 sse simd avx


【解决方案1】:

用avx instrinsics for x64编译基准,执行时间最差

几乎可以肯定来自 AVXSSE 转换延迟,来自 mixing legacy SSE with 256bit AVX instructions without a vzeroupper

另见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 标签 wiki。

我认为您是说 AVX 在您的 IvB 上对 SSE 的加速作用较小。 IvB 的主要新功能之一是移动消除。它处理movdqa xmm,xmm register->寄存器在重命名阶段的移动,零延迟,不需要执行单元。

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

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

【讨论】:

  • 为什么 OP 观察到 Sandy Bridge 而不是 Ivy Bridge 的转换延迟? OP 写道:“我在 Ivy Bridge 处理器 (i7-3770) 上测试了上述配置,并且 avx instrincis 的 x64 和 x86 之间的执行时间是相同的。但是 avx 内在函数对 sse 没有任何改进。”因此推断这意味着 OP 在 Ivy Bridge 上使用 AVX 并没有看到更差的 x86-64 性能。
  • @Zboson:哦,我什至没有注意到他将他的一个 i7-3xxx CPU 称为 IvB。我查看了这些数字,发现它们都是 IvB,所以我认为它们是同一个微架构,并错过了他所说的性能差异。一些易于查看的实际数字(如项目符号列表或表格)将大大有助于使这个问题成为一个更好的问题。
  • 无论如何,如果 OP 在不同的计算机上使用不同的编译器或库,也许其中一个会自动执行 vzeroupper?
  • @Zboson:哎呀,我才意识到 i7-3820 是 Sandybridge-E。英特尔有这种烦人的编号方案,其中 -E 部件与常规的下一代部件具有相同的前导数字
  • 是的,OP 应该包含一些代码和数字,其中任何一个都会有帮助。
猜你喜欢
  • 2013-08-21
  • 2013-10-21
  • 2013-03-21
  • 2017-07-25
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2015-03-11
相关资源
最近更新 更多