Я хочу скомпилировать код 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?