我想了解在以下 C 中的最小示例中使用流式 Simd 扩展 (SSE) 进行整数之间的按位运算的潜在 yield 。
假设一个
- 在两个 64 位无符号长整数
a
和b
(1) 之间进行按位运算,例如a ^ b
- 使用 SSE 在两个 128 位整数
A
和B
之间进行相同的按位运算。
我想知道执行 (1) 是否与 (2) 花费相同的时间。
例如,可以尝试计时实验,测量进行 N >> 1 次按位运算 (1) 的时间和进行相同数量的运算 (2) 的时间。
这些时间大致相同吗?如果不是,它们在特定机器上的比率是多少?对于 256 或更大的 SSE 扩展,同样的问题怎么样?
最佳答案
您是在谈论作为已编译 C 函数的一部分吗?编译器可以使用 AVX2 vpxor
或 AVX1 vxorps
轻松自动向量化数组循环,因此 ^
运算符如何编译取决于周围的上下文。
显然,您必须在启用优化的情况下进行编译才能使任何基准测试有意义。
就硬件在 asm 级别可以做什么而言,编译器生成的或手写的并不重要;使用内在函数是让编译器发出 SIMD 指令的便捷方式。
我们以 Intel Haswell 为例。没有内存瓶颈,只需对寄存器中的局部变量进行操作,使用 AVX2,您可以获得每个时钟 3x vpxor ymm
(加上一个其他非 SIMD uop),因此这是 3x 256 位 XOR。 (128 位 SSE2 pxor xmm
在 Intel CPU 上具有与 256 位 AVX2 vpxor
相同的吞吐量,因此更宽的 vector 是吞吐量的绝对胜利)。
或者使用纯标量代码,如果您没有其他指令,您可以在 Haswell 上每个时钟执行 4x 标量 8/16/32/64 位 xor
。
vpxor
和xor
都是单微指令,延迟为 1 个周期。
在 AMD Bulldozer 系列及更早版本上,pxor
/vpxor
有 2 个周期延迟,但每个时钟吞吐量为 2 个,因此延迟瓶颈与 a 之间的性能差异吞吐量瓶颈是 4 倍。
如此小规模的 CPU 性能不是一维的。超标量流水线无序 CPU 使您提出的“是否需要更长的时间”这个问题过于简单化。在 What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand? 上查看我的回答,特别是 “要分析短 block 的三个主要维度” 部分。
参见 https://agner.org/optimize/和 x86 tag wiki 中的其他性能链接.
关于c - 使用 Streaming Simd Extensions (SSE) 的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708758/