我正在进行这样的循环:
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之间的一些操作。
从分析数据看,缺少的缓存很高。
如何用更好的缓存行为重写循环?
感谢您的任何评论!
答案 0 :(得分:1)
您正在线性访问每个阵列,这对于缓存使用(以及硬件预取器)来说基本上是最佳的。
然而,如果你的阵列是一个不幸的大小(通常是两个大的力量),你将得到颠簸; arrA[i]
,arrB[i]
和arrC[i]
都将映射到同一个缓存行,并且不断相互冲突。从本质上讲,每次访问都是缓存未命中。为避免这种情况,您应该尝试稍微填充每个数组。