【发布时间】: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