Как правильно определить -march и -mtune для процессоров Intel? - PullRequest
1 голос
/ 03 июля 2019

В настоящее время я создаю программное обеспечение из источника, критически важного для меня.Поэтому я хочу оптимизировать его для работы на моих конкретных процессорах Intel.Процесс сборки требует, чтобы я установил флаг -march и -mtune.

Если на моем процессорном узле я использую

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

, я получаю "core-avx2" для марта и "универсальный"за мтуну.Однако с

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:

Переходя на домашнюю страницу Intel (R) Xeon (R) CPU E5-2670 v3 @ 2,30 ГГц (https://ark.intel.com/content/www/de/de/ark/products/81709/intel-xeon-processor-e5-2670-v3-30m-cache-2-30-ghz.html) Я узнал: Codename -> Продукты, ранее имевшие haswell

Если я использую

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

, я получаю "haswell" для обоих. Так что я не должен на самом деле использовать haswell как марш вместоcore-avx2? Каков наилучший из возможных вариантов?

Кстати, я использую GCC 4.8.5 для CentOS7.

Спасибо!

Редактировать:

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

-> core-avx2

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

-> generic

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

В используемой вами версии gcc Haswell назывался core-avx2. Другие микроархитектуры имели также дерьмовые имена. Например, Ivy Bridge, Sandy Bridge и Westmere назывались core-avx-i, corei7-avx и corei7 соответственно. Начиная с gcc 4.9.0, используются фактические имена микроархитектур, поэтому gcc будет печатать Haswell при использовании gcc -march=native -Q --help=target|grep march на процессоре Haswell вместо core-avx2 (см. patch ).

При передаче -mtune=native в gcc и хост-процессоре неизвестной версии gcc, которую вы используете, будет применяться настройка generic. Ваша модель процессора (63) известна только для gcc 5.1.0 и более поздних версий (см. Патч ).

Часть для печати имен в -Q --help=target должна выбрать какое-то имя для -march=native. Если процессоры слишком новы, чтобы ваш GCC мог их распознавать, он выберет что-то вроде Broadwell, если процессор поддерживает ADX, или микроархитектуру, которая поддерживает максимальное расширение SIMD (до AVX2), которое поддерживается на главном процессоре (как определено * 1014). *).

Но фактический эффект из -march=native состоит в том, чтобы включить все соответствующие опции -mavx -mpopcnt -mbmi2 -mcx16 и т. Д., Все они определяются отдельно с помощью cpuid. Поэтому для целей генерации кода -march=native всегда работает для включения расширений ISA, которые ваш GCC знает, как использовать, даже если он не распознает ваш ЦП.

Но для установки tune параметров -march=native или -mtune=native полностью завершается неудачей и возвращается к generic, когда он не распознает ваш процессор точно. К сожалению, он не делает такие вещи, как tune=intel для неизвестных процессоров Intel.


На вашем процессоре gcc знает, что он поддерживает AVX2, поэтому предполагает , что это процессор Haswell (называемый core-avx2 в вашей версии gcc), поскольку AVX2 поддерживается, начиная с Haswell, но не поддерживает точно не знаю, что это на самом деле процессор Haswell. Вот почему он применяет общую настройку вместо настройки для core-avx2 (т.е. Haswell). Но в этом случае, я думаю, это будет иметь тот же эффект, что и настройка для core-avx2, потому что для этой версии компилятора только Haswell поддерживает AVX2, и компилятор знает, что хост-процессор поддерживает AVX2. Однако в целом он может не настроиться на встроенную микроархитектуру, даже если -march правильно угадан на неизвестном процессоре.

(Примечание редактора: нет, tune=generic не адаптируется к тому, какие опции набора команд включены. Это все еще полностью универсальная настройка, включая заботу о процессорах, таких как AMD Phenom или Intel Sandybridge, которые не поддерживают AVX2. См. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568 и Почему gcc не разрешает _mm256_loadu_pd как один vmovupd? .

Это одна из причин , почему вы должны использовать -march=native или -march=haswell (с новым достаточно gcc), а не просто -mavx2 -mfma. Другая причина в том, что вы, вероятно, забудете -mbmi2 -mpopcnt -mcx16, а возможно, даже забудете -mfma)

1 голос
/ 03 июля 2019

Кстати, я использую GCC 4.8.5 на CentOS7.

Если производительность критична, вам следует использовать более свежую версию GCC. Серия 4.8 выпущена в 2013 году , и в ней отсутствуют многие улучшения производительности, которые присутствуют в текущих версиях. В текущих версиях значительно расширены параметры настройки для x86 , в том числе -march для многих семейств процессоров, которых не было в 2013 году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...