performance - 在 x86 上成功的非对齐访问的实际效果是什么?

标签 performance memory x86 alignment memory-alignment

我总是听说未对齐的访问很糟糕,因为它们要么会导致运行时错误并使程序崩溃,要么会降低内存访问速度。但是我找不到任何关于它们会减慢多少速度的实际数据。

假设我在 x86 上并且有一些(但未知的)未对齐访问份额 - 实际上可能出现的最严重的减速是什么?如何在不消除所有未对齐访问并比较两个版本代码的运行时间的情况下估算它?

最佳答案

这取决于指令,对于大多数 x86 SSE 加载/存储指令(不包括未对齐的变体),它会导致错误,这意味着它可能会导致您的程序崩溃或导致大量往返于您的异常处理程序(这意味着几乎或所有性能都会丢失)。未对齐的加载/存储变体以 IIRC 的两倍周期运行,因为它们执行部分读/写,因此需要 2 来执行操作(除非您很幸运并且它在缓存中,这大大减少了惩罚)。

对于一般 x86 加载/存储指令,代价是速度,因为执行读取或写入需要更多周期。不对齐也可能影响缓存,导致缓存行拆分和缓存边界跨越。它还可以防止读取和写入的原子性(保证所有对齐的 x86 读取/写入,屏障和传播是另一回事,但是在未对齐的数据上使用 LOCK 指令可能会导致异常或大大增加本已巨大的惩罚lock incurs),这是并发编程的禁忌。

Intels x86 & x64 optimizations manual详细介绍了上述每个问题、它们的副作用以及如何解决它们。

Agner Fog' optimization manuals应该有您正在寻找的原始周期吞吐量的确切数字。

关于performance - 在 x86 上成功的非对齐访问的实际效果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12491578/

相关文章:

python - 在 python 中为大型 scipy.sparse 矩阵运算分配内存

c - 加载库需要随机化内存地址是什么?

assembly - 直接读取程序计数器

c++ - 如何在 C++ 中使用内联汇编来设置 Trap 标志

JavaScript - 循环是否比逐行离散编写更快?

java - 线程利用策略

performance - 处理 OpenGL 中的 alpha 混合以获得更好的性能

java - 重复写入/删除 SSD 的风险?

汇编-x86调用指令和内存地址?

python - 为什么代码 1 比代码 2 快?