这是 cachegrind 输出的一部分。这部分代码已经执行了 1224 次。elmg1 是一个大小为 16 x 20 的无符号长数组。我的机器 L1 缓存大小为 32KB,缓存行大小为 64B,8 路集关联。
- 对于 (i = 0; i < 20; i++) 78,336 2,448 2 50,184 0 0 1,224 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); 146,880 0 0 48,960 0 0 24,480 0 0
- }
A. 我把它放在这里的原因是,在 for 循环内的第三行,我看到了许多 I1 未命中(还有一个 L2 未命中)。这有点令人困惑,我猜不出原因?
B. 我正在尝试优化(时间)一部分代码。以上只是一个小片段。我认为在我的程序内存访问中花费了我很多。就像上面的例子一样,elmg1 是一个 16 x 20 大小的无符号长数组。当我尝试在代码中使用它时,总会有一些失误,而在我的程序中,这些变量经常出现。有什么建议么?
C. 我需要分配和(有时初始化)这些无符号长整数。你能建议我更喜欢哪一个,calloc 或数组声明,然后显式初始化。顺便说一句,缓存处理它们的方式会有什么不同吗?
谢谢。