Как скомпилировать программу с функцией _mm_clflushopt?ошибка: не удалось встраивание - PullRequest
0 голосов
/ 28 января 2019

Я много гуглил, но мне не удалось преуспеть в компиляции программы на C с использованием функции _mm_clflushopt._mm_clflush работает нормально, но я хочу попробовать оптимизированную версию.Я проверил в флагах процессора и clflushopt включен.Я использую emmintrin.h и immintrin.h обе библиотеки, но при компиляции я все еще получаю ошибку «неопределенная ссылка на _mm_clflushopt».Я использую gcc -o prog prog.c в терминале Linux.Использование библиотеки x86intrin.h дает мне эту ошибку во время компиляции:

error: inlining failed in call to always_inline '_mm_clflushopt'

enter image description here

Буду признателен за любую помощь, я очень новичок в этой инструкциихотя после попытки найти больше информации, я не смог найти код на C с оптимизированной версией.Вот почему я решил задать вопрос.

1 Ответ

0 голосов
/ 28 января 2019

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, включенные / не включенные.)

...