2012-05-11 29 views
63

GCC man sayfasını bunun için fırçalamayı denedim, ama yine de anlamıyorum.GCC: marş, mtune'den nasıl farklıdır?

-march ve -mtune arasındaki farklar nelerdir?

Ne zaman sadece -march kullanıyorsunuz, her ikisi de? Sadece -mtune mümkün mü?

cevap

80

-march kullanırsanız, GCC, belirtilen CPU üzerinde çalışan ancak mimari ailede (genellikle) önceki CPU'larda çalışmayan yönergeleri oluşturmakta serbest olacaktır. Eğer -mtune kullanırsanız, derleyici herhangi birinde çalışan bir kod üretecektir, ancak belirttiğiniz belirli CPU üzerinde en hızlı çalışan komut dizilerini tercih edecektir.

+8

Her ikisini birden kullanmanın mantıklı olup olmadığını veya aynı değere ayarlandığında mtune'un gereksiz olup olmadığını yanıtlamıyor. –

+7

@ PavelŠimerda Sezgisel cevap, 2 özelliğin tanımında gizlidir. Ayrıca, belgeleme açıkça 'mart' 'mtune' ima eder. Dolayısıyla, itirazlarınızın cevapları sırasıyla hayır ve evet. –

+0

Bunu çok zarif bir şekilde açıkladığınız için teşekkür ederiz! Anlamanızı kolaylaştırıyorsunuz. –

35

Bu şimdiye kadar google'dan budur:

-march=X seçenek CPU adı X alır ve GCC X tüm özelliklerini kullanan bir kod oluşturmasına olanak sağlar. GCC kılavuzu, hangi CPU isimlerinin hangi CPU ailesi ve özellikleri anlamına geldiğini tam olarak açıklar. özellikler genellikle kaldırıldı eklenmişse ancak Çünkü

, CPU X çalışacağını -march=X ile oluşturulmuş bir ikili, X daha yeni CPU çalıştırmak için iyi bir şansı var, ama neredeyse kesinlikle X daha eski bir şey üzerinde çalışmaz. Bazı komut setleri (3DNow !, sanırım?) Belirli bir CPU satıcısına özel olabilir, bunlardan faydalanmak, muhtemelen daha yeni veya başka bir şekilde rakip CPU'larda çalışmayan ikili dosyaları size ulaştırır.

-mtune=Y seçeneği, Y üzerinde çalışmakta olan diğer CPU'lardan daha hızlı çalışacak şekilde oluşturulan kodu ayarlar. -march=X, -mtune=X anlamına gelir. -mtune=Y, -march=X'u geçersiz kılmayacaktır, bu nedenle, -march=core2 ve -mtune=i686 için bir anlam ifade etmeyecektir - 'dan beri kodunuz core2'dan daha eski bir şeyle çalışmaz, bu nedenle neden daha eski bir şey için optimize etmek istiyorsunuz? core2'den daha az özellik? -march=core2 -mtune=haswell daha mantıklı: core2 öğesinin sağladığı özelliklerin (-march=i686'un size verdiği değerden çok daha fazlası) herhangi bir özelliği kullanmayın, ancak core2 için değil, çok daha yeni haswell CPU'lar için kodu optimize edin. Ayrıca, -mtune=generic da bulunmaktadır. generic, GCC'nin mevcut CPU'larda en iyi çalışan kodu üretmesini sağlar (generic'un GCC'nin bir sürümden diğerine değiştirilmesi anlamına gelir). Gentoo forumlarında -march=X -mtune=generic'un X üzerinde daha hızlı çalışan kod ürettiği söylentileri vardır. -march=X -mtune=X tarafından üretilen kodlar (veya sadece -march=X, -mtune=X belirtilmiştir). Bunun doğru olup olmadığı hakkında bir fikir yok. Eğer tam olarak neye ihtiyacınız bilmedikçe

Genellikle, (muhtemelen en eski CPU için optimize etmek istemediğimiz için, -mtune=generic örtülü -mtune=<oldest CPU you want to run on> karşı burada) en iyi ders -march=<oldest CPU you want to run on> ve -mtune=generic belirtmektir görünüyor . Veya sadece -march=native, sadece inşa ettiğiniz aynı makinede çalışacaksanız.