我们有一个由具有以下CPU的机器组成的集群:
这些支持不同的指令集扩展(例如E5-2680 v3有AVX2而其他没有)。
-march=native
转发是否兼容,以便在最旧的机器上使用它编译的代码将在后面的模型上运行,还是应该手动找出最低的公分母?
gcc版本是4.8.2。
答案 0 :(得分:0)
-march=native
是否向前兼容,以便在最旧的计算机上使用它编译的代码将在以后的模型上运行
通常,不会。不能保证任意一个较新的芯片将在某个任意较旧的芯片上具有所有指令。使用GCC名为-march
的选项之一会更安全,因为较新的家庭往往是较老的家庭的超集,但是使用这种方式-march=native
通常并不安全。
对于这些专用芯片,我认为可以使用-march=native
,但是为什么要冒险呢?启用带有-msse4.2 -mavx
之类的选项的单个指令集,或使用命名选项。
使用现代GCC,您可以只使用与前两个匹配的-march=sandybridge
,而不使用第三个不支持的任何指令(我认为与-march=haswell
匹配)。对于GCC 4.8.2,-march=corei7-avx
应该对所有这些都有效。
https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html显示了每个-march
选项启用的指令,或者针对GCC 4.8.2 https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/i386-and-x86-64-Options.html列出了这些指令。