假设在速度关键代码中,我们有一对经常一起使用的数组,其中确切的大小无关紧要,只需将其设置为合理的值,例如
int a[256], b[256];
这是否可能是一种悲观,因为低地址位相同会使缓存更难同时处理两个数组?指定例如 300 而不是 256 会更好吗?
假设在速度关键代码中,我们有一对经常一起使用的数组,其中确切的大小无关紧要,只需将其设置为合理的值,例如
int a[256], b[256];
这是否可能是一种悲观,因为低地址位相同会使缓存更难同时处理两个数组?指定例如 300 而不是 256 会更好吗?
将我的评论移至答案:
您怀疑二次幂可能有问题是正确的。但它通常只适用于你有超过 2 步的情况。在您超过 L1缓存关联性之前,它不会变得非常糟糕。但即使在此之前,您也可能会遇到错误的别名问题。
以下是两个二次幂实际上成为问题的示例:
在第一个示例中,有 4 个数组 - 所有这些数组都与 4k 页面开头的相同偏移量对齐。
在第二个示例中,当矩阵大小为 2 的幂时,矩阵的逐列跳跃会完全破坏性能。
在任何情况下,请注意关键概念实际上是数组的对齐方式,而不是它们的大小。如果你发现你遇到了减速,只需在你的数组之间添加一些填充来破坏对齐。