程序结构和缓存行为

如果还没有为 cachetest 收集性能数据,必须进行收集。相关说明参见为 cachetest 示例收集数据

在示例的此部分,将检查 dgemv_g2 性能优于 dgemv_g1 的原因。

  1. 选择 [文件] 然后选择 [打开],打开 cpi.er
  2. 选择 [文件] 然后选择 [添加],添加 dcstall.er
  3. 在 [函数] 标签中,将用户 CPU 时间的值与 CPU 周期进行比较。

    由于DTLB(后备式数据转换缓冲区)未命中,dgemv_g1 的这两个度量会有一些差异。当 CPU 等待解决 DTLB 未命中问题时,系统时钟仍在运行,但周期计数器将会关闭。可以忽略 dgemv_g2 的差异,表明几乎没有未命中的 DTLB。

  4. 比较 dgemv_g1dgemv_g2 的 D 和 E 缓存延迟时间。

    dgemv_g2 中等待重新加载缓存的时间比 dgemv_g1 中少,这是因为 dgemv_g2 中的数据访问方法能更有效地利用缓存。

    为查明原因,应检查带注释的源代码。首先删除大部分的度量,以限制显示的数据。

  5. 选择 [视图] 然后选择 [设置数据表示],并在 [度量] 标签中清除 [执行的指令] 和 [CPU 周期] 复选框。
  6. 单击 [函数] 标签中的 dgemv_g1,然后单击 [源] 标签。
  7. 重新调整和滚动显示画面,以便看到 dgemv_g1dgemv_g2 的源代码。

    这两个例程中的循环结构不同。因为没有优化代码,所以以大跨距(此例中为 6000)按行访问 dgemv_g1 中的数组中的数据。这就是未命中 DTLB 和缓存的原因。在 dgemv_g2 中,以一个单位的跨距按列访问数据。由于每个循环迭代的数据都是连续的,因此可以将很大的段映射并加载到缓存中,仅当此段被使用而需要另一个段时,才会出现未命中缓存的情况。


找到要找的内容了吗?如未找到,请将您的意见通过电子邮件发送至 docfeedback@sun.com。
法律声明