Как я могу ограничить уровень автовекторизации в GCC? - PullRequest
3 голосов
/ 08 июня 2019

Другими словами, возможно ли ограничить инструкции автовекторизации (полученные с помощью -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 …, я также получаю дрянную производительность, поэтому я полагаю, что дорогая часть, которая вызывает удушение, действительно является векторизацией, отсюда мой оригинальный вопрос.

1 Ответ

1 голос
/ 08 июня 2019

Вы можете использовать атрибут target, чтобы включить инструкции для каждой функции, что позволит вам вызывать встроенные функции, которые в противном случае были бы недопустимы.

Полагаю, вы хотите переключаться между реализациями определенных функций, основываясь на возможностях ЦП, определенных во время выполнения ... Если это так, вы также можете взглянуть на атрибут target_clones.

...