Valgrind输出解释

时间:2010-10-26 15:11:09

标签: c optimization valgrind

设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路组关联。

3 个答案:

答案 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个缓存行,这会导致三次写入未命中。