GCC позволяет использовать только те встроенные функции, которые поддерживает целевой ЦП.GCC никогда не будет выдавать clflushopt
сам по себе, но это правило имеет больше смысла для расширений, таких как AVX2, где gcc знает, как автоматически векторизовать AVX2, если вы позволите.И вы должны разрешить использование инструкций AVX2 до того, как GCC позволит себе их испускать, даже если ваш источник использует встроенные функции.
Используйте gcc -O3 -march=native
, чтобы разрешить использование всех расширений, имеющихся на ЦП, который вы используете.Компиляция продолжается. (-march
по-прежнему работает без включения оптимизации, но я добавлю его для будущих читателей, которые собираются скопировать / вставить выделенную жирным шрифтом часть.)
Или -march=skylake
или -march=znver1
(Zen), например, для компиляции для конкретного целевого процессора независимо от того, на каком хосте вы компилируете.См. https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
Специальная опция для просто CLFLUSHOPT - -mclflushopt
, но использование -march=skylake
также устанавливает -mtune=skylake
, что вам также нужно.И включает AVX2 и более ранние версии, FMA (да, это отдельно от AVX2) и BMI1 / BMI2, popcnt, RDRAND, RDSEED и множество других вкусностей.(Скомпилируйте с -march=skylake -fverbose-asm -S
и посмотрите комментарии asm в верхней части файла, чтобы увидеть все опции -m
, включенные / не включенные.)