c - 使用 Streaming Simd Extensions (SSE) 的按位运算

标签 c performance sse

我想了解在以下 C 中的最小示例中使用流式 Simd 扩展 (SSE) 进行整数之间的按位运算的潜在 yield 。

假设一个

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

我想知道执行 (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

vpxorxor 都是单微指令,延迟为 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/

相关文章:

c++ - SSE 优化循环,在数组中查找零并切换标志 + 更新另一个数组

c - TCP 标志未通过 nmap Xmas 扫描设置

c# - Microsoft Unity 容器的性能

gcc 4.8 AVX 优化错误 : extra code insertion?

performance - Phalcon php vs node.js

python - 在大目录中查找随机对

c++ - SSE整数除法?

python - 为什么在 C 中允许以下内容?

c++ - 如何在不使用数组或任何算术运算的情况下反转数字

c - 杀死运行系统 shell 命令的子进程