Register deprivation: spills and runtime under forced register scarcity
2 days ago
- 通过 gcc -ffixed-<reg> 保留寄存器会可靠地增加溢出,但静态溢出计数是运行时成本的弱预测指标(皮尔逊 r=0.55)。
- 在最紧张的预算下,移除寄存器会使 9 个内核中的 8 个性能下降 14–76%;SipHash 尽管增加了 23 次溢出,但未出现性能下降。
- 性能下降与所使用的寄存器文件相关:例如,在 SHA-256 上保留通用寄存器导致成本增加 +33%,而保留 XMM 仅增加 +5.6%。
- GCC 使用 SSE 对 SHA-256 的一部分进行自动向量化,导致保留 XMM 使堆栈溢出增加 8 倍。
- 每个内核每次新增溢出的成本差异约为 30 倍,从约 0%/溢出(SipHash)到 2.2%/溢出(FIR 滤波器)。
- 乱序执行隐藏了溢出延迟,使溢出变得廉价;历史上的 x86-32 本应有更高且更统一的成本。
- 该实验使用 gcc 15.2.0 -O2 在 Intel Xeon E-2236 上进行;代码可在 GitHub 上获取。