-J seçeneğine yapılacak maksimum sayı nasıl belirlenir?


31

Mümkün olduğu kadar çabuk derlemek istiyorum. Git figürü. Ve -jseçeneği izleyen sayı seçimini otomatikleştirmek istiyorum . Bu değeri programlı olarak, örneğin bir kabuk betiğinde nasıl seçebilirim?

nprocDerlemek için kullanabileceğim iş parçacığı sayısına eşdeğer çıktı mı ?

make -j1 make -j16

Yanıtlar:


34

nprocKullanılabilir CPU çekirdeği / iş parçacığı sayısını verir, örneğin iki yönlü SMT'yi destekleyen dört çekirdekli bir CPU'da

Seçeneği makekullanarak paralel olarak çalıştırabileceğiniz işlerin -jsayısı bir dizi faktöre bağlıdır:

  • kullanılabilir hafıza miktarı
  • Her makeiş tarafından kullanılan hafıza miktarı
  • hangi makeişlerin G / Ç veya CPU'ya bağlı olduğu

make -j$(nproc) başlamak için iyi bir yerdir, ancak mevcut hafızanızı tüketmediğiniz ve çalmaya başladığınız sürece, genellikle daha yüksek değerler kullanabilirsiniz.

Gerçekten hızlı kurulumlar için, eğer yeterli belleğiniz varsa, a kullanımını tavsiye ederim tmpfs, bu şekilde çoğu iş CPU'ya bağlı make -j$(nproc)olacak ve mümkün olduğu kadar hızlı çalışacaktır.


3
ve ccachedaha sonra yeniden inşa etmek için ama bu OT
solsTiCe

1
GNU paralel gibi bir şey kullanmak burada faydalı olur mu?
terdon

A kullanırsam tmpfs, her zaman fiziksel RAM boyutumdan daha küçük bir dizin boyutuyla sınırlı mı olurum?
tarabyte

2
Harika bir cevap değil, ancak programatik olarak en hızlı "j" değerini belirleme sorusunun tam anlamıyla, j'yi 1'den bir miktar makul üst limite (2x nproc ??) dönüştürebilir ve timeçağrıyı bir çağrıya sarabilirsiniz . Sonuçları temizleyin, köpürtme tekrarlayın-- ve zaman / j değerlerini sıralayın.
Jeff Schaller

3
@terdon No. Make, bağımlılıkları çözmekle ilgilidir; bu, işlerin hala belirli bir sırada çalıştırılması gerektiği anlamına gelir. GNU paralelinde bunu umursamıyor. Bir yandan, hangi işlerin paralel olarak yürütülmesinin güvenli olduğuna ve hangilerinin çalışmadığına karar vermek zor bir sorundur. Paralel yapılar sunan programların tümü bir şekilde kullanılabilir hale gelene kadar yıllar sürdü.
lcd047

6

Maalesef, aynı yapının farklı bölümleri bile, ne inşa edildiğine, sistem kaynaklarından hangisinin tıkanıklık olduğuna, inşaat makinesinde başka neler olduğuna bağlı olarak, çakışan j faktörü değerleriyle en uygun olabilir ağ (dağınık yapı teknikleri kullanılıyorsa), bir yapıya dahil olan birçok önbellek sisteminin durumu / yeri / performansı vb.

100 küçük C dosyasını derlemek, tek bir büyük dosyayı ya da viceversa'yı derlemekten daha hızlı olabilir. Küçük yüksek sarmallı kod oluşturmak, büyük miktarlarda düz / doğrusal kod oluşturmaktan daha yavaş olabilir.

Derleme konuları bağlamında bile - özel, çakışan olmayan derlemeler için ince ayarlanmış özel sunucularda derlemeler için optimize edilmiş aj faktörü kullanılması, aynı paylaşılan sunucuya paralel olarak bina geliştiricileri tarafından kullanıldığında çok kirletici sonuçlar verebilir (bu tür derlemeler daha fazlasını alabilir. seri hale getirilmişse hepsinden birleştirilmiş zamana kadar) veya farklı donanım konfigürasyonlarına sahip veya sanallaştırılmış sunucularda.

Yapı şartnamesinin doğruluğu da var. Çok karmaşık yapılar, j faktörünün artması veya azalmasıyla çılgınca değişebilecek meydana gelme oranlarıyla aralıklı inşa arızalarına neden olan yarış koşullarına sahip olabilir.

Devamlı gidebilirim. Mesele şu ki , yapınızı j bağlamının optimize edilmesini istediğiniz bağlamda değerlendirmelisiniz . @Jeff Schaller'in yorumu geçerlidir: En uygun olanı bulana kadar yineleyin. Şahsen ben nproc değerinden başlamalıyım, sadece yukarı doğru girişimler anında bozulma gösterirse ilk önce yukarı ve aşağı doğru deneyeceğim.

Ölçümlerinizin değişkenliği hakkında bir fikir edinmek için, sözde özdeş bağlamlarda çeşitli özdeş yapıları ilk önce ölçmek iyi bir fikir olabilir - çok yüksekse, tüm optimizasyon çabanızı tehlikeye atabilir (% 20'lik bir değişkenlik% 10'luk bir iyileşmeyi tamamen etkileyebilir / j faktörü aramasında bozulma okuması).

Son olarak, IMHO sabit bir j faktörü yerine desteklenip mevcutsa (adaptif) bir iş sunucusunu kullanmak daha iyidir - sürekli olarak daha geniş bir bağlam aralığında daha iyi bir yapı performansı sağlar.


dayanak yapının bağımlılıklarına bakılırsa. -jparametresiyle sabit bir sayı geçirme konusunda yorum yapabilir misiniz ? egmake -j
tarabyte

4
make -jbağımlılıkların çatal bomba gibi izin verdiği kadar çok sayıda iş üretecek ( superuser.com/questions/927836/… ); derleme, işlemlerin yönetilmesinde işlemcilerin çoğunu en iyi şekilde harcayacaktır ( superuser.com/questions/934685/… ) ve çok paralel yapılarda sistemde bellek / takas veya pid # işlemleri bitecektir. .
Dan Cornilescu,

3

En düz yol bu şekilde kullanmaktır nproc:

make -j`nproc`

Komut nproc, makinenizdeki çekirdek sayısını döndürecektir. Kenelere sarılarak nprockomut ilk önce çalıştırılacak, bir sayı döndürülecek ve bu numaraya geçilecektir make.

Çekirdek sayımı + 1 yapmanın daha hızlı derleme süreleriyle sonuçlandığı bazı anekdot deneyiminiz olabilir. Bunun I / O gecikmeleri, diğer kaynak gecikmeleri ve diğer kaynak kısıtlamaları gibi faktörlerle ilgisi vardır.

Bunu yapmak için şunu nproc+1deneyin:

make -j$((`nproc`+1))

0

makeSanal CPU'larınız olduğu kadar paralel çalışan kullanmak için komut yazmak isterseniz, şunu kullanmanızı öneririm:

nproc | xargs -I % make -j%

Bu, bağımsız bir komut olarak veya RUNiçinde bir yönerge olarak yazılabilir Dockerfile(Docker iç içe komutları desteklemediğinden).

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.