程序优化和性能

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

在本部分中,将检查两个不同优化选项 -O2-fast 对程序性能的影响。带注释的源代码中显示的编译器注释消息将指出对代码所做的转换。

  1. 如果尚未执行下列任务,请执行:
    1. 选择 [文件] 然后选择 [打开],打开 cpi.er
    2. 选择 [文件] 然后选择 [添加],添加 dcstall.er
    3. 选择 [视图] 然后选择 [设置数据表示],确保将时间作为 CPU 周期的度量,并确保为执行的指令选择了度量。
    4. 在 [函数] 标签中,单击 [名称] 列的标题。
  2. dgemv_opt1dgemv_opt2 的度量与 dgemvdgemv_g2 的度量进行比较。

    源代码与 dgemvdgemv2 中的源代码相同。不同之处是 dgemv_opt1dgemv_opt2 已经用 -O2 编译器选项编译过。无论使用用户 CPU 时间还是 CPU 周期进行度量,这两个函数都显示出 CPU 时间的减少,;执行的指令数的减少也几乎相同,但没有一个函数改进了缓存行为。

  3. 在 [函数] 标签中,将 dgemv_opt1dgemv_opt2 的度量与 dgemv_hi1dgemv_hi2 的度量进行比较。

    源代码与 dgemv_opt1dgemv_opt2 中的源代码相同。不同之处是它们已经用 -fast 编译器选项编译过。现在两个例程都有相同的 CPU 时间和缓存性能。与 dgemv_opt1dgemv_opt2 相比,CPU 时间和缓存延迟周期时间都有所减少。等待缓存加载大约占用 80% 的执行时间。

  4. 单击 dgemv_hi1,然后单击 [源] 标签。重新调整和滚动显示画面,以便看到所有 dgemv_hi1 的源代码。

    编译器已经执行大量工作来优化此函数。它已经交换了导致 DTLB 未命中问题的循环。此外,编译器创建了新循环,每个循环周期都执行更多的浮点加法和浮点乘法运算,并且插入了预取指令来改进缓存行为。

  5. 向下滚动以查看 dgemv_hi2 的源代码。

    除了循环交换外,编译器注释消息与 dgemv_hi1 的相同。此时,编译器为这两种函数生成的汇编代码基本相同。

  6. 单击 [反汇编] 标签。

    将该反汇编列表与 dgemv_g1dgemv_opt1 的反汇编列表进行比较。对于 dgemv_hi1,生成的指令更多,但执行的指令数量在三种函数中是最少的。优化可以产生更多指令,但这些指令可被更有效地使用和更少地执行。

另请参见
函数标签
源标签
反汇编标签
查找数据流问题

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