在编译/链接旨在用于ISA所有实现(例如x86-64)的C / C ++库或程序时,从正确性和运行时性能的角度来看,哪些优化标志是安全的?我希望优化能够产生正确的结果,并且不会对特定CPU的性能造成不利影响。例如,我想避免使用优化标记,这些标记可以在第8代Intel Core i7上提高运行时性能,但会导致AMD Ryzen上的性能下降。
PGO,LTO和-O3
安全吗?它是否仅取决于-march
和-mtune
(或不存在)?
答案 0 :(得分:4)
假设您的代码定义正确,它们都应该是“安全的”。
如果您不想专门研究某个特定的CPU系列,那么就不理会-march
和-mtune
了;默认值适合通用x86_64。
PGO始终是一个好主意,主要用于避免分支。
LTO和-O3对不同的代码库可能会有不同的影响。例如,如果您的代码受益于向量化,那么-O3是-O2的一个大胜利,但是额外的内联和展开可能导致更大的代码大小,这对于高速缓存有限的系统可能是不利的。
最后,唯一真正有意义的建议是:对其进行度量,并查看对您的代码有什么好处。