【问题标题】:Why dont use the AVX Registers as a ultra fast cache?为什么不将 AVX 寄存器用作超快速缓存?
【发布时间】:2014-01-18 20:47:25
【问题描述】:

我一直想知道为什么 AVX2 提供的 16x256 位寄存器在 AVX 无法提供帮助时不被用于存储普通寄存器 - 在您碰巧没有足够寄存器的情况下最大限度地减少缓存的命中在眼前。是不是可以在 1-2 个周期内设置和访问 AVX 寄存器?

如果您搞砸了运行 AVX 内容的其他代码并将其从寄存器中踢出,那么所有这些当然都行不通。我还没有看到这种明显的方法被使用,这导致我提出这个问题。

【问题讨论】:

  • 我以前也想过这个问题。我认为这可能是因为在通用寄存器和 SSE/AVX 寄存器之间移动数据很慢,但我不确定。
  • 因为AVX2刚刚发布?而且,它们不会屏蔽其他寄存器(例如,加载它们可能很快,但 64 位操作会破坏加载的值)?
  • 跨越 128 位边界通道的操作在 Sandy Bridge 和 Haswell 上为 3 个周期。这比从 L1 缓存加载要慢。即使有办法从中获得一些性能,您仍然需要有人为其编写优化通道。 (我怀疑这很容易)
  • gcc 开始使用 4.8 IIRC。
  • @Mysticial - 在最佳情况下加载为 4 个周期(如果使用复杂寻址则更长,如果加载到向量寄存器则更长,等等)。您通常不需要跨越 128 位边界,因为您首先使用 16 个 128 位 xmm regs,它们有一个从 GP regs 加载/存储的周期。

标签: performance assembly sse cpu-registers avx


【解决方案1】:

有一次,英特尔确实在其优化手册中建议从通用寄存器溢出到 SSE 寄存器。 (这不完全是 AVX,但它是相同的想法。)我没有看过最新的手册,所以建议可能会或可能不会过时。

溢出到 xmm 寄存器的缺点是这些寄存器不会在函数调用中保留。鉴于 x86-64 是一个寄存器内存机器,访问堆栈上的溢出值也需要更少的指令和更少的寄存器(比较 add rax, [rsp+k]movq rbx, xmm0/add rax, rbx)。这可能在某种程度上解释了为什么人们对该技术没有太大兴趣。

【讨论】:

  • 同样随着数据缓存越来越大,在栈上保存/加载也是1个周期。
  • 嗯,到目前为止,L1 缓存的容量似乎保持不变。这就是创造更多更多的愿望的原因:-)
  • 存储到堆栈或从堆栈加载或从任何内存位置加载,如果在 L1 中命中,则至少有 4 个周期的延迟。
猜你喜欢
  • 2011-11-23
  • 2011-03-31
  • 2015-07-10
  • 2021-09-06
  • 2020-09-14
  • 2013-01-08
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多