最近,我一直在寻找PGO的相关主题,并开始思考如何将它们应用到源代码中,并且已经应用了一个又一个的应用效果。
我的意思是,如果您在GCC或CLang中启用PGO优化,例如,它将应用所有优化(内联、虚拟调用推测、死码分离等),对吗?
即使它们都没有应用于源代码,让我们假设其中一些是。那么,我猜它们是按顺序应用的,对吧?
那么,他们能修改CFG (控制流图)到一些基本的块频率丢失点吗?
例如,如果在名为"A“的PGO之后应用了名为"B”的PGO,而"A“修改了源代码,导致一些基本块频率丢失,那么如何应用"B”(假设两者都是依赖BB频率的PGO)?
(对不起,我的英语很差)
发布于 2015-10-19 10:36:12
PGO和大多数其他优化不应用于源代码,而是应用于中间代码。源代码本身保持不变。但是,生成的二进制代码将被优化(希望如此)。
PGO的目的是提高传统优化的效率,包括内联、虚拟调用推测和很少执行的代码分离。所以他们都还在申请。你猜对了,它们是按顺序顺序应用的。
其中一些优化会改变代码的CFG。但是,编译器跟踪原始的基本块,即使它们在中间代码中的位置已经改变了。在PGO中,编译器从不删除任何基本块。但是,编译器可以保持基本块不变,更改其位置,将基本块展开为多个基本块,或者插入新的基本块。不管它做什么,它都会跟踪原始配置的基本块及其执行统计数据,以便进一步的优化知道如何使用概要文件。如果插入了一个新的基本块,它将在不使用配置文件的情况下进行优化。
https://stackoverflow.com/questions/32829044
复制相似问题