Profiling 从ifort 11.1构建的评测代码生成了\uuuPowr8i4例程,它是什么?

Profiling 从ifort 11.1构建的评测代码生成了\uuuPowr8i4例程,它是什么?,profiling,intel-fortran,Profiling,Intel Fortran,我用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 还有其他的。当我在没有优化的情况下构建代码时

我用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

还有其他的。当我在没有优化的情况下构建代码时,代码不会在其中花费太多时间。除了结果显示3.3%的时间使用功率8I4。然而,当我通过优化构建代码时,这个数字会上升到35%左右。我似乎无法找出这些例程是什么,但它们混淆了我的结果,因为我想知道在哪里可以优化代码

大多数程序在调用子例程(通常是库子例程)时会花费大量的周期,因此,如果只查看独占(自)时间,就会看到所看到的内容

  • 因此,第1点是看包容性(自我加被叫方)时间
现在,如果探查器是“CPU探查器”,那么它可能对I/O时间一无所知。这意味着您的程序可能要花费大部分时间来阅读或写作,但分析器不会给您任何关于这方面的线索

  • 因此,第2点是使用一个在“挂钟”时间而不是“CPU”时间工作的分析器,除非您确定自己没有做太多I/O(有时您认为自己没有做I/O,但在某些子程序层的深处,猜猜看——它在做I/O。)
许多探查器尝试生成调用图,如果您的程序不包含递归,并且探查器可以访问代码中的所有例程,那么这将有助于识别代码中占用大量时间的子例程调用。 但是,如果例程A很大,并且在多个位置调用了B,探查器将不会告诉您要查看哪些代码行

  • 第三点是,如果可能的话,使用一个分析器,为您提供行级别的包含时间百分比。 (百分比是最有用的数字,因为它告诉您,如果您能够以某种方式删除该行代码,您将节省多少总时间。此外,它不会受到系统中竞争进程的太大影响。) 这种分析器的一个例子是
可能在您完成所有这些之后,您看不到有什么可以加快代码的速度。 然而,如果您能够看到数据的某些属性可能会如何影响性能,您可能会发现可以得到进一步的加速。探查器无法查看数据

  • 我所做的是调试程序下的程序状态,看看是否能真正理解它在每个示例中所做的事情。 你可以找到其他方法找不到的东西。 (有些人说这并不准确,但它是准确的——关于什么是重要的。重要的是问题是什么,而不是它的确切成本。) 这就是第四点

我仍然没有找到问题的具体答案,但我认为“powr8i4”是英特尔数学库中的一个函数,用于计算某事物的幂。换句话说,如果指定x2,则该操作将由“powr8i4”完成。通过在调试期间停止代码,当代码位于幂函数(例如,x2)上时,堆栈跟踪将指向此库,这使我认为情况就是这样。换句话说,我的代码似乎花了很多时间做幂运算。