gpt4 book ai didi

c++ - 强制编译器以 block 的形式优化函数

转载 作者:行者123 更新时间:2023-11-28 01:52:22 27 4
gpt4 key购买 nike

具体来说,我使用的是 gcc -O2 -g,但它可能适用于任何编译器。

当我使用用于分析的调试信息进行优化构建时,一个问题是编译器内联并优化了整个函数,因此从一个二十行的函数调用了几次,我最终只剩下四五个行号在代码中,一个行号已经收集了75%左右的代码,所以我很难说出瓶颈到底在哪里。让我举例说明:

void foo()
{
// code...
foo = doThingOne(); // Gets inlined
bar = doThingTwo(); // Gets inlined

externalFunction(foo, bar); // Doesn't get inlined
// code...
}

现在,当我查看分析器输出时,我看到类似这样的内容 - 百分比是在每个优化后行上花费的时间:

   void foo()
10%{
// code...
3% foo = doThingOne(baz); // Gets inlined
bar = doThingTwo(wibble); // Gets inlined

75% externalFunction(foo, bar); // Doesn't get inlined
12% // code...
}

这 3% 可能就像 push baz 一样,大部分代码集中在调用 externalFunction() 的行中。我当然可以使 doThingOne() 成为外部的,但这需要付出很多努力,所以如果我能说出类似这样的话就更好了:

void foo()
{
// code...
foo = doThingOne(); // Gets inlined
#pragma optimisation_barrier
bar = doThingTwo(); // Gets inlined

#pragma optimisation_barrier
externalFunction(foo, bar); // Doesn't get inlined
// code...
}

这会将优化分成三个 block ,因此我可以清楚地看到三个函数在接近实际最终运行代码的状态下的相对权重。有这种东西吗?

最佳答案

如果您的 externalFunction 被声明为外部的,在另一个翻译单元中定义,而不是 static inline 它不会被内联,除非您要求 通过使用 gcc -flto -O2 编译和链接优化链接时间 (例如,使用 make CC='gcc -flto -O2' 构建)您的整个程序或库。另见 this .

GCC 有 pragmas for optimizations :

#pragma GCC optimize ("O2")

(也许您可以在函数体之前尝试#pragma GCC optimize("O3") )

This would break the optimzation into three chunks

但优化适用于更大的部分,至少适用于整个函数体。我认为根据要优化的“ block ”来思考并没有多大意义。

最后,优化可能会混淆分析信息(以及 DWARF 中的调试信息)。因此,请谨慎对待,并对整个程序(或至少是程序的完整顶级功能)进行基准测试。我会谨慎对待 75% 的数字。

顺便说一句,inlining并不总是意味着加速(因为 CPU caches ,更大的代码对缓存不友好)。也许你可以增加你的 -finline-limit= setting .但是你可能会失去性能!

此外,使用 -S -O2 -fverbose-asm 编译您的代码,并在 .s 文件中查看生成的汇编代码,然后您将看到有什么已内联。

关于c++ - 强制编译器以 block 的形式优化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42501146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com