gpt4 book ai didi

performance - 数据对齐真的能将执行速度提高 5% 以上吗?

转载 作者:行者123 更新时间:2023-12-01 13:41:04 26 4
gpt4 key购买 nike

从那以后,我仔细考虑了数据结构的对齐方式。在处理完成之前让 CPU 改组位是很痛苦的。撇开直觉不谈,我测量 未对齐数据的成本:将 64 位 long 写入一些 GB 内存,然后读取它们的值,检查正确性。

// c++ code
const long long MB = 1024 * 1024;
const long long GB = 1024 * MB;

void bench(int offset) // pass 0..7 for different alignments
{
int n = (1 * GB - 1024) / 8;
char* mem = (char*) malloc(1 * GB);
// benchmarked block
{
long long* p = (long long*) (mem + offset);
for (long i = 0; i < n; i++)
{
*p++ = i;
}
p = (long long*) (mem + offset);
for (long i = 0; i < n; i++)
{
if (*p++ != i) throw "wrong value";
}
}
free(mem);
}

结果令我吃惊:
1st run         2nd run       %
i = 0 221 i = 0 217 100 %
i = 1 228 i = 1 227 105 %
i = 2 260 i = 2 228 105 %
i = 3 241 i = 3 228 105 %
i = 4 219 i = 4 215 99 %
i = 5 233 i = 5 228 105 %
i = 6 227 i = 6 229 106 %
i = 7 228 i = 7 228 105 %

成本仅为 5%(如果我们将其随机存储在任何内存位置,成本将为 3.75%,因为 25% 会对齐)。但是存储未对齐的数据的好处是更紧凑一些,因此 3.75% 的好处甚至可以得到补偿。

测试在 Intel 3770 CPU 上运行。此基准测试的许多变体(例如使用指针而不是长整型;随机读取访问以更改缓存效果)是否都导致了类似的结果。

问题:数据结构对齐是否仍然像我们所有人认为的那样重要?

我知道当 64 位值分布在缓存行上时存在原子性方面,但这也不是对齐的有力论据,因为较大的数据结构(例如 30、200 字节左右)通常会分布在它们之间。

我一直坚信速度论点在这里很好地阐述,例如: Purpose of memory alignment并且不喜欢违反旧规则。但是: 我们可以衡量正确对齐所声称的性能提升吗?

一个好的答案可以提供一个合理的基准,显示对齐与未对齐数据的因子提升 > 1.25。或者证明常用的其他现代 CPU 受未对齐的影响更大。

感谢您的想法测量。

编辑:我担心结构保存在内存中的经典数据结构。与科学数字处理场景等特殊情况相比。

更新:来自评论的见解:
  • 来自 http://www.agner.org/optimize/blog/read.php?i=142&v=t

  • 在 Sandy Bridge 上有效处理未对齐的内存操作数

    在 Sandy Bridge 上,读取或写入未对齐的内存操作数没有性能损失,只是它使用了更多的缓存组,因此当操作数未对齐时缓存冲突的风险更高。Store-to-load forwarding 也在大多数情况下适用于未对齐的操作数。
  • http://danluu.com/3c-conflict/

  • 未对齐 访问权限可能是 更快(!)由于缓存组织,在 Sandy Bridge 上。

    最佳答案

    是的,数据对齐是在仅支持 SSE 的体系结构上进行矢量化的重要先决条件,其具有 strict data alignment requirements或在较新的架构上,例如 Xeon PHI . Intel AVX,确实支持非对齐访问,但对齐数据仍然被认为是一个很好的做法,to avoid unnecessary performance hits :

    Intel® AVX has relaxed some memory alignment requirements, so now Intel AVX by default allows unaligned access; however, this access may come at a performance slowdown, so the old rule of designing your data to be memory aligned is still good practice (16-byte aligned for 128-bit access and 32-byte aligned for 256-bit access). The main exceptions are the VEX-extended versions of the SSE instructions that explicitly required memory-aligned data: These instructions still require aligned data



    在这些体系结构上,矢量化有用的代码(例如大量使用浮点的科学计算应用程序)可能会受益于满足相应的对齐先决条件;加速将与 FPU 中的矢量 channel 数(4、8、16X)成正比。您可以通过比较诸如 Eigen 之类的软件来自己衡量矢量化的好处。或 PetSC或任何其他带有/不带矢量化的科学软件(-xHost 用于 icc,-march=native 用于 gcc),您应该很容易获得 2 倍的加速。

    关于performance - 数据对齐真的能将执行速度提高 5% 以上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215947/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com