皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

GCC 16 为 x86/x86_64 CPU 带来了改进的 memmove 行为

GCC 16 为 x86/x86_64 CPU 带来了改进的 memmove 行为

英特尔长期编译器专家 H.J. Lu 今天在即将发布的 GCC 16 版本之前,合并了改进的 memmove()行为。

GCC x86/x86_64 的更改是为了在重叠的未对齐加载和存储中内联 memmove。H.J. Lu 用补丁为内联 memmove 功能提供了更多的论据:

“x86-64:内联 memmove,支持重叠的未对齐加载和存储

在 64 位系统中使用内联 memmove,因为 32 位系统中可用的寄存器要少得多:

1. 将所有源数据加载到寄存器中并一起存储,以避免源和目标之间可能出现的地址重叠。
2. 对于已知大小,首先尝试使用 8 个寄存器完全展开。
3. 对于大小小于等于 2 * MOVE_MAX 的情况,首先将所有源数据加载到 2 个寄存器中,然后一起存储。
4. 对于大小大于 2 * MOVE_MAX 且小于等于 4 * MOVE_MAX 的情况,首先将所有源数据加载到 4 个寄存器中,然后一起存储。
5. 对于大小大于 4 * MOVE_MAX 且小于等于 8 * MOVE_MAX 的情况,首先将所有源数据加载到 8 个寄存器中,然后一起存储。
6. 对于大小大于 8 * MOVE_MAX 的情况,
a. 如果目标地址大于源地址,则使用 4 * MOVE_MAX 循环反向复制,带有对齐的加载和存储。在循环之前将前 4 * MOVE_MAX 加载到 4 个寄存器中,并在循环之后存储它们,以支持重叠地址。
b. 否则,使用 4 * MOVE_MAX 循环正向复制,带有对齐的加载和存储。在循环之前将最后 4 * MOVE_MAX 加载到 4 个寄存器中,并在循环之后存储它们,以支持重叠地址。

经过验证和基准测试,使用 glibc memmove 测试将 GPR、SSE2、AVX2 和 AVX512 内联的 memmove 实现。

它们的性能与 glibc 中优化的 memmove 实现相当。”

代码已于今天上午合并,为迎接 GCC 16 本月的第三阶段里程碑。GCC 16.1 作为 GCC 16 的第一个稳定版本,预计将在 3 月到 4 月左右发布。

转自 GCC 16 Lands Improved Memmove Behavior For x86/x86_64 CPUs – Phoronix