我正在使用英特尔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线程设置为一个,认为它可能会混淆.dyn输出,但结果是相同的 - 它比简单的编译慢。
我的问题是:它在理论上是否可行,或者我在某种程度上使用编译器选项弄乱PGO进程?
答案 0 :(得分:1)
3.3秒的浮点应用程序不会从配置文件引导的优化中受益。根据我的猜测,您正在进行某种原始数据处理,如果您需要原始FLOP而不是PGO,则更适合手动编码。
PGO不会告诉编译器如何优化内部循环以消除分支延迟并保持管道满。 可以告诉它你的循环是否可能只运行5000次,或者你的浮点数是否符合某些标准。
它用于统计代表您希望其运行的其他数据的数据。换句话说,您可以将它与您希望能够以良好剪辑运行其他数据的程序上的数据一起使用。它并不一定针对手头的程序进行优化,正如你所说的那样,甚至可能会减慢一点可能的净增益。
这实际上取决于您的程序,但OpenMP FP应用程序并不是PGO的用途。像其他一切一样,它不是“神奇的子弹”。