我们经常听到,将变量与内存中的N字节边界对齐可以提高性能(通过防止CPU将两个单独的“单词”加载到缓存中以读取我们的变量)。
另一方面,我们还听说(不太经常)将一个大内存块(数组/缓冲区)对齐到一个漂亮的、圆形的两个地址可能是不好的,因为将内存地址分配给高速缓存地址的散列功能不再统一(这称为页面对齐)。
因此,我的问题是,是否存在某种规则或临界点,说明何时我们应该故意对齐数据以避免页面对齐的问题;而当不对齐时,则获得标准内存对齐的好处吗?
发布于 2015-01-16 16:41:38
如果性能对您的应用程序至关重要,并且您的应用程序通常迭代已知的数据集(在类型和大小上),那么了解和理解MMU、L-缓存和缓存行的影响是很重要的。这并不是因为你真的可以提前避免这些问题,而是因为你可能需要在事后发现这些问题,同时盯着分析结果,并试图弄清楚为什么某些事情比过去或“通常应该”要花更长的时间。而且--如果你幸运的话,数据集在你的控制范围内就足够了--然后你可以调整一些东西来解决某种cpu缓存性能问题。
不幸的是,大多数应用程序没有对已知数据集进行迭代并知道它们的目标硬件类型的奢侈。这是游戏和多媒体应用程序开发以及操作系统工程所独有的。对于世界上大多数其他应用程序来说,改进特定数据集的缓存配置文件意味着减少另一个数据集的缓存配置文件。
最后,即使是关于“将我们的变量与N字节边界对齐”的“经验法则”也取决于底层硬件。大多数较新的桌面级x86体系结构(大多数是在2011年前后创建的)更喜欢打包数据,而不是对齐数据,因为加载封装在背线边界上的单词的成本比加载更多的单身汉来表示相同数据集的成本要低。但在移动设备上运行手臂?对齐还是很关键的。
为您搜索更多的关键字,为进一步的教育:缓存着色和缓存驱逐。但是,这一切都非常依赖于目标CPU,不幸的是,很少(或没有)泛化。
发布于 2015-01-14 20:43:08
我不认为你能得到这方面的一般规则。这取决于您正在使用的处理器,即底层系统的MMU和缓存实现。这将因系统而异。因此,如果您想要最好的性能,您将需要了解当前系统的所有低层次的细节。一般来说,我认为将大内存块对齐到二次幂边界的好处是有限的。
https://stackoverflow.com/questions/27951041
复制相似问题