GCC: March'ın Mtune'dan farkı nedir?


88

Bunun için GCC man sayfasını temizlemeye çalıştım ama yine de anlamadım, gerçekten.

Arasındaki fark nedir -marchve -mtune?

Her -marchikisi yerine ne zaman biri sadece kullanılır ? Sadece yapmak mümkün -mtunemü?

Yanıtlar:


97

Eğer kullanırsanız -marcho 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=foofarklı bir belirtmediğiniz sürece ima eder -mtune. Bu, kullanmanın ayarlamayla ilgili hiçbir şey yapmadan -marchseçenekleri etkinleştirmekten daha iyi olmasının bir nedenidir -mavx.

Uyarı: -march=nativeGCC'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.


10
Her ikisinin de kullanılmasının mantıklı olup olmadığını veya aynı değere ayarlandığında mtune'un gereksiz olup olmadığını yanıtlamaz.
Pavel Šimerda

12
@ PavelŠimerda Sezgisel olarak cevap 2 özelliğin tanımında saklıdır. Ayrıca, dokümantasyon açıkça belirtiyor marchima mtune. Yani, itirazlarınızın cevabı sırasıyla hayır ve evet.
underscore_d

Bunu çok zarif bir şekilde açıkladığınız için teşekkür ederiz! Anlaşılmasını kolaylaştırıyorsun.
Rahim Hoca

5
İnsanların bir tl; dr'ye ihtiyacı var: YALNIZCA işlemcinizde çalıştırıyorsanız -march kullanın, diğer işlemciler için güvenli olmasını istiyorsanız -mtune kullanın.
j riv

3
Kullanıcılar ayrıca eski derleyicilerin (bazı CPU mevcut olmadan önce piyasaya sürülen) farklı optimum mtuneve marchkombinasyonlarla sonuçlanabileceğini anlamalıdır . Bu blog yazısı, bu noktayı diğerleriyle aydınlatıyor: lemire.me/blog/2018/07/25/…
qneill

53

Google'da araştırdığım şey bu:

Bu -march=Xseçenek bir CPU adı alır Xve 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=Xprogram 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=YSeçenek daha hızlı çalıştırmak için oluşturulan kodu ayarlamaktadır Yo çalışabilen diğer CPU'lar yapılması öngörülüyor. -march=Xima eder -mtune=X. -mtune=Ygeçersiz kılmayacaktır -march=X, bu nedenle, örneğin, muhtemelen mantıklı değildir -march=core2ve -mtune=i686- kodunuz core2zaten daha eski hiçbir şey üzerinde çalışmayacaktır , çünkü -march=core2neden Dünya'da core2'den daha eski (daha az özellikli) bir şey için optimize etmek isteyesiniz? -march=core2 -mtune=haswelldaha mantıklı: Sağladığının ötesinde herhangi bir özellik kullanmayın core2(ki bu hala -march=i686size verdiğinden çok daha fazlasıdır !), ancak kodu daha yeni haswellCPU'lar için optimize edin , bunun için değil core2.

Ayrıca var -mtune=generic. genericGCC'nin mevcut CPU'larda en iyi şekilde çalışan kodu üretmesini sağlar (GCC'nin genericbir sürümünden diğerine yapılan değişikliklerin anlamı ). Gentoo forumlarında söylentiler var -march=X -mtune=genericdaha hızlı üzerinde çalışır bu kodu üretir Xtarafından üretilen kod daha -march=X -mtune=X(ya da sadece yok -march=Xgibi -mtune=Xima). 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.


4
Ancak kullanıyorsanız -march=native, belirtmek isteyebilirsiniz -mtune=X, çünkü varsayılan hala -mtune=genericburada tartışıldığı gibi: lemire.me/blog/2018/07/25/…
Roland Weber

@RolandWeber: Bu sadece CPU'nuz hakkında bilgi sahibi olmak için çok eski bir GCC kullanırsanız olur. -march=nativeCPU'nuz tune=nativehakkı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.
Peter Cordes

GCC'nin tune=genericaynı 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.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.