Можно ли скомпилировать код на одной микросхеме ЦП для другой (разное поколение одной арки)?

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

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

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

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

-xAVX -axCORE-AVX2

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

Если компилятор находит такую ​​возможность, он сначала проверяет, приведет ли создание версии функции для конкретной функции к увеличению производительности. В этом случае компилятор создает как версию функции для конкретной функции, так и базовую версию функции. Во время выполнения выбирается одна из версий для выполнения в зависимости от используемого процессора Intel (R). Таким образом, программа может извлечь выгоду из увеличения производительности на более продвинутых процессорах 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?


person Yurij Goncharuk    schedule 22.06.2019    source источник
comment
configure: error: не удается запустить тестовую программу во время кросс-компиляции - а чего вы ожидаете? Вы не должны выполнять кросс-скомпилированные тестовые программы конфигурации на хосте. Вы либо выполняете их на цели (или эмуляторе), либо не выполняете их вообще. _1 _ / _ 2_ - тот вариант, который вам нужен (достаточно одного); не беспокойтесь о -mtune, по крайней мере, пока он не заработает.   -  person Vladislav Ivanishin    schedule 23.06.2019
comment
@phuclv Спасибо за информацию. Я внимательно прочитаю.   -  person Yurij Goncharuk    schedule 24.06.2019
comment
@VladislavIvanishin Я знаю, что не могу запускать двоичные файлы для другого микроархива. Итак, я ожидаю получить двоичный файл, который скомпилирован на процессоре Core Quad и содержит инструкции AVX. Я не буду запускать скомпилированный двоичный файл на процессоре Core Quad.   -  person Yurij Goncharuk    schedule 24.06.2019
comment
Но этот скрипт настройки явно пытается запустить эти двоичные файлы, не так ли? Во всяком случае, об этом говорится в сообщении об ошибке. Другой вопрос, почему скрипт делает это (похоже, он знает, что вы выполняете кросс-компиляцию). Я бы рекомендовал откопать тест из config.log и попытаться понять, что там произошло.   -  person Vladislav Ivanishin    schedule 24.06.2019


Ответы (1)


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

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

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

person Yurij Goncharuk    schedule 25.06.2019