Я хочу скомпилировать код 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?
-mtune
, по крайней мере, пока он не заработает. - person Vladislav Ivanishin   schedule 23.06.2019config.log
и попытаться понять, что там произошло. - person Vladislav Ivanishin   schedule 24.06.2019