performance - 现代 x86-64 cpu 仍然受益于内存数据对齐吗?

标签 performance memory x86 x86-64 memory-alignment

如标题所示,

我在网上搜索了很多关于内存数据对齐的旧文章,但我不确定它们现在是否仍然有用。那么,问题是对于现代 x86-64 CPU,内存数据对齐是否仍然有利于高效的数据访问?或者只是所有编译器为了向后兼容而采用的旧约定?

最佳答案

对于数组来说是的,因为这意味着您将避免缓存行和页面分割。请参阅How can I accurately benchmark unaligned access speed on x86_64?了解各种处罚的详细信息以及如何衡量这些处罚。

这对于 AVX-512 的矢量化尤其重要,其中使用 512 位矢量循环未对齐的数组意味着每次加载都是缓存行分割。惩罚可能约为 20%,而在同一 CPU 上使用 AVX 256 位向量时,即使数据来自 L3 或 DRAM,而不是 L2 或 L1d 命中,惩罚也只有几个百分点。

对于现代 AMD 和 Intel 微架构上的整数和 SIMD 加载/存储,单个缓存行内不会出现未对齐情况。 (除了传统的 SSE 之外,只有对齐的负载才能折叠到内存源操作数中,例如 addps xmm0, [rdi],而不是单独的 movups。与 AVX 不同,其中 vaddps xmm0, xmm0, [rdi] 不需要对齐。)

是的,可能会间接地将结构体的所有成员保留在同一缓存行中,从而提高空间局部性。

关于performance - 现代 x86-64 cpu 仍然受益于内存数据对齐吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70227290/

相关文章:

assembly - 需要一些关于汇编语言中 LEAVE 指令的解释

assembly - 如何在没有操作系统的情况下运行程序?

jquery - 使用 jquery 创建迭代淡入淡出函数的最有效方法是什么

c - 长数据类型如何存储在内存中?

java - 当Solr中文档大小大于内存时?

c - C 中数组存储在哪里?

c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程

c# - 如何有效地从八叉树/四叉树中获取结果?

asp.net - 调整图像大小和性能

C++ 对象堆分配和成员变量