C PGO比静态优化慢(英特尔编译器)

C PGO比静态优化慢(英特尔编译器),c,optimization,icc,C,Optimization,Icc,我正在使用英特尔C编译器的I-32A体系结构。 当我使用以下选项编译我的C程序时: icl mytest.c /openmp /QxHost /fp:fast /fast 试运行时间为3.3秒。现在我尝试使用PGO,因此我使用: icl mytest.c /openmp /QxHost /fp:fast /fast /Qprof-gen 然后,我使用示例输入运行可执行文件2-3次,并使用以下命令再次编译: icl mytest.c /openmp /QxHost /fp:fast /fast

我正在使用英特尔C编译器的I-32A体系结构。 当我使用以下选项编译我的C程序时:

icl mytest.c /openmp /QxHost /fp:fast /fast
试运行时间为3.3秒。现在我尝试使用PGO,因此我使用:

icl mytest.c /openmp /QxHost /fp:fast /fast /Qprof-gen
然后,我使用示例输入运行可执行文件2-3次,并使用以下命令再次编译:

icl mytest.c /openmp /QxHost /fp:fast /fast /Qprof-use
希望它能考虑到收集到的信息。事实上,它告诉我它正在使用.dyn文件,但生成的可执行文件比不使用Qprof时要慢(3.85s),并且这与运行时执行的数据完全相同(对于PGO来说应该是完美的)。 我尝试将openmp线程设置为1,认为它可能会干扰.dyn输出,但结果是一样的——它比简单编译慢


我的问题是:这在理论上是可能的,还是我在某种程度上把PGO过程与编译器选项弄乱了?

一个3.3秒的浮点应用程序不会从概要文件引导的优化中获益。根据我的猜测,您正在进行某种原始数据处理,如果您需要原始触发器,它比PGO更适合手工编码汇编

PGO不会告诉编译器如何优化内部循环以消除分支延迟并保持管道完整。它可能会告诉它您的循环可能只运行5000次,或者您的浮动是否满足某些条件

它与您希望运行它的其他数据的统计代表性数据一起使用。换言之,您可以将其与程序上的数据一起使用,以便能够以良好的剪辑运行其他数据。它不一定会针对手头的程序进行优化,正如您所说的,甚至可能会为了可能的净收益而将其减慢一点


这确实取决于您的程序,但OpenMP FP应用程序不是PGO的用途。与其他任何东西一样,它不是“魔弹”。

一个3.3秒的浮点应用程序不会从概要文件引导的优化中获益。根据我的猜测,您正在进行某种原始数据处理,如果您需要原始触发器,它比PGO更适合手工编码汇编

PGO不会告诉编译器如何优化内部循环以消除分支延迟并保持管道完整。它可能会告诉它您的循环可能只运行5000次,或者您的浮动是否满足某些条件

它与您希望运行它的其他数据的统计代表性数据一起使用。换言之,您可以将其与程序上的数据一起使用,以便能够以良好的剪辑运行其他数据。它不一定会针对手头的程序进行优化,正如您所说的,甚至可能会为了可能的净收益而将其减慢一点


这确实取决于您的程序,但OpenMP FP应用程序不是PGO的用途。和其他东西一样,它不是“魔弹”。

谢谢,这很有帮助。我仍然感到惊讶的是,对于运行概要文件时使用的完全相同的数据,它会给出更糟糕的结果。对此有什么解释吗?@Piotrolopusiewicz是的。就像我说的,它可能会决定你的循环通常会在5000次迭代后终止。如果这样做,它将添加代码来检查5000次迭代前后的终止条件。它将基本上添加启发式,以加快平均预测案例的速度,而不一定是您正在运行的案例,例如qsort性能如何摊销。顺便说一下,循环只是一个简单的例子。谢谢,这很有帮助。我仍然感到惊讶的是,对于运行概要文件时使用的完全相同的数据,它会给出更糟糕的结果。对此有什么解释吗?@Piotrolopusiewicz是的。就像我说的,它可能会决定你的循环通常会在5000次迭代后终止。如果这样做,它将添加代码来检查5000次迭代前后的终止条件。它将基本上添加启发式,以加快平均预测案例的速度,而不一定是您正在运行的案例,例如qsort性能如何摊销。顺便说一下,循环只是一个简单的例子。
/Qpprof use
?第二个p应该在那里吗?只是一个输入错误;键入比从控制台复制粘贴更快:)
/Qpprof use
?第二个p应该在那里吗?只是一个输入错误;键入比从控制台复制粘贴更快:)