设arr是一个尺寸为16 x 20的数组 这是所提到的代码片段的valgrind输出。输出来自cachegrind。
for (i = 0; i < 20; i++)
arr[0][i] = 0;
Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw
64 0 0 41 0 0 1 0 0
60 0 0 20 0 0 20 2 2
我已经从valgrind文档中读到了这些单个参数的含义。但是,我无法用上述数字计算。就像for循环一样,我们真的有41个缓存数据读取吗?或者对于阵列arr,我们怎么能有2个L2写入未命中?
我的配置是L1d = L1I = 32KB,L2 = 2MB,64字节缓存行大小和8路组关联。
答案 0 :(得分:0)
您的大多数数据读取都来自循环变量i。
21条件i&lt; 20
从i ++中读取20个
20在左值arr [0] [i]中读取i。
我不知道缓存是如何工作的,但假设32位int数组,你的写入覆盖了10个缓存行。狂野猜测:最后两行是你的写错,因为它不知何故预测你的下一次写。
如果您展开循环,您会看到计数折叠为小数字。
arr[0][0]=0;
arr[0][1]=0;
..
答案 1 :(得分:0)
我认为上面提到的数据可能是错误的,因为它是从大型代码中挑选出来的,因此也存在其他变量的影响。
答案 2 :(得分:0)
正如Erik Olson所说,for
行中的41个读数全部用于i
- i < 20
测试中的21个,i++
中的20个(如果你的话)通过优化编译,这些应该减少。)
有两个L2写入未命中,因为您的20个整数覆盖80个字节,这是(最多)两个高速缓存行。根据阵列的对齐情况,它可能会覆盖3个缓存行,这会导致三次写入未命中。