我总是听说未对齐的访问很糟糕,因为它们会导致运行时错误并使程序崩溃或减慢内存访问速度。然而,我找不到任何关于它们会减慢速度的实际数据。
假设我在 x86 上并且有一些(但未知)未对齐访问的份额 - 实际上可能的最严重的减速是什么?在不消除所有未对齐访问并比较两个版本代码的运行时间的情况下如何估计它?
这取决于指令,对于大多数 x86 SSE 加载/存储指令(不包括未对齐的变体),它将导致错误,这意味着它可能会使您的程序崩溃或导致异常处理程序的大量往返(这意味着几乎或所有性能都会丢失)。未对齐的加载/存储变体以双倍的周期 IIRC 运行,因为它们执行部分读/写,因此需要 2 个周期才能执行该操作(除非您很幸运并且它在缓存中,这大大减少了惩罚)。
对于一般的 x86 加载/存储指令,代价是速度,因为需要更多周期来执行读取或写入。不对齐还可能影响缓存,导致缓存行分裂和缓存边界跨越。它还可以防止读取和写入的原子性(这对于 x86 的所有对齐读/写都是保证的,障碍和传播是另一回事,但在未对齐的数据上使用 LOCK'ed 指令可能会导致异常或大大增加本已巨大的惩罚锁产生),这是并发编程的禁忌。
英特尔 x86 和 x64 优化手册详细介绍了上述每个问题、其副作用以及解决方法。
Agner Fog 的优化手册应该有您正在寻找的原始循环吞吐量的确切数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)