遇到此算法以计算给定地址的页面偏移量。 天真的方法简单,直观,但是更快的解决方案仅在页面大小为2的幂时才有效。例如, 我的问题是,当页面大小为2的幂以使valueToAlign & (~(pageSize-1)) “发生”以返回正确的对齐方式(例如24 valueToAl ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我们经常听到将变量与内存中的N字节边界对齐可以提高性能(通过防止CPU不得不将两个单独的“字”加载到缓存中来读取变量)。
另一方面,我们还(很少)听到将大块内存(数组/缓冲区)与一个不错的,2的整数次幂地址对齐可能是不好的,因为将内存地址分配给缓存地址的哈希函数是不再统一(这称为页面对齐)。
因此,我的问题是,关于何时应故意错位数据以避免页面对齐的问题是否存在某种规则或阈值点; 何时不使用,以获得标准内存对齐的好处?
我认为您无法为此获得一般规则。 这取决于您使用的处理器,即基础系统的MMU和缓存实现。 这将因系统而异。 因此,如果要获得最佳性能,则需要了解当前系统的所有底层细节。 通常,我希望将大内存块对齐到2的幂的边界的好处是有限的。
如果性能对于您的应用程序来说至关重要,并且您的应用程序通常在已知数据集(类型和大小)上进行迭代,那么了解和理解MMU,L缓存和缓存行的影响就很重要。 这不是因为您确实可以提前避免这些问题,而是因为您可能需要事后找出它们,同时盯着分析结果,并想弄清楚为什么事情花的时间比以前更长,或者“通常应该”。 而且-如果您很幸运,并且数据集在您的控制范围内,则可以进行调整以解决某种CPU缓存性能问题。
不幸的是,大多数应用程序并不具有遍历已知数据集并知道其目标硬件类型的奢侈性。 这是游戏和多媒体应用程序开发以及操作系统工程所独有的。 对于世界上大多数其他应用程序,改善某个特定大小的特定数据集的缓存配置文件意味着减少另一个特定数据集的缓存配置文件。
最后,即使有关“将变量对齐到N字节边界”的“经验法则”也受底层硬件的约束。 大多数较新的台式机级x86架构(大多数在2011年左右之后制造)更喜欢打包数据而不是对齐数据,因为加载跨缓存行边界打包的单词的成本比必须加载更多总缓存行来表示同一数据集要便宜。 但是在运行ARM的移动设备上? 对齐仍然很关键。
您可以搜索更多关键字以进行进一步教育: 缓存颜色和缓存逐出 。 但是同样,这都非常依赖于目标CPU,不幸的是很少有(或没有)概括。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.