Корпорация Intel никогда не удаляла наборы инструкций в будущих версиях того же процессора. то есть двоичный файл, который работает на старом процессоре Intel, всегда работает на более новом процессоре Intel.
(Единственное исключение - это Xeon Phi первого поколения: Knight's Corner использовал несовместимый вариант AVX512 под названием KNI, но в более поздних ускорительных картах / компьютерах Xeon Phi используется AVX512.)
Если вы должны использовать один и тот же двоичный файл на всех процессорах, используйте gcc -march=sandybridge -mtune=haswell
и убедитесь, что ваши важные массивы выровнены по 32 байта.
Возможно, стоит сравнить с gcc -march=sandybridge
(то есть с tune = sandybridge), чтобы увидеть, какой из них лучше работает для вашего кода. -mprefer-avx128
или -mprefer-vector-width=256
может быть интересно попробовать: некоторые циклы запутываются, когда gcc автоматически векторизуется с 256-битными векторами.
SnB / IvB имеют неэффективные неверно выровненные загрузки / хранилища AVX, поэтому tune = sandybridge устанавливает -mavx256-split-unaligned-load
, что очень много, если ваши данные выровнены во время выполнения, но компилятор этого не знал. Дополнительные инструкции и тасования не помогают в Haswell, поэтому -mtune=haswell
включает -mno-avx256-split-unaligned-load
.
К сожалению, у gcc нет опции "tune = avx2" для настройки всех процессоров, у которых есть AVX2, или опции для настройки среднего процессора, которая поддерживает наборы инструкций, которые вы включили. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568. Ваши единственные варианты: настройка для конкретного ЦП, или настройка на базовую базовую линию, или использование определенных параметров настройки.
Gcc имеет некоторую поддержку для диспетчеризации во время выполнения с ifunc
Вы должны активировать его в источнике для определенных функций. См. https://lwn.net/Articles/691932/ для получения дополнительной информации о функции многократного управления версиями.
Лучший вариант: создать отдельные двоичные файлы для SnB / Haswell и отправить с помощью скрипта или $PATH
с настройкой
На каждом узле кластера создайте /etc/host-type
или что-то еще, которое имеет sandybridge
или haswell
или что-то еще. Любая файловая система для каждого узла в порядке, или повторно обнаружите ее во время выполнения с gcc
или чем-то более дешевым. В вашем рабочем скрипте:
#!/bin/sh
bin_dir="./bin-$(</etc/node-type)"
exec "$bin_dir/my_prog" "$@"
При необходимости создайте символические ссылки, чтобы bin-skylake
и bin-broadwell
использовали двоичные файлы Haswell.
Haswell представила AVX2 и FMA, а также BMI1 / 2. Если вам не хватает числа, вы действительно хотите FMA . BDW / SKL не представил каких-либо существенных расширений ISA, которые компиляторы могут использовать для ускорения работы вашего кода. Настройка для BDW / SKL также не отличается.
Если у вас есть какие-либо процессоры Skylake-avx512, это не так.