Какво означава да си зависим от архитектурата на машината?

Нов съм в C++. Наскоро в моята компания започна дискусия около компилирането на код за различни машинни архитектури като X86_64 AMD срещу 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
x86-64 на AMD е в по-голямата си част напълно съвместим с EM64T на Intel.   -  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 и x64 на Intel са съвместими (с изключение на някои малки разлики, вижте 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. Бъдете предупредени обаче, че наистина никога не трябва да се опитвате да стартирате двоичен файл, компилиран за различен CPU/архитектура на вашата машина. Може да работи, но повечето пъти ще се провали на случаен принцип поради това как е оптимизиран двоичният файл.

Можете да използвате по-малко агресивния флаг -mtune, който ще го оптимизира за конкретен целеви CPU, но той все още ще запази способността да се изпълнява на всеки CPU.

Вижте тези връзки: Какъв е оптималният марш & 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