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