Как я могу отключить автоматическую векторизацию с помощью инструкций AVX и FMA? Я бы все же предпочел, чтобы компилятор использовал SSE и SSE2 автоматически, но не FMA и AVX.
Мой код, который использует AVX, проверяет его доступность, но GCC не делает это при автоматической векторизации. Так что, если я скомпилирую с -mfma
и запустить код на любом процессоре до Haswell, я получаю SIGILL
, Как решить эту проблему?
То, что вы хотите сделать, это скомпилировать разные объектные файлы для каждого набора инструкций, на который вы нацелены. Затем создайте диспетчер ЦП, который запрашивает CPUID о доступном наборе инструкций и затем переходит к соответствующей версии функции.
Я уже описал это в нескольких разных вопросах и ответах
Вам нужно будет разделить код, который использует AVX, на отдельный модуль компиляции (другими словами, отдельный файл .cpp), и скомпилировать только тот, который -mfma
или любые другие варианты, которые вы хотите. Обычно, gcc
буду использовать -march=native
, так что он скомпилируется для «вашего процессора», и если вы хотите универсальный код, вам нужно будет использовать -march=x86_64
или же -march=core2
, или что-то типа того.