流式Simd扩展(SSE)的按位操作

时间:2018-10-08 19:18:42

标签: c performance sse

在下面的C语言最小示例中,我想了解使用Streaming Simd扩展(SSE)进行整数之间的按位运算的潜在好处。

假设那个

  1. 在两个64位无符号长整型ab(1),例如a ^ b
  2. 之间进行按位运算
  3. 使用SSE在两个128位整数AB之间进行相同的按位运算。

我想知道执行(1)是否花费与(2)相同的时间。

例如,您可以尝试进行时序实验,其中一个用于测量进行N >> 1个按位运算的时间(1)和进行相同数量的运算的时间(2)。

这些时间大致相同吗?如果不是,那么它们在特定计算机上的比率是多少?对于256个或更大的SSE扩展,同样的问题怎么样?

1 个答案:

答案 0 :(得分:3)

您是在谈论作为已编译C函数的一部分吗?编译器可以使用AVX2 vpxor或AVX1 vxorps轻松地对数组循环进行自动向量化,因此^运算符的编译方式取决于周围的环境。

显然,您必须在启用优化的情况下进行编译,以使任何基准都有意义。


就硬件在asm级别上的功能而言,编译器生成或手写无关紧要;使用内在函数是使编译器发出SIMD指令的便捷方法。

让我们以Intel Haswell为例。没有内存瓶颈,只需对寄存器中的局部变量进行操作,使用AVX2,每个时钟可以获得3x vpxor ymm(加上一个其他非SIMD uop),因此XOR为3x 256位。 (在Intel CPU上,128位SSE2 pxor xmm具有与256位AVX2 vpxor相同的吞吐量,因此更宽的矢量是吞吐量的绝对优势)。

或者如果您没有其他指令,也可以使用纯标量代码在Haswell上每个时钟执行4倍标量8/16/32/64位xor

vpxorxor都是单个uop,具有1个周期的延迟。

在AMD Bulldozer系列及更低版本上,pxor / vpxor具有2个周期延迟,但每个时钟吞吐量2个,因此延迟瓶颈与吞吐量瓶颈之间的性能差异是一个因素。 4。

如此小规模的CPU性能不是一维的。超标量流水线混乱的CPU使得您所问的“花费更长的时间”这个问题太简单了。请参阅我在What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?上的回答,特别是“要分析一个短块的三个主要方面” 部分。

请参见https://agner.org/optimize/中的x86 tag wiki和其他性能链接。