哪些GCC优化标志和技术适用于所有CPU?

3

当编译/链接C/C++库或程序时,这些库或程序旨在适用于所有ISA(例如x86-64)的实现时,从正确性和运行时性能的角度来看,哪些优化标志是安全的?我想要的是产生正确结果并且不会对特定CPU性能造成负面影响的优化。例如,我想避免使用会在第8代Intel Core i7上提高运行时性能但会导致AMD Ryzen性能下降的优化标志。

PGO、LTO和-O3是否安全?这完全取决于-march-mtune(或缺少它们)吗?


1
编译器优化是否安全?何时可以放心地使用 -O3 编译程序?安全关键软件和优化编译器。编译器优化会引入错误吗?所有 -Ox 优化都是安全的。如果它们产生不同的结果,那么要么是您的代码中存在错误/未定义行为,要么是编译器的错误。 - phuclv
1
使用PGO(profile-guided optimization)在生产环境中存在的风险,不建议使用。链接时优化是否有任何不使用的理由? - phuclv
1个回答

4
他们都应该是“安全的”,假设你的代码定义良好。
如果您不想为特定的CPU系列进行专门设置,请保持-march和-mtune不变。默认适用于通用x86_64。
PGO始终是一个好主意,它主要用于避免分支。
LTO和-O3可能对不同的代码库产生不同的影响。例如,如果您的代码从矢量化中受益,则-O3比-O2更有优势,但额外的内联和展开可能会导致更大的代码大小,在具有更有限缓存的系统上可能会产生不利影响。
最后,这里真正有意义的唯一建议就是:“测量一下并查看对您的代码有什么好处。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接