2010-10-26 177 views
1

设arr是维数为16的数组x 20
这里是所提到的代码片段的valgrind输出。输出来自cachegrind。Valgrind输出解释

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

+1

您是否特指cachegrind,如果是的话那么您可能应该指定它。我尽可能使用KCacheGrind来帮助理解cachegrind和callgrind。如果您需要其他分析,那么显然您需要编写自己的脚本/图表。 http://kcachegrind.sourceforge.net/这显然不是你的问题,只是一个(希望)有用的评论。 – 2010-10-26 15:17:22

回答

0

正如埃里克·奥尔森说,41在for线读取都是为了i - 21在i < 20测试,与20 i++(如果你使用优化编译,这应减少)。

有两个L2写入未命中,因为您的20个整数覆盖80个字节,这是(最多)两个缓存行。根据阵列的对齐情况,它可能会覆盖3个缓存行,这会导致三次写入未命中。

0

大部分数据读取来自循环变量i。

21来自条件i 20从i ++读取。
20从左值arr [0] [i]中的i中读取。我不是最新的缓存工作方式,但假设32位int数组,您的写入覆盖10缓存行。疯狂的猜测:最后两行是你的写入失误,因为它以某种方式不能预测你的下一次写入。

如果展开循环,您将看到计数收缩为小数。

arr[0][0]=0; 
arr[0][1]=0; 
..  
0

我认为上面提到的数据可能是错误的,因为它是从一个大代码中挑选出来的,因此也有其他变量的影响。

+0

我能够重现您的计数。 – 2010-10-26 22:11:17