如何正确确定英特尔处理器的-march和-mtune?

时间:2019-07-03 12:44:50

标签: performance gcc x86 intel compiler-optimization

我目前正在从源代码构建对我的性能至关重要的软件。因此,我想对其进行优化以在我的特定Intel CPU上运行。构建过程要求我设置-march和-mtune标志。

如果我在处理器节点上使用

gcc -march=native -Q --help=target|grep march
gcc -mtune=native -Q --help=target|grep mtune

3月获得“ core-avx2”,而mtune获得“通用”。但是使用

cat /proc/cpuinfo

我得到:

processor   : 23
vendor_id   : GenuineIntel
cpu family  : 6
model       : 63
model name  : Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
stepping    : 2
microcode   : 0x3d
cpu MHz     : 2599.993
cache size  : 30720 KB
physical id : 1
siblings    : 12
core id     : 13
cpu cores   : 12
apicid      : 58
initial apicid  : 58
fpu     : yes
fpu_exception   : yes
cpuid level : 15
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt xsave avx f16c rdrand lahf_lm abm epb intel_ppin ssbd ibrs ibpb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts
bogomips    : 4599.35
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

通过转到2.30GHz(https://ark.intel.com/content/www/de/de/ark/products/81709/intel-xeon-processor-e5-2670-v3-30m-cache-2-30-ghz.html)的Intel®Xeon®CPU E5-2670 v3主页,我发现: 代号->产品以前是Haswell

如果我使用

gcc -march=haswell -Q --help=target|grep march
gcc -mtune=haswell -Q --help=target|grep mtune

我俩都“得了”。 所以我不应该使用haswell代替core-avx2前进吗?最好的选择是什么?

顺便说一句,我在CentOS7上使用的是GCC 4.8.5。

谢谢!

编辑:

gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3

-> core-avx2

gcc -mtune=native -Q --help=target | grep -- '-mtune=' | cut -f3

->通用

2 个答案:

答案 0 :(得分:3)

在您使用的gcc版本中,Haswell被称为core-avx2。其他微架构的名称也很差。例如,常春藤桥,桑迪桥和韦斯特米尔分别被称为core-avx-i,corei7-avx和corei7。从gcc 4.9.0开始,将使用微体系结构的实际名称,因此当在Haswell处理器而不是core-avx2上使用gcc -march=native -Q --help=target|grep march时,gcc将打印Haswell(请参见patch)。

当将-mtune=native传递给gcc且所使用的gcc版本未知主机处理器时,它将应用generic调整。只有gcc 5.1.0和更高版本才知道您的处理器型号(63)(请参见patch)。

-Q --help=target的名称打印部分必须为-march=native选择一个名称。对于对于您的GCC而言尚无法识别的新CPU,如果处理器支持ADX,则将选择Broadwell之类的东西;或者,主处理器所支持的支持最高SIMD扩展(最高AVX2)的微体系结构(由{{ 1}})。

但是cpuid的实际效果是启用所有适当的-march=native等选项,所有选项均使用-mavx -mpopcnt -mbmi2 -mcx16分别检测。因此,出于代码生成目的,cpuid始终可用于启用您的GCC知道如何使用的ISA扩展,即使它不能识别您的CPU。

但是对于设置-march=native选项,tune-march=native完全失败,并且在无法准确识别您的CPU时退回到-mtune=native。不幸的是,对于未知的Intel CPU,它不会执行generic之类的事情。


在您的处理器上,gcc知道它支持AVX2,因此它假定为Haswell处理器(在您的gcc版本中称为core-avx2),因为从Haswell开始就支持AVX2,但它不确定是否确实是Haswell处理器。这就是为什么它应用通用调整而不是针对core-avx2(即Haswell)进行调整的原因。但是在这种情况下,我认为这与调整core-avx2具有相同的效果,因为对于该编译器版本,只有Haswell支持AVX2,并且编译器知道主机处理器支持AVX2。但是,一般来说,即使在未知的CPU上正确猜出tune=intel,它也可能无法调优本机微体系结构。

(编者注:否,-march不能适应启用的指令集选项。它仍然是完全通用的调整,包括关心诸如不支持AVX2的AMD Phenom或Intel Sandybridge之类的CPU。参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568Why doesn't gcc resolve _mm256_loadu_pd as single vmovupd?

这是为什么应该使用tune=generic-march=native(具有足够新的gcc)而不是-march=haswell的原因。另一个原因是您可能会忘记-mavx2 -mfma,甚至可能忘记-mbmi2 -mpopcnt -mcx16

答案 1 :(得分:1)

  

顺便说一句,我在CentOS7上使用的是GCC 4.8.5。

如果性能至关重要,则应使用最新版本的GCC。 The 4.8 release series dates back to 2013,并且缺少当前版本中的许多性能增强功能。当前版本具有significantly expanded tuning options for x86,包括许多处理器系列在2013年不存在的-march设置。