这是cachegrind输出的一部分。这部分代码已执行1224次。 elmg1是一个无符号长数组,大小为16 x 20。我的机器L1高速缓存大小为32KB,64B高速缓存行大小和8路组相关联。Cachegrind输出解释
- 为(I = 0;我< 20; i ++在)78336 2448 2 50184 0 0 1224 0 0
- {
- telm01 = elmg1 [I]; 146,880 0 0 73,440 0 0 24,480 0 0
- telm31 =(telm01 < < 3)^ val1; 97,920 0 0 48,960 0 0 24,480 0 0
- telm21 =(telm01 < < 2)^(val1 >> 1); 146,880 1,224 1 48,960 0 0 24,480 0 0
- telm11 =(telm01 < < 1)^(val1 >> 2); 146880 0 0 48960 0 0 24,480 0 0
- }
答:我已经把它放在这里的原因,就是在里面的3号线的循环,我看到一些I1的惦记(一个L2错过)。这有点混乱,我猜不出为什么?
B.我想优化(时间)一部分代码。以上只是一小段片断。我认为在我的程序内存中存取成本很高。像上面的例子一样,elmg1是一个16 x 20大小的无符号长整型数组。当我尝试在代码中使用它时,总会有一些错误,并且在我的程序中这些变量发生了很多。有什么建议么?
C.我需要分配和(有时初始化)这些无符号长整数。你能建议哪一个我更喜欢,calloc或数组声明,然后显式初始化。顺便说一下,缓存处理它们的方式会有什么不同吗?
谢谢。
答:没关系,但是为什么在第5行存在缓存未命中,而第3,4行的存储空间不足。我是否需要自己指定对齐方式,我读取默认情况下的malloc提供了8/16字节的对齐方式。 – anup 2010-11-01 08:57:09
是的,malloc应该提供至少8byte的对齐方式,但这与64bytes缓存对齐不一样。只有当你有一个64bytes的对象数组时,高速缓存对齐才是重要的。如果数组未分配缓存对齐,则访问数组中的任何一项可能会导致两次缓存未命中,而不是一次。但在这种情况下,缓存对齐不是问题。 – Neopallium 2010-11-01 10:34:16
感谢您的回复。但是,有一件事我不明白这些与3个缓存行有什么关系?应该有更多数量的缓存行。 – anup 2010-11-01 10:52:04