编译器中的-march标志(例如:gcc)真的很重要吗?
如果我使用-march = my_architecture而不是-march = i686
编译我的所有程序和内核会更快答案 0 :(得分:3)
是的,虽然差异有时只是相关的。它们可能非常大,但是如果您的代码可以被矢量化以使用SSE或其他扩展指令集,这些指令集在一个架构上可用但在另一个架构上不可用。当然,32位和64位之间的差异可以(但不一定总是)显而易见(如果您认为它是-m64
参数的类型,那就是-march
。
作为一个不确定的证据,几年前我在gcc
遇到了一个有趣的错误,其中在Pentium 4上运行的特定代码片段大约是慢的2倍。使用-march=pentium4
编译而不是使用-march=pentium2
进行编译。
所以:通常没有区别,有时会有,有时它会比你期望的那样。与往常一样:在您决定使用超出“安全”范围的任何优化之前进行测量(例如,使用您实际的精确CPU模型而不是更通用的模型)。
答案 1 :(得分:1)
无法保证使用march
编译的任何代码都会更快/更慢w.r.t.另一个版本。它实际上取决于代码的“种类”,实际结果只能通过测量获得。例如,如果你的代码有很多可能的矢量化,那么结果可能会有所不同,有或没有'march'。另一方面,有时编译器在向量化期间做得很差,并且在为特定体系结构编译时可能会导致代码变慢。