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个请求。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |