如何编写具有更好缓存行为的循环?

时间:2012-07-02 23:56:34

标签: caching loops

我正在进行这样的循环:

int arrA[BIG], arrB[BIG], arrC[BIG];

for(int = 0; i<BIG; i++){
      do_operation(arrA[i], arrB[i], arrC[i]);
}

此处do_operation不是实际功能。它只意味着A,B,C之间的一些操作。 从分析数据看,缺少的缓存很高。

如何用更好的缓存行为重写循环?

感谢您的任何评论!

1 个答案:

答案 0 :(得分:1)

您正在线性访问每个阵列,这对于缓存使用(以及硬件预取器)来说基本上是最佳的。

然而,如果你的阵列是一个不幸的大小(通常是两个大的力量),你将得到颠簸; arrA[i]arrB[i]arrC[i]都将映射到同一个缓存行,并且不断相互冲突。从本质上讲,每次访问都是缓存未命中。为避免这种情况,您应该尝试稍微填充每个数组。

参见例如Understanding cache thrashing