我想要你在优化Xeons时使用哪些gcc编译器标志输入?
mtune或march中没有'xeon',哪个是最接近的匹配?
答案 0 :(得分:57)
最新GCC / Xeon的更新。
Sandy-Bridge-based Xeon (E3-12xx系列,E5-14xx / 24xx系列,E5-16xx / 26xx / 46xx系列)。
GCC的 -march=corei7-avx
< 4.9.0或-march=sandybridge
代表GCC> = 4.9.0。
这将为Sandy Bridge启用Advanced Vector Extensions support以及AES和PCLMUL指令集。以下是GCC i386 / x86_64选项页面的概述:
Intel Core i7 CPU,支持64位扩展,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AES和PCLMUL指令集。
Ivy-Bridge-based Xeon (E3-12xx v2系列,E5-14xx v2 / 24xx v2系列,E5-16xx v2 / 26xx v2 / 46xx v2系列, E7-28xx v2 / 48xx v2 / 88xx v2系列)。
GCC的 -march=core-avx-i
< 4.9.0或-march=ivybridge
代表GCC> = 4.9.0。
这包括Sandy Bridge(corei7-avx)选项,同时还支持新的常春藤指令集:FSGSBASE,RDRND和F16C。从GCC选项页面:
Intel Core CPU具有64位扩展,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AES,PCLMUL,FSGSBASE,RDRND和F16C6指令集支持。
Haswell-based Xeon (E3-1xxx v3系列,E5-1xxx v3系列,E5-2xxx v3系列)。
-march=core-avx2
代表GCC 4.8.2 / 4.8.3或-march=haswell
代表GCC> = 4.9.0。
从GCC选项页面:
Intel Haswell CPU具有64位扩展,MOVBE,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,POPCNT,AVX,AVX2,AES,PCLMUL,FSGSBASE,RDRND,FMA,BMI, BMI2和F16C指令集支持。
Broadwell-based Xeon (E3-12xx v4系列,E5-16xx v4系列)
-march=core-avx2
代表GCC 4.8.x或-march=broadwell
代表GCC> = 4.9.0。
从GCC选项页面:
Intel Broadwell CPU,具有64位扩展,MOVBE,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,POPCNT,AVX,AVX2,AES,PCLMUL,FSGSBASE,RDRND,FMA,BMI, BMI2,F16C,RDSEED,ADCX和PREFETCHW指令集支持。
Skylake-based Xeon (E3-12xx v5系列)和 KabyLake-based Xeon (E3-12xx v6系列):
-march=core-avx2
代表GCC 4.8.x或-march=skylake
代表GCC 4.9.x或-march=skylake-avx512
代表GCC> = 5.x
AVX-512是256位高级向量扩展SIMD指令的512位扩展。
从GCC选项页面:
Intel Skylake Server CPU,具有64位扩展,MOVBE,MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,POPCNT,PKU,AVX,AVX2,AES,PCLMUL,FSGSBASE,RDRND,FMA ,BMI,BMI2,F16C,RDSEED,ADCX,PREFETCHW,CLFLUSHOPT,XSAVEC,XSAVES,AVX512F,AVX512VL,AVX512BW,AVX512DQ和AVX512CD指令集支持。
-march=skylake-avx512
。要了解编译器将使用-march=native
选项执行的操作:
gcc -march=native -Q --help=target
答案 1 :(得分:20)
较新版本的gcc具有 -march = native ,可让编译器自动确定最佳-march
标记。
答案 2 :(得分:7)
Xeon是一个营销术语,因此它涵盖了一长串具有完全不同内部的处理器。
如果您的意思是较新的Nehalem处理器(Core i7),则this slide表示从4.3.1开始gcc应该使用-march = generic(尽管您自己对自己应用的测试可能会找到其他优于其他设置的设置这个)。如果你想优化FP数学的那个方面,4.3系列还增加了-msse4.2。
以下是some discussion比较英特尔编译器与某些gcc标志的调整。
答案 3 :(得分:3)
march =本机适用于您自己的机器但对二进制版本不利。
-march = nocona建议用于原子330(p4 / 64bit) -march = core2用于core2
我假设你要去64位。
答案 4 :(得分:3)
以下内容将向您展示处理器支持的所有标志:
cat /proc/cpuinfo | grep flags | head -1
确定procceor存在哪些优化的最佳方法不仅取决于模型,还取决于您正在编译的系统上的gcc版本。请务必检查您拥有的gcc版本,并在其文档中进行交叉引用:
https://gcc.gnu.org/onlinedocs
即。我有Slackware 14.1 x64,它有gcc 4.8.2,所以我会去这里:
https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/i386-and-x86-64-Options.html#i386-and-x86-64-Options
答案 5 :(得分:2)
我对英特尔CPU和x86_64的经验是,每次我试图告诉gcc针对特定CPU类型进行优化时,性能都比使用-march = generic更差,而不是更好。 YMMV,当然,但多年来我一直玩这么多次的东西,而且一直都是这样。
OTOH,在i386上,至少针对i686,或者如果你想要SSE数学,至少是奔腾4可能是有意义的。