Символ препроцессора AVX512 и MSVC
По этой ссылке нет предопределенных символов препроцессора для AVX512 ( MSVC 2017)
Я пытаюсь собрать thundersvm, который использует собственную библиотеку на (как вы уже догадались) окнах. И Eigen, и thundersvm используют cmake и depinding для символов препроцессора компилятора, Eigen компилирует с инструкциями avx512 или нет.
Кажется, что с помощью /arch:AVX512
не вызывает никаких ошибок в MSVC, но не определяет __AVX512F__
символ, который нужен Эйген. Я также пытался включить -D__AVX512F__=ON
в аргументах cmake, но все равно не повезло.
Поскольку для AVX512 нет предопределенного символа препроцессора, есть ли способ заставить Eigen скомпилироваться с avx512?
Обновить
Согласно комментарию chtz, я проверил ветку Eigen по умолчанию и перекомпилировал thundersvm с arch:AVX512 с этими аргументами cmake (возможно, не все нужны):
-DUSE_CUDA=OFF -DUSE_EIGEN=ON -DBUILD_SHARED_LIBS=OFF -DEIGEN_ENABLE_AVX512=ON -D__AVX512F__=ON -DEIGEN_VECTORIZE_AVX512=ON -DEIGEN_VECTORIZE_AVX2=ON -DEIGEN_VECTORIZE_AVX=ON -DEIGEN_VECTORIZE_FMA=ON
Сравнение набора команд от Intel SDE -mix
инструмент до и после патча, я ясно вижу, что используются инструкции AVX (SDE жалуется, что не распознает инструкцию vbroadcastss zmm0, xmm0
когда работает для SKL CPU, но отлично работает для SKX). Проблема в том, что MSVC использует скалярную версию AVX, и улучшения во время выполнения не происходит (также общее количество команд одинаково), что похоже на этот пост
Есть ли другие флаги, которые мне нужно определить, чтобы MSVC генерировал нескалярные инструкции? (Думаю, я тоже попробую gcc)
0 ответов
MSVC плохо поддерживает AVX-512 и не имеет различий между разными подмножествами. Не существует безопасного способа создания кода AVX512F на MSVC без выполнения инструкций AVX512DQ.
Лучшие компиляторы для AVX-512 - это gcc и clang. Для Visual Studio есть плагин Clang, который вы можете использовать, если вам нравится IDE. Компиляторы gcc и clang имеют символы препроцессора, например
__AVX512F__
,
__AVX512VL__
, и т.д.