Bunun için GCC man sayfasını temizlemeye çalıştım ama yine de anlamadım, gerçekten.
Arasındaki fark nedir -march
ve -mtune
?
Her -march
ikisi yerine ne zaman biri sadece kullanılır ? Sadece yapmak mümkün -mtune
mü?
Yanıtlar:
Eğer kullanırsanız -march
o zaman GCC belirtilen CPU üzerinde çalışmaya o talimatları oluşturmak için ücretsiz olacak, ama (genellikle) değil mimari ailede daha önce CPU'lar üzerinde.
Yalnızca kullanırsanız -mtune
, derleyici bunlardan herhangi birinde çalışan bir kod üretecek, ancak belirttiğiniz belirli CPU'da en hızlı çalışan komut dizilerini tercih edecektir. örneğin, döngü çözme buluşsal yöntemlerini söz konusu CPU için uygun şekilde ayarlama.
-march=foo
-mtune=foo
farklı bir belirtmediğiniz sürece ima eder -mtune
. Bu, kullanmanın ayarlamayla ilgili hiçbir şey yapmadan -march
seçenekleri etkinleştirmekten daha iyi olmasının bir nedenidir -mavx
.
Uyarı: -march=native
GCC'nin özel olarak tanımadığı bir CPU'da, GCC'nin algılayabileceği ancak bırakacağı yeni komut kümelerini etkinleştirmeye devam edecektir -mtune=generic
. İyi kod yapmasını istiyorsanız, CPU'nuzu bilen yeterince yeni bir GCC kullanın.
march
ima mtune
. Yani, itirazlarınızın cevabı sırasıyla hayır ve evet.
mtune
ve march
kombinasyonlarla sonuçlanabileceğini anlamalıdır . Bu blog yazısı, bu noktayı diğerleriyle aydınlatıyor: lemire.me/blog/2018/07/25/…
Google'da araştırdığım şey bu:
Bu -march=X
seçenek bir CPU adı alır X
ve GCC'nin .NET Framework'ün tüm özelliklerini kullanan bir kod oluşturmasına izin verir X
. GCC kılavuzu tam olarak hangi CPU adlarının hangi CPU aileleri ve özellikleri anlamına geldiğini açıklar.
Özellikler genellikle eklendiği, ancak kaldırılmadığı için, ile oluşturulan bir ikili -march=X
program CPU X
üzerinde çalışacaktır, daha yeni CPU'larda çalışma şansı yüksektir X
, ancak bundan daha eski hiçbir şeyde çalışmayacağından emin olabilirsiniz X
. Belirli komut setleri (3DNow !, sanırım?) Belirli bir CPU satıcısına özel olabilir, bunları kullanmak muhtemelen size daha yeni veya başka türlü rakip CPU'larda çalışmayan ikili dosyalar sağlayacaktır.
-mtune=Y
Seçenek daha hızlı çalıştırmak için oluşturulan kodu ayarlamaktadır Y
o çalışabilen diğer CPU'lar yapılması öngörülüyor. -march=X
ima eder -mtune=X
. -mtune=Y
geçersiz kılmayacaktır -march=X
, bu nedenle, örneğin, muhtemelen mantıklı değildir -march=core2
ve -mtune=i686
- kodunuz core2
zaten daha eski hiçbir şey üzerinde çalışmayacaktır , çünkü -march=core2
neden Dünya'da core2'den daha eski (daha az özellikli) bir şey için optimize etmek isteyesiniz? -march=core2 -mtune=haswell
daha mantıklı: Sağladığının ötesinde herhangi bir özellik kullanmayın core2
(ki bu hala -march=i686
size verdiğinden çok daha fazlasıdır !), ancak kodu daha yeni haswell
CPU'lar için optimize edin , bunun için değil core2
.
Ayrıca var -mtune=generic
. generic
GCC'nin mevcut CPU'larda en iyi şekilde çalışan kodu üretmesini sağlar (GCC'nin generic
bir sürümünden diğerine yapılan değişikliklerin anlamı ). Gentoo forumlarında söylentiler var -march=X -mtune=generic
daha hızlı üzerinde çalışır bu kodu üretir X
tarafından üretilen kod daha -march=X -mtune=X
(ya da sadece yok -march=X
gibi -mtune=X
ima). Bunun doğru olup olmadığı hakkında hiçbir fikrim yok.
Genel olarak, neye ihtiyacınız olduğunu tam olarak bilmiyorsanız, en iyi yol belirtmek -march=<oldest CPU you want to run on>
ve -mtune=generic
( -mtune=generic
örtük olana karşı koymak için buradadır -mtune=<oldest CPU you want to run on>
, çünkü muhtemelen en eski CPU için optimize etmek istemezsiniz) gibi görünüyor. Ya da sadece -march=native
, sadece üzerine kurduğunuz aynı makinede çalışacaksanız.
-march=native
, belirtmek isteyebilirsiniz -mtune=X
, çünkü varsayılan hala -mtune=generic
burada tartışıldığı gibi: lemire.me/blog/2018/07/25/…
-march=native
CPU'nuz tune=native
hakkında bilgi sahibi olan bir GCC kullanıyorsanız gayet iyi anlamına gelir . Bu makale sadece kötü durumu sunuyor. Daha yeni GCC sürümleri, özellikle AVX2 ve AVX-512 gibi yeni talimatlar kullanıldığında genel olarak daha iyi kod üretir. Ve CPU'nuz için tasarlanmış ayar ayarlarına (döngü açma sezgisel tarama gibi) sahip olmak kesin bir artıdır. Dolayısıyla, bu seçenekleri kullanmak için performansı yeterince önemsiyorsanız, yeni bir GCC kullanın, en azından CPU'nuzu bilen bir tane, tercihen mevcut kararlı relese.
tune=generic
aynı mikro mimari ailesinin daha yeni bir üyesinden daha iyisini yapamayacağı , özellikle de Skylake mikromimarisi ile tam anlamıyla aynı olan Kaby Lake gibi bir şeyden daha iyisini yapamaz . Ama bence hala farklı bir ailesi / adım atışı var, bu yüzden sadece Skylake ve daha eski hakkında bilgi sahibi olan bir GCC, ayar için onu tanıyamayabilir.