Можно ли скомпилировать код на одном микроархиве процессора для другого (разные поколения одной арки)? - PullRequest
0 голосов
/ 23 июня 2019

Я хочу скомпилировать код C, используя компилятор GCC для CPU, который поддерживает инструкции AVX.Но моя сборочная машина использует процессор Core Quad, который не поддерживает AVX.

Я прочитал много тем о кросс-компиляции и не нашел ответа.Ниже приведены некоторые конкретные детали.

Компилятор C от Intel может собрать несколько специфичных для микроархива версий функций в одном двоичном файле.Во время выполнения выбирается один конкретный.

Компиляция кодов на разных системах :

-xAVX -axCORE-AVX2

где -xдает базовую линию для компиляции, а -ax - это список путей к функциям для построения.Как объясняется в документации компилятора Intel:

Если компилятор находит такую ​​возможность, он сначала проверяет, может ли генерация версии функции для конкретной функции привести к увеличению производительности.В этом случае компилятор генерирует как специфичную для функции версию функции, так и базовую версию функции.Во время выполнения выбирается одна из версий для выполнения, в зависимости от используемого процессора Intel (R).Таким образом, программа может выиграть от повышения производительности на более продвинутых процессорах Intel, но при этом работать должным образом на старых процессорах и процессорах других производителей.Процессор не от Intel всегда выполняет базовый путь кода.

Означает ли это, что компилятор C от Intel помещает специфичные для микроархива инструкции в одну версию функции и не помещает эти инструкции в другую версию функции??

Компилятор GCC не поддерживает поддержку нескольких микроархивов таким образом (отрывок из верхней ссылки):

Компиляторы GCC не поддерживают несколько путей кода и поэтому «универсально» оптимизированыдвоичный файл не возможенЗдесь -march дает базовую линию и -mtune процессор для настройки при соблюдении набора команд базовой линии

-march = corei7-avx -mtune = core-avx2

Это означает «использованиефункции, доступные процессорам SandyBridge, настраивают код так, чтобы он оптимально работал на процессоре Haswell ".Такая оптимизация не сможет использовать инструкции FMA, поскольку они отсутствуют в базовой линии.

Это означает, что компилятор GCC не помещает новые инструкции для целевого микроархива оптимизации.Не так ли?


Итак, вернемся к задаче.Для компилятора Intel я могу установить базовый микроархит как Core Quad (-x) и установить оптимизацию для недавнего микроархива (-ax).Это должно быть работа.Я не проверял это самолет.

Но как мне разобраться с компилятором GCC?Не добавляются новые инструкции для целевой оптимизации микроархива (-mtune).Если я установлю базовый микроархит (-march), то configure выдаст следующее сообщение:

configure: error: cannot run test program while cross compiling

Возможно ли решить эту задачу с помощью компилятора GCC?

1 Ответ

0 голосов
/ 25 июня 2019

Вопрос не был ясен. Вопрос в основном относился к configure скрипту. Когда я передаю --host=x86_64-pc-linux-gnu скрипту configure, он включает режим кросс-компиляции и не запускает никаких AC_TRY_RUN инструкций.

После успешной компиляции я разобрал выходные двоичные файлы и нашел инструкции и регистры AVX.

Поэтому я буду считать, что многоверсионные функции были введены в GCC 4.8. Это устройства через директиву препроцессора __attribute__. Спасибо @phuclv за информацию о GCC!

...