Xcode Apple Clang включить avx512 - PullRequest
1 голос
/ 27 марта 2019

В Xcode (Версия 10.1 (10B61)) я использовал макрос, как показано ниже, для определения поддержки AVX512.

#ifdef __SSE4_1__
#error "sse4_1"
#endif

#ifdef __AVX__
#error "avx"
#endif

#ifdef __AVX2__
#error "avx2"
#endif

#ifdef __AVX512__
#error "avx512"
#endif

В настройках сборки по умолчанию SSE4_1 активен, а avx, avx2 и нет. Когда я добавляю -mavx в Параметры сборки -> Флаги компилятора Apple Clang-Custom -> Другие флаги C, которые включают AVX , дальнейшее добавление -mavx2 включить AVX и AVX2 , но аргумент Unknow: '-mavx512'. Как включить avx512 и обнаружить его? Похоже, что есть несколько макросов для обнаружения avx512.

#define __AVX512BW__ 1  
#define __AVX512CD__ 1  
#define __AVX512DQ__ 1  
#define __AVX512F__ 1  
#define __AVX512VL__ 1   

Чем они отличаются?

1 Ответ

4 голосов
/ 27 марта 2019

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становится все более широко используемым.)

...