神话还是现实?–丹尼尔·勒米尔的博客

主要观点:一些编译器会对齐数据结构以提高性能,通常认为数据对齐能提升处理器处理数据的性能,但实际测试发现,在近期的 Intel 和 64 位 ARM 处理器上,数据对齐并不能使处理速度大幅提升,只是一个微优化,数据对齐提升性能是个误区。
关键信息:

  • 编译器对齐数据结构的原因,部分处理器要求数据对齐,如 2005 年的 ARM 处理器,而 x86 笔记本和 64 位 ARM 手机多数时候可处理未对齐数据,且普遍认为数据对齐能提升性能,如 Stack Overflow 回答称访问未对齐内存显著更慢,Google 页面也提到未对齐数据会使 CPU 做额外工作降低性能,2008 年 Alexander Sandler 称未对齐访问可能需要两倍时钟周期。
  • 测试程序通过计算 Karp-Rabin 哈希值来比较不同偏移量下的数据处理速度,测试 20 次取平均墙钟时间,4 字节整数测试中,不同偏移量在 Core i7 和 Core 2 上差异不大,8 字节整数测试中也无明显差异,在近期 Intel 处理器(Sandy Bridge 和 Nehalem)上读取或写入未对齐内存操作无性能损失,在测试的 AMD 服务器上也无明显数据对齐惩罚。
  • 感谢 Owen Kaser 提供相关参考,Laurent Gauthier 提供反例但在近期处理器上已无差异,还提到考虑了 SIMD 操作和点积的情况。
    重要细节:
  • 测试代码用 memcpy 函数加载字,兼容自动向量化,测试重复 20 次取平均时间。
  • Intel 处理器使用 64 字节缓存线,仅在特定代码中加载和存储数据从最快 CPU 缓存是关键瓶颈时数据对齐才重要,且多数情况下不应期望有很大差异。
阅读 10
0 条评论