1

我用 Intel 11.1 构建了一个 Fortran 代码。我使用 -p 选项构建它以生成分析数据。当我检查这些结果时,存在一些不属于我的代码的例程。我想它们是由英特尔放在那里的。其中包括:

__powr8i4
__intel_new_memset
__intel_fast_memset
__intel_fast_memset.J
__intel_fast_memcpy
__intel_new_memcpy
__intel_fast_memcpy.J

还有其他人。当我在没有优化的情况下构建代码时,代码不会在其中花费太多时间。除了结果显示 __powr8i4 的使用率为 3.3%。但是,当我使用优化构建代码时,这个数字会上升到大约 35%。我似乎无法找出这些例程是什么,但它们使我的结果感到困惑,因为我想知道在哪里优化我的代码。

4

1 回答 1

0

大多数程序在调用子例程(通常是库子例程)上花费了很多周期,因此如果您只查看独占(自身)时间,您将看到您所看到的。

  • 因此,第 1 点是查看包容性(自我加被调用者)时间。

现在,如果分析器是“CPU 分析器”,它可能对 I/O 时间视而不见。这意味着你的程序可能大部分时间都在阅读或写作,但分析器不会给你任何线索。

  • 所以第 2 点是使用一个在“挂钟”时间而不是“CPU”时间上工作的分析器,除非你确定你没有做太多的 I/O。(有时你认为你不是在做 I/O,而是在一些子程序层的深处,你猜怎么着——它在做 I/O。)

许多分析器试图生成一个调用图,如果你的程序不包含递归,并且如果分析器可以访问你代码中的所有例程,这可能有助于识别代码中占很多的子例程调用的时间。但是,如果例程 A 很大并且在多个位置调用 B,则分析器不会告诉您要查看哪些代码行。

  • 第 3 点是使用分析器,如果可能的话,它会为您提供行级包含时间百分比。(百分比是最有用的数字,因为它告诉您如果可以以某种方式删除该行代码,您将节省多少总时间。此外,它不会受到系统中竞争进程的太大影响。)此类分析器的一个示例是缩放

可能是在你完成所有这些之后,你看不到你可以做多少来加速代码。但是,如果您可以看到数据的某些属性如何影响性能,您可能会发现可以获得进一步的加速。探查器无法查看数据。

  • 我所做的是在调试器下随机采样程序的状态,看看我是否能真正理解它在每个样本中所做的事情。你可以找到其他方式找不到的东西。(有些人说这不准确,但它是准确的——关于什么是重要的。重要的是问题是什么,而不是确切的成本。)这就是第 4 点。
于 2012-05-17T17:13:53.550 回答