为什么对于许多 SIMD 算法,只有 AVX 的处理器的性能优于 AVX2 处理器
Why do processors with only AVX out-perform AVX2 processors for many SIMD algorithms?
我一直在研究 C# 和 C++ 中 SIMD 算法的优势,发现在许多情况下,在 AVX 处理器上使用 128 位寄存器比在具有 AVX2 的处理器上使用 256 位寄存器提供更好的改进,但我不明白为什么。
我所说的改进是指 SIMD 算法相对于同一台机器上的非 SIMD 算法的加速。
在 AVX 处理器上,256 位寄存器和浮点单元的上半部分在不执行 AVX 指令(VEX 编码操作码)时由 CPU 关闭。当代码确实使用 AVX 指令时,CPU 必须为 FP 单元供电 - 这大约需要 70 微秒,在此期间 AVX 指令实际上使用 128 微操作执行两次。
当大约 700 微秒未使用 AVX 指令时,CPU 会再次关闭电路的上半部分。
现在它这样做是因为电路的上半部分消耗功率(doh!),因此产生热量(双doh!)。这意味着当使用 AVX 指令时,CPU 运行得更热。因此,鉴于CPU在具有热余量时可以"涡轮增压",使用AVX指令会减少这种机会,实际上,CPU实际上降低了"基本时钟速度"。因此,例如,如果你有一个正式时钟在2.3GHz的CPU可以涡轮增压到2.7,当你开始使用AVX指令时,芯片的时钟会降低到2.1,而升压到只有2.3,在极端情况下,基本时钟可能会减少到1.9(见本文第2-4页)。
在这个阶段,您的 CPU 执行所有指令大约 10-15%,甚至可能比不使用 AVX 指令时慢 20%。如果您要执行大量 SIMD 操作,那么 256 位宽的指令就值得这样做。但是,如果您正在执行一些AVX指令,然后是"正常"代码,然后再次执行一些AVX,那么这种时钟速度损失将超过您单独从AVX中获得的所有收益。
这就是为什么 128 位宽的 SIMD 可以比 256 位宽运行得更快的原因,除非您有长时间密集的 SIMD 主导的操作突发。使用其余的硅是有代价的......(或者更准确地说,是不使用它的奖励,我们有时会忘记我们得到了)。
(来自对问题的评论)
如果算术运算不是算法执行的瓶颈,那么使用 SIMD 将无法提供加速。其他瓶颈可能是内存带宽、缓存大小、内存速度、缓存速度。如果采用 AVX 的处理器在这些方面优于 AVX2 处理器,那么它将从使用 SIMD 内部函数中获益更多。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- C/C++预处理器是否可以检测一些编译器选项
- 为什么constexpr的性能比正常表达式差
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 海湾合作委员会 ARM 性能下降
- 如何比较两个同名的预处理器宏?
- 特征3矩阵乘法性能取决于处理器
- 为什么对于许多 SIMD 算法,只有 AVX 的处理器的性能优于 AVX2 处理器