Kaç tane iş parçacığı kullanır?


11

Bir masaüstü / dizüstü bilgisayarda büyük sistemleri yeniden makeoluşturduğumda, derleme hızını hızlandırmak için birden fazla iş parçacığı kullanmayı söylerim :

$ make -j$[ $K * $C ]

Nerede $Csayısını belirtmek gerekiyordu çekirdek iken, makine vardır (biz bir rakam ile sayı olması varsayabiliriz) $KBen değişir şeydir 2üzere 4, benim ruh bağlı.

Yani, örneğin, make -j1212 çekirdeği makekullanmayı belirten 4 çekirdeğim varsa söyleyebilirim .


Benim mantığım, $Csüreçleri sürücülerden veri almakla meşgulken yalnızca iş parçacıkları kullanırsam çekirdeklerin boşta olacağıdır. Ama iş parçacığı sayısını sınırlamazsam (yani make -j) zaman değiştirme bağlamları, bellek yetersiz ya da daha kötü zaman kaybetme riskini alırım . Diyelim ki makinede $Mbellek var (10'lu $Msırada).

Bu yüzden, çalışacak en etkili iş parçacığı sayısını seçmek için yerleşik bir strateji olup olmadığını merak ediyordum.


Birçok durumda, iş parçacığı sayısı için doğru cevap çekirdek sayısı olacaktır. Ancak kesin olarak bilmenin tek yolu, bazı testleri yapmak, tatlı noktayı bulana kadar iplik sayısını değiştirmek.
Robert Harvey

@RobertHarvey: Evet, muhtemelen gece boyunca her türlü ayarla derlenen bir kabuk betiği yapacağım, ama bunun hakkında biraz bilgi olup olmadığını soracağımı düşündüm.
bitmask

4
birçok kişi de $ çekirdek + 1 önerdiğinden, 4 derleyici 1 derleyici işlemi diskten okur. Genel bir öneri zordur, ayrıca kod tabanına (C ++ şablonunun aşırı kullanımı ile birkaç C fonksiyonlu küçük derleme birimleri), derleyici zinciri (önceden derlenmiş başlıklar vb.) Ve yapı yapısına ( bitirmek veya aradaki birden fazla küçük şeyler)
johannes

1
Ciddi bir performans arıyorsanız, bir RAM diski veya G / Ç'nizi hafifletmek için başka bir yöntem kurmayı öneririm. CPU kullanımının sıcak noktanız olduğunu düşünmüyorum.
TMN

@TMN: Bir RAM diski nasıl yardımcı olur? Linux (eğer şeyler önbelleğe de oldukça iyidir yapmak sürücü önbelleği saymıyorum, sağa, başlık dosyaları demek?). Ben el ile ya da (ki tamamen overkill olurdu) yapı komut dosyası değiştirerek shm ilk şey her şeyi yüklemek zorunda kalacak.
bitmask

Yanıtlar:


15

İki çekirdekli ve 8 GB RAM'e sahip bir makinede llvm (Debug + Asserts modunda) oluşturarak bir dizi test yaptım:

iş sayısına bağlı olarak llvm süresi derleme

Garip bir şekilde, 10'a kadar tırmanıyor gibi görünüyor ve sonra aniden iki iş ile inşa etme süresinin altına düşüyor (bir iş yaklaşık iki kez sürüyor, grafiğe dahil değil).

Asgari 7*$coresbu durumda görünüyor .


1
Gerçek test için + 1, spekülasyon yapmadan.
Martin Wickman

3

Gentoo Linux (kaynak tabanlı dağıtım) çalıştırıyorum ve deneyimlerime göre (az çok yakın zamanda donanım ile) n*2 + xen iyi değer olduğunu söyleyebilirim . Bunu açıklayayım:

  • n*2: Daha yavaş CPU'lar bile bir seferde 2 görevi yürütmek için yeterli güce sahiptir. Çoğu derleme görevi çok hızlı tamamlanır.
  • +xbu sayı sisteminize bağlıdır (özellikle bellek ve disk). Yeterli RAM'iniz ve hızlı bir diskiniz varsa ayarlayın x=n. Ancak, bu kaynak kodu (Open Office, sana bakıyorum!) Ve kullanılan dile (C / C ++ derleme çok bellek yoğun) bağlıdır.

Ancak, -jen iyi sayıyı elde etmek için bazı değerlerle bazı testler yapmanız gerekir . Ayrıca, oluşturma işleminin diğer adımlarını paralelleştirmeye çalışın: ambalajdan çıkarma, çalıştırma configureve benzeri.


Şu anda çoğunlukla C ++ ile ilgileniyorum ve disklerim en hızlı değil sanırım.
bitmask

Sonra n * 1.5 ile başlayın ve derleme süreleri azalmayı durdurana kadar artırın (her seferinde disk önbelleğini / derleme önbelleğini temizlediğinizden emin olun). Ayrıca, derlemeyi hızlandırmak için ccache ( ccache.samba.org ) kullanmayı düşünün .
ercpe
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.