在下面的C语言最小示例中,我想了解使用Streaming Simd扩展(SSE)进行整数之间的按位运算的潜在好处。
假设那个
a
和b
(1),例如a ^ b
A
和B
之间进行相同的按位运算。 我想知道执行(1)是否花费与(2)相同的时间。
例如,您可以尝试进行时序实验,其中一个用于测量进行N >> 1个按位运算的时间(1)和进行相同数量的运算的时间(2)。
这些时间大致相同吗?如果不是,那么它们在特定计算机上的比率是多少?对于256个或更大的SSE扩展,同样的问题怎么样?
答案 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
。
vpxor
和xor
都是单个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和其他性能链接。