我正在处理这样的循环:
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之间的一些操作。从分析数据来看,缓存丢失率似乎很高。
如何以更好的缓存行为重写循环?
感谢您的任何评论!
您正在线性访问每个数组,这对于缓存使用(以及硬件预取器)来说基本上是最佳的。
然而,如果你的数组是一个不幸的大小(通常是 2 的大幂),你会被颠簸;arrA[i]
,arrB[i]
并且arrC[i]
都会映射到同一个缓存行,并且不断地互相驱逐。本质上,每一次访问都将是一次缓存未命中。为避免这种情况,您应该尝试稍微填充每个数组。
参见例如了解缓存抖动。