|   |      1 
                                  4
                             首先检查生成的汇编代码是很重要的,因为cachegrind将模拟这个过程。您感兴趣的循环将编译为以下代码: 
   每个迭代有8个读取访问,每个访问的大小为8字节。在C++中,保证每个元素是8字节对齐的,但是根据迭代数组的地址,每次迭代最多可以访问两条缓存行。
    请注意,cachegrind基于运行它的机器模拟了一个非常简化的缓存层次结构。在本例中,它是amd2400g,在所有缓存级别上都有64字节的行大小。此外,L3的大小为4MB。但由于总的数组大小是8MB,因此以下循环: 
   将只在LLC中保留数组的后半部分。现在在第二个循环的第一个迭代中
    
   注意cachegrind只是一个模拟器,在一个真正的处理器上实际发生的事情可能是非常不同的。例如,在Haswell处理器上,使用
    | 
|   |      2 
                                  2
                             
   我怀疑这是因为向量缓冲区没有在缓存线边界上对齐。当我们继续下一行时,缓存中的突然跳转未命中标记了一个点。所以我建议你检查一下
    | 
|  |      3 
                                  1
                             在我看来,如果我们忘记了前1百万次的后推(8Mb。。。嗯,也许你没有足够的空间在L2)。因此,如果我们假设数据不在任何级别的缓存中,那么每次读取8倍的数据时,就必须向RAM请求下一个L1行。所以总体来说你的数据看起来不错。由于simplet顺序访问模式,您正在调用QWORD reads 1M次,并向RAM生成125k个请求。 | 
|   | AstralHex · 矩阵乘法代码工作不正常 8 月前 | 
|   | Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 8 月前 | 
|   | Die4Toast · 递归调用成员箭头运算符-> 8 月前 | 
|   | Anka Hanım · 关于结构和动态数组地址的问题 8 月前 |