【发布时间】:2010-10-30 22:25:58
【问题描述】:
我希望您输入在针对 Xeons 进行优化时使用哪些 gcc 编译器标志?
在 mtune 或 March 中没有“至强”,那么哪个是最接近的匹配项?
【问题讨论】:
-
您可能希望更具体地了解您的目标是哪个 Xeon。 Xeon 品牌已经存在了相当长的一段时间,并且跨越了一系列非常不同的架构。
标签: c++ c optimization gcc compiler-flags
我希望您输入在针对 Xeons 进行优化时使用哪些 gcc 编译器标志?
在 mtune 或 March 中没有“至强”,那么哪个是最接近的匹配项?
【问题讨论】:
标签: c++ c optimization gcc compiler-flags
最新的 GCC / Xeon 更新。
Sandy-Bridge-basedXeon(E3-12xx 系列、E5-14xx/24xx 系列、E5-16xx/26xx/46xx 系列)。
-march=corei7-avx 用于 GCC -march=sandybridge 用于 GCC >= 4.9.0。
这将为 Sandy Bridge 启用 Advanced Vector Extensions support 以及 AES 和 PCLMUL 指令集。以下是 GCC i386/x86_64 选项页面的概述:
具有 64 位扩展的 Intel Core i7 CPU、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 系列)。
-march=core-avx-i 用于 GCC -march=ivybridge 用于 GCC >= 4.9.0。
这包括 Sandy Bridge (corei7-avx) 选项,同时还支持新的 Ivy 指令集:FSGSBASE、RDRND 和 F16C。从 GCC 选项页面:
具有 64 位扩展的 Intel Core CPU、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX、AES、PCLMUL、FSGSBASE、RDRND 和 F16C6 指令集支持。
Haswell-basedXeon(E3-1xxx v3-series、E5-1xxx v3-series、E5-2xxx v3-series)。
-march=core-avx2 用于 GCC 4.8.2/4.8.3 或 -march=haswell 用于 GCC >= 4.9.0。
来自 GCC 选项页面:
具有 64 位扩展的 Intel Haswell CPU、MOVBE、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、POPCNT、AVX、AVX2、AES、PCLMUL、FSGSBASE、RDRND、FMA、BMI、 BMI2 和 F16C 指令集支持。
Broadwell-basedXeon(E3-12xx v4 系列、E5-16xx v4 系列)
-march=core-avx2 用于 GCC 4.8.x 或 -march=broadwell 用于 GCC >= 4.9.0。
来自 GCC 选项页面:
具有 64 位扩展的 Intel Broadwell CPU、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-basedXeon(E3-12xx v5 系列)和KabyLake-basedXeon(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 选项页面:
具有 64 位扩展的英特尔 Skylake 服务器 CPU、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 指令集支持。
Coffee Lake-basedXeon(E-21xx):-march=skylake-avx512。
Cascade Lake-based Xeon(白金 8200/9200 系列、黄金 5200/6200 系列、白银 4100/4200 系列、青铜 3100/3200 系列):-march=cascade-lake(需要 gcc 9.x)。
来自 GCC 选项页面:
启用 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、CLWB、AVX512VL、AVX512BW、AVX512DQ、AVX512CD 和 AVX512VNNI。
AVX-512 Vector Neural Network Instructions (AVX512 VNNI) 是 x86 扩展,是 AVX-512 的一部分,旨在加速基于卷积神经网络的算法。
Cooper Lake-basedXeon(白金、金、银、铜):-march=cooperlake(需要gcc 10.1)。
该开关启用 AVX512BF16 ISA 扩展。
要了解编译器将使用-march=native 选项做什么,您可以使用:
gcc -march=native -Q --help=target
【讨论】:
至强是一个营销术语,因此它涵盖了一长串内部结构截然不同的处理器。
如果您指的是较新的 Nehalem 处理器(Core i7),那么this slide 表示自 4.3.1 起应使用 gcc -march=generic(尽管您自己对自己的应用程序的测试可能会发现其他设置优于此设置) .如果您希望优化 FP 数学的这方面,4.3 系列还添加了 -msse4.2。
这是some discussion 比较英特尔编译器中的调优与一些 gcc 标志。
【讨论】:
以下将显示您的处理器支持的所有标志:
cat /proc/cpuinfo | grep flags | head -1
确定您的处理器存在哪些优化的最佳方法不仅取决于模型,还取决于您正在编译的系统上的 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
【讨论】:
我使用 Intel CPU 和 x86_64 的经验是,每次我试图告诉 gcc 为特定的 CPU 类型进行优化时,性能都会比使用 -march=generic 更差,而不是更好。当然是 YMMV,但这些年来我一直在玩这样的东西很多次,而且一直都是这样。
OTOH,在 i386 上,至少以 i686 为目标可能是有意义的,或者,如果您想要 SSE 数学,至少是 Pentium 4。
【讨论】:
march=native 对你自己的机器是可以的,但对二进制版本不好。
-march=nocona 建议用于 atom 330 (p4/64bit) -march=core2 用于 core2
我假设您将使用 64 位。
【讨论】:
较新版本的 gcc 具有 -march=native,可让编译器自动确定最佳 -march 标志。
【讨论】: