【发布时间】:2022-01-10 14:06:27
【问题描述】:
如题,
我在网上搜索了很多关于内存数据对齐的旧文章,但我不确定它们现在是否仍然有用。那么,问题是关于现代 x86-64 CPU,内存数据对齐是否仍然有利于高效的数据访问?还是只是所有编译器为了向后兼容而采用的旧约定?
【问题讨论】:
标签: performance memory x86 x86-64 memory-alignment
如题,
我在网上搜索了很多关于内存数据对齐的旧文章,但我不确定它们现在是否仍然有用。那么,问题是关于现代 x86-64 CPU,内存数据对齐是否仍然有利于高效的数据访问?还是只是所有编译器为了向后兼容而采用的旧约定?
【问题讨论】:
标签: performance memory x86 x86-64 memory-alignment
对于数组是,因为这意味着您将避免缓存行和页面拆分。请参阅How can I accurately benchmark unaligned access speed on x86_64? 了解有关各种处罚的详细信息以及如何衡量它们。
这对于使用 AVX-512 的向量化尤其重要,其中循环使用 512 位向量的未对齐数组意味着每次加载都是缓存行拆分。即使对于来自 L3 或 DRAM 的数据,而不是 L2 或 L1d 命中的数据,在同一 CPU 上使用 AVX 256 位向量的损失可能约为 20%。
对于现代 AMD 和 Intel 微架构上的整数和 SIMD 加载/存储,对于单个高速缓存行内的未对齐情况不适用。 (除了传统的 SSE,其中只有对齐的负载可以折叠到像 addps xmm0, [rdi] 这样的内存源操作数中,而不是单独的 movups。与 AVX 不同,vaddps xmm0, xmm0, [rdi] 不需要对齐。)
是的,可以间接地将所有结构的成员保持在同一缓存行中,从而提高空间局部性。
【讨论】: