【问题标题】:Avoiding powers of 2 for cache friendliness避免 2 的幂以实现缓存友好性
【发布时间】:2012-08-05 18:34:12
【问题描述】:

假设在速度关键的代码中,我们有一对经常一起使用的数组,其中确切的大小并不重要,只需将其设置为合理的值,例如

int a[256], b[256];

这是否可能是一种悲观,因为低地址位相同会使缓存更难同时处理两个数组?最好指定例如300 而不是 256?

【问题讨论】:

  • 您怀疑二次幂可能有问题是正确的。但它通常只适用于你有超过 2 步的情况。 (尤其是当您超过 L1 缓存关联性时)Here's an example of where it actually becomes problematic. 在该示例中,有 4 个数组 - 所有这些数组都与从 4k 页面开始的相同偏移量对齐。

标签: c performance caching optimization memory


【解决方案1】:

将我的评论移至答案:

您怀疑二次方可能有问题是正确的。但它通常只适用于你有超过 2 步的情况。在您超过 L1 cache associativity 之前,它不会变得非常糟糕。但即使在此之前,您也可能会遇到错误的别名问题。

以下是二次幂实际上成为问题的两个示例:

在第一个示例中,有 4 个数组 - 所有这些数组都与 4k 页面开头的相同偏移量对齐。

在第二个示例中,当矩阵大小为 2 的幂时,矩阵的按列跳跃会完全破坏性能。


无论如何,请注意关键概念实际上是数组的对齐方式,而不是它们的大小。如果您发现速度变慢,只需在数组之间添加一些填充以破坏对齐。

【讨论】:

  • 另一个有用的技巧:如果您一次只访问一个条目(并且从不通过 memcpy 等访问“切片”),您可以尝试将一个普通的哈希函数应用于数组的索引.通常,异或。 IE。总是访问 a[i^0x67] 和 b[j^0x34]。 // 我刚刚找到了一个有用的地方。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2017-03-22
  • 2014-03-25
  • 1970-01-01
相关资源
最近更新 更多