0

我正在处理这样的循环:

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之间的一些操作。从分析数据来看,缓存丢失率似乎很高。

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

感谢您的任何评论!

4

1 回答 1

1

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

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

参见例如了解缓存抖动

于 2012-07-03T00:03:48.437 回答