Предотвращение автоматического использования GCC инструкций AVX и FMA при компиляции с -mavx и -mfma

Как я могу отключить автоматическую векторизацию с помощью инструкций AVX и FMA? Я бы все же предпочел, чтобы компилятор использовал SSE и SSE2 автоматически, но не FMA и AVX.

Мой код, который использует AVX, проверяет его доступность, но GCC не делает это при автоматической векторизации. Так что, если я скомпилирую с -mfma и запустить код на любом процессоре до Haswell, я получаю SIGILL, Как решить эту проблему?

5

Решение

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

Я уже описал это в нескольких разных вопросах и ответах

5

Другие решения

Вам нужно будет разделить код, который использует AVX, на отдельный модуль компиляции (другими словами, отдельный файл .cpp), и скомпилировать только тот, который -mfma или любые другие варианты, которые вы хотите. Обычно, gcc буду использовать -march=native, так что он скомпилируется для «вашего процессора», и если вы хотите универсальный код, вам нужно будет использовать -march=x86_64 или же -march=core2, или что-то типа того.

2

По вопросам рекламы [email protected]