Что значит быть зависимым от архитектуры машины?

Я новичок в С++. Недавно в моей компании началась дискуссия о компиляции кода для разных машинных архитектур, таких как X86_64 AMD Vs Intel.

Теперь я посмотрел на флаги gcc, которые мы передаем для компиляции наших приложений, и нет ничего, что указывало бы gcc на компиляцию специально для AMD или Intel на x86_64.

Может кто-нибудь объяснить техническими терминами зависимость между скомпилированным кодом и архитектурой машины?

Могу ли я скомпилировать код с помощью gcc-86_64 на AMD и запустить двоичный код на Intel x86_64?


person Jimm    schedule 19.06.2012    source источник
comment
Нет, ты не можешь. по крайней мере из того, что я знаю....   -  person Naftali aka Neal    schedule 20.06.2012
comment
JVM была известна тем, что могла запускать Java в любом месте на любой машине, верно?   -  person Kristian    schedule 20.06.2012
comment
AMD x86-64 по большей части полностью совместим с Intel EM64T.   -  person Mysticial    schedule 20.06.2012


Ответы (4)


После 32-разрядных процессоров x86 Intel захотела перейти на 64-разрядные и в сотрудничестве с HP разработала 64-разрядный процессор Itanium. К сожалению, это не было очень популярным, так как набор инструкций и архитектура сильно отличались от x86.

AMD вмешалась и расширила известную архитектуру x86 до 64-разрядной, сначала назвав ее EM64T, а затем AMD64. Точно так же, как AMD должна была следовать за Intel с 32-разрядными процессорами, Intel теперь должна была следовать за AMD с 64-разрядными процессорами, поскольку 64-разрядная архитектура AMD оказалась гораздо более популярной, чем 64-разрядный процессор Itanium.

Конечно, Intel не нравится, когда его называют AMD64, поэтому они называют его x64, но по сути AMD64 и Intel x64 совместимы (за исключением некоторых незначительных различий, см. http://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64). Если вы компилируете для x64 или AMD64, в сгенерированном коде не будет этих различий, поэтому на практике вы можете работать на обоих.

В любом случае старайтесь не генерировать для Itanium (также называемого IA-64), потому что это совершенно другой тип процессора.

person Patrick    schedule 19.06.2012

Вы можете скомпилировать для определенных архитектур/процессоров, используя флаг gcc -march. Однако будьте осторожны, вам никогда не следует пытаться запускать двоичный файл, скомпилированный для другого процессора/архитектуры, на вашем компьютере. Это может сработать, но в большинстве случаев произойдет случайный сбой из-за того, как был оптимизирован двоичный файл.

Вы можете использовать менее агрессивный флаг -mtune, который оптимизирует его для определенного целевого ЦП, но при этом сохранит возможность запуска на любом ЦП.

См. эти ссылки: Каков оптимальный марш и Параметры mtune для gcc для процессоров Pentium4 и выше http://en.gentoo-wiki.com/wiki/Safe_Cflags

person Shawn Buckley    schedule 19.06.2012

Вы можете оптимизировать для x86-64 и AMD64 по-разному, но нет никаких (AFAIK) инструкций, которые отсутствуют в одной из них, хотя 64-битная архитектура Intel Itanium отличается.

person Martin Beckett    schedule 19.06.2012

В частности, такие инструкции, как SSE4A, не будут работать на процессорах Intel. Это одно из тех мест, где что-то может пойти не так.

person Karthik Kumar Viswanathan    schedule 19.06.2012