По этой ссылке нет предопределенных символов препроцессора для AVX512 ( MSVC 2017 )
Я пытаюсь собрать thundersvm, который использует собственную библиотеку в (как вы уже догадались) окнах.И Eigen, и thundersvm используют cmake и depinding для символов препроцессора компилятора, Eigen компилирует с инструкциями avx512 или нет.
Кажется, что использование /arch:AVX512
не вызывает никаких ошибок в MSVC, но не определяет __AVX512F__
символ, который нужен Eigen.Я также попытался включить -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, и улучшения во время выполнения не происходит (также общее количество инструкций одинаково), что аналогично этому post
Есть лидругие флаги, которые мне нужно определить, чтобы MSVC генерировал нескалярные инструкции?(Думаю, я тоже попробую gcc)