为什么不把AVX寄存器作为超快速缓存使用?

10

我一直在想,为什么当AVX不能帮助时,提供的16x256位寄存器不能用于存储普通寄存器-以最小化缓存击中,在您手头没有足够的寄存器的情况下。难道不是这样吗?您可以在1-2个周期内设置和访问AVX寄存器吗?

当然,如果您搞砸了运行AVX代码并将其从寄存器中踢出,则所有这些都不起作用。我还没有看到使用这种显而易见的方法,这促使我提出了这个问题。


2
我以前也曾想过这个问题。我认为原因可能是在通用寄存器和SSE/AVX寄存器之间移动数据很慢,但我不确定。 - user541686
跨越128位边界的操作在Sandy Bridge和Haswell上需要3个周期。这比从L1缓存加载要慢。即使有一种方法可以提高性能,你仍然需要有人为其编写优化程序(我认为这并不容易)。 - Mysticial
@user1610743,Broadwell没有AVX512,它主要是Haswell的压缩版本。下一个处理器应该会有它。 - Leeor
4
据我所知,gcc从4.8版本开始这样做。 - Marc Glisse
1
@Mysticial - 在最好的情况下,负载需要4个周期(如果使用复杂寻址,则需要更长时间;如果加载到矢量寄存器,则需要更长时间等)。通常情况下,您不需要跨越128位边界,因为您首先会使用16个128位xmm寄存器,这些寄存器从GP寄存器中进行一次周期性的加载/存储。 - BeeOnRope
显示剩余3条评论
1个回答

8

曾经,英特尔确实在其优化手册中建议从通用寄存器溢出到SSE寄存器。(虽然这不是AVX,但它是相同的思想。)我没有查看最新的手册,所以这个建议可能已经过时或者仍在使用。

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


随着越来越大的数据缓存,堆栈上的保存/加载只需要1个周期。 - Alexis Wilke
好的,L1缓存目前似乎保持了相同的容量。这就是导致渴望更多更多的原因 :-) - user1610743
1
将数据存储到堆栈或从堆栈中加载,或者在任何内存位置上进行操作,如果它在L1缓存中命中,则最小延迟为4个时钟周期。 - BeeOnRope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接