0

最近一直在寻找PGO的相关话题,开始想知道它们是如何应用到源代码中的,并且已经应用​​了一个又一个的应用效果。

我的意思是,如果您在 GCC 或 CLang 中启用 PGO 优化,例如,它将应用所有优化(内联、虚拟调用推测、死代码分离等),对吧!?

即使它们都没有应用于源代码,让我们假设其中一些是。那么,我猜它们是按顺序应用的,对吧?

那么,他们能否将 CFG(控制流图)修改为一些基本块频率丢失的程度?

例如,如果在名为“A”的 PGO 之后应用了名为“B”的 PGO,并且“A”修改了源代码,导致丢失了一些 Basic Blocks 频率,那么“B”如何应用(假设两者都是 PGO这取决于BB频率)?

(对不起,我的英语不好)

4

1 回答 1

1

PGO 和大多数其他优化不会应用于源代码,它们应用于中间代码。源代码本身保持不变。但是,生成的二进制代码将(希望)进行优化。

PGO 的目的是提高传统优化的有效性,包括内联、虚拟调用推测和很少执行的代码分离。所以它们仍然被应用。你猜对了,它们是按顺序应用的。

其中一些优化会更改代码的 CFG。但是,编译器会跟踪已分析的原始基本块,即使它们在中间代码中的位置已更改。在 PGO 中,编译器从不删除任何基本块。然而,编译器可以保持基本块相同、改变其位置、将基本块扩展为多个基本块或插入新的基本块。无论它做什么,它都会跟踪原始配置的基本块及其执行统计信息,以便进一步的优化知道如何使用配置文件。如果插入了新的基本块,它将正常优化而不使用配置文件。

于 2015-10-19T10:36:12.407 回答