我一直在想,为什么当AVX不能帮助时,提供的16x256位寄存器不能用于存储普通寄存器-以最小化缓存击中,在您手头没有足够的寄存器的情况下。难道不是这样吗?您可以在1-2个周期内设置和访问AVX寄存器吗?
当然,如果您搞砸了运行AVX代码并将其从寄存器中踢出,则所有这些都不起作用。我还没有看到使用这种显而易见的方法,这促使我提出了这个问题。
我一直在想,为什么当AVX不能帮助时,提供的16x256位寄存器不能用于存储普通寄存器-以最小化缓存击中,在您手头没有足够的寄存器的情况下。难道不是这样吗?您可以在1-2个周期内设置和访问AVX寄存器吗?
当然,如果您搞砸了运行AVX代码并将其从寄存器中踢出,则所有这些都不起作用。我还没有看到使用这种显而易见的方法,这促使我提出了这个问题。
曾经,英特尔确实在其优化手册中建议从通用寄存器溢出到SSE寄存器。(虽然这不是AVX,但它是相同的思想。)我没有查看最新的手册,所以这个建议可能已经过时或者仍在使用。
向xmm寄存器溢出的缺点是这些寄存器不能跨函数调用保留。考虑到x86-64是一台寄存器内存机器,在堆栈上访问溢出值也需要更少的指令和更少的寄存器(比较add rax, [rsp+k]
和 movq rbx, xmm0/add rax, rbx
)。这可能在一定程度上解释了为什么没有太多人对这种技术感兴趣。