如果还没有为 cachetest 收集性能数据,必须进行收集。相关说明参见为 cachetest 示例收集数据。
在示例的此部分,将检查 dgemv_g2 性能优于 dgemv_g1 的原因。
由于DTLB(后备式数据转换缓冲区)未命中,dgemv_g1 的这两个度量会有一些差异。当 CPU 等待解决 DTLB 未命中问题时,系统时钟仍在运行,但周期计数器将会关闭。可以忽略 dgemv_g2 的差异,表明几乎没有未命中的 DTLB。
在 dgemv_g2 中等待重新加载缓存的时间比 dgemv_g1 中少,这是因为 dgemv_g2 中的数据访问方法能更有效地利用缓存。
为查明原因,应检查带注释的源代码。首先删除大部分的度量,以限制显示的数据。
这两个例程中的循环结构不同。因为没有优化代码,所以以大跨距(此例中为 6000)按行访问 dgemv_g1 中的数组中的数据。这就是未命中 DTLB 和缓存的原因。在 dgemv_g2 中,以一个单位的跨距按列访问数据。由于每个循环迭代的数据都是连续的,因此可以将很大的段映射并加载到缓存中,仅当此段被使用而需要另一个段时,才会出现未命中缓存的情况。