Другими словами, возможно ли ограничить инструкции автовекторизации (полученные с помощью -fast-math -ftree-vectorize
) чем-то вроде AVX
, все еще используя AVX512
через явный внутренний вызов?
В данный момент
- без
-mavx512f
, GCC не может сказать, что не может скомпилировать мою программу без поддержки avx-512f.Справедливо. - с
-mavx512f
, GCC начинает использовать его везде .
Я не нашел никаких вариантов, позволяющих GCC использоватьявные AVX512
встроенные функции, ограничивающие себя чем-то другим для автоматической векторизации.
Редактировать: Просто, чтобы дать немного больше контекста ... У меня есть skylake-avx512
узлов Xeon Gold (2 модуля FMA) и программа для конкретного домена.
Когда я компилирую с -Ofast -march=skylake-avx512 -mtune=skylake-avx512
и работаю на одно ядро , я получаю 30% больше производительности , чем -march=haswell …
.
Когда яувеличить количество ядер до всех 24 ядер , -march=haswell …
это в два раза быстрее , чем -march=skylake-avx512 …
!
Причина в печально известном дросселировании ядра…
Но в моем доменном программном обеспечении уже есть части с векторной ручкой.Я получаю выигрыш в производительности с -fno-tree-vectorize -march=skylake-avx512 …
(но этого недостаточно, чтобы побить -march=haswell …
со всеми 24 ядрами и autovec), поэтому автовекторизация важна.
Наконец, если я использую AVX2
-оптимизированную ручную векторизациюЯдра с -march=skylake-avx512 …
, я также получаю дрянную производительность, поэтому я полагаю, что дорогая часть, которая вызывает удушение, действительно является векторизацией, отсюда мой оригинальный вопрос.