C++ GCC手工挑选优化

C++ GCC手工挑选优化,c++,gcc,C++,Gcc,我看到了这条线索,我也有同样的问题,但这个问题并没有得到真正的回答: 我正试图弄清楚到底是什么标志在O1中带来了令人难以置信的性能提升。我首先使用g++-O1-Q--help=optimizers找到设置了哪些标志,然后获得每个启用的标志,并使用它们来用g++编译。但是输出结果不同(二进制文件本身大小不同) 我如何为g++手工选择优化,或者这是不可能的?并非所有优化都有单独的标志,因此它们的组合不会生成与使用-O1或任何其他通用优化启用选项(-Os,-O2等)相同的代码。另外,我认为当您使用-O

我看到了这条线索,我也有同样的问题,但这个问题并没有得到真正的回答:

我正试图弄清楚到底是什么标志在O1中带来了令人难以置信的性能提升。我首先使用
g++-O1-Q--help=optimizers
找到设置了哪些标志,然后获得每个启用的标志,并使用它们来用g++编译。但是输出结果不同(二进制文件本身大小不同)


我如何为g++手工选择优化,或者这是不可能的?

并非所有优化都有单独的标志,因此它们的组合不会生成与使用
-O1
或任何其他通用优化启用选项(
-Os
-O2
等)相同的代码。另外,我认为当您使用
-O0
(默认设置)时,许多特定的优化选项都会被忽略,因为如果优化通常没有启用,它们需要跳过的过程

要缩小性能提升的范围,您可以尝试使用
-O1
,然后有选择地禁用优化。例如:

g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ...
不过,这样你的运气可能不会更好。可能是多种优化组合在一起提高了性能。它也可能是任何特定标志未涵盖的优化的结果


我还怀疑更好的缓存局部性是否会导致“性能的难以置信的提升”。如果是这样,那很可能是巧合,尤其是在
-O1
。性能的大幅提高通常是因为GCC能够消除代码的一部分,或者因为它实际上没有任何净效果,总是导致计算相同的值,或者它调用了未定义的行为

并非所有优化都有单独的标志,因此它们的组合不会生成与使用
-O1
或任何其他通用优化启用选项(
-Os
-O2
等)相同的代码。另外,我认为当您使用
-O0
(默认设置)时,许多特定的优化选项都会被忽略,因为如果优化通常没有启用,它们需要跳过的过程

要缩小性能提升的范围,您可以尝试使用
-O1
,然后有选择地禁用优化。例如:

g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ...
不过,这样你的运气可能不会更好。可能是多种优化组合在一起提高了性能。它也可能是任何特定标志未涵盖的优化的结果


我还怀疑更好的缓存局部性是否会导致“性能的难以置信的提升”。如果是这样,那很可能是巧合,尤其是在
-O1
。性能的大幅提高通常是因为GCC能够消除代码的一部分,或者因为它实际上没有任何净效果,总是导致计算相同的值,或者它调用了未定义的行为

如果优化器能给您带来令人难以置信的性能提升,为什么您要手工挑选它们,而不是让优化器完成它的工作呢?并不是-O*中包含的所有优化都可以作为独立开关使用。@MattJordan我想找出是什么导致了性能的提高。我强烈怀疑这是缓存被更好地使用的结果,但我无法轻松地扩展问题,因此找出原因的唯一其他方法是找到对运行时影响最大的优化,并查看它是否导致程序具有更好的局部性。如果是这样的话,那么很明显,这种改进是带宽受限的结果。否则,这是另一回事,但知道是哪种优化导致了它会有所帮助。看看生成的代码?@AlanStokes我希望找到一种更简单的方法…为什么你想手工挑选它们,而不是让优化器完成它的工作,如果它能给您带来难以置信的性能提升?并非-O*中包含的所有优化都可以作为独立开关提供。@MattJordan我想了解是什么导致了性能的提高。我强烈怀疑这是缓存被更好地使用的结果,但我无法轻松地扩展问题,因此找出原因的唯一其他方法是找到对运行时影响最大的优化,并查看它是否导致程序具有更好的局部性。如果是这样的话,那么很明显,这种改进是带宽受限的结果。否则,这是另一回事,但知道是哪种优化导致了它会有所帮助。看看生成的代码?@AlanStokes我希望找到一种更简单的方法。。。