AVX512 не является единственным расширением и не имеет достаточно специфического значения в этом контексте, чтобы быть полезным.Компиляторы работают только с специфическими функциями ЦП, такими как AVX512F, AVX512DQ, AVX512CD и т. Д.
Все ЦП, поддерживающие любые расширения AVX512, должны поддерживать AVX512F, "Foundation". AVX512F является базовым расширением AVX512, на котором основаны другие расширения AVX512.
В коде, который хочет использовать встроенные функции AVX512, вы должны посмотреть на https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512и выберите набор расширений, которые доступны вместе на одном интересующем вас процессоре, например, F + CD и VL, DQ, BW на имеющемся в настоящее время Skylake-X.
Затем, например, используйте #if defined(__AVX512BW__) && defined(__AVX512VL__)
перед кодомкоторый использует vpermt2w
на 256-битных векторах или что-то в этом роде.__AVX512(anything)__
подразумевает __AVX512F__
;это то расширение, которое вам не нужно проверять отдельно.
Но если вы только использовали инструкции AVX512F, они просто проверяют этот макрос.
Вы никогда не должны использовать -mavx512f
напрямую : используйте -march=skylake-avx512
, -march=knl
или -march=native
.Или в будущем, -march=icelake
или что-то еще.
- Компилятор знает, какие процессоры поддерживают какие наборы расширений (или может определить, какие расширения поддерживает компилируемая машина).Их много, и не учитываются такие важные, как AVX512VL (поддержка инструкций AVX512 для 128-битных и 256-битных векторов) или AVX512ER Xeon Phi (быстрые
1/x
и 1/sqrt(x)
с удвоенной точностью по сравнению с обычными AVX51214-разрядные версии) может значительно снизить производительность.Особенно AVX512ER очень важен, если вы делаете какое-либо деление или log / exp на Xeon Phi, потому что деление с полной точностью очень медленное на KNL по сравнению со Skylake. -march=x
подразумевает -mtune=x
, включая настройка опций, релевантных и для цели.KNL в основном Silvermont с креплением AVX512 и имеет существенные отличия от -mtune=skylake-avx512
.
По тем же причинам, как правило, вы не должны использовать -mfma -mavx2
напрямую , за исключением того, чтов настоящее время нет процессоров AMD с AVX512, поэтому есть только две основные цели настройки (Xeon Phi и основной Skylake / CannonLake / Icelake), и они также поддерживают различные наборы расширений AVX512.К сожалению, нет настройки -mtune=generic-avx2
, но Ryzen поддерживает почти все расширения, которые делает Haswell (и те, которые он не использует GCC / clang, не будет использовать автоматически, как транзакционная память), поэтому -march=haswell
может быть разумно сделатькод, настроенный для процессоров с FMA, AVX2, popcnt и т. д., без особых страданий для Райзена.
Также актуально (для GCC, возможно, не гремит в настоящее время. https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html):
-mprefer-vector-width=256
по умолчанию автоматически векторизовать с 256-битными векторами, если большая часть времени проводится в не векторизованных циклах. Использование 512-битных векторов значительно снижает максимальную частоту турбо тактовой частоты в IntelПроцессоры Xeon (возможно, не так много на настольных версиях i9 Skylake-X), так что использование 512-битных векторов в небольших разбросанных битах вашей программы может привести к замедлению работы сети. Таким образом, 256 является значением по умолчанию для tune=skylake-avx512
в GCC,но KNL использует 512.
-mprefer-avx-128
старую версию опции -mprefer-vector-width=
до появления AVX512.
Использование регистров маски AVX51232 векторРегистры и / или их новые инструкции могут быть значительным выигрышем даже при одинаковой ширине вектора, поэтому имеет смысл включить AVX512, даже если вы не хотите использовать 512-битную векторную ширину.(Хотя иногда код, использующий встроенные функции или автоматическую векторизацию, компилируется хуже, а не лучше, если версии сравнения AVX512 сравниваются в регистр вообще доступны. Но, надеюсь, такие ошибки анти-оптимизации будут отсортированы как AVX512становится все более широко используемым.)