2015-09-16 15 views
5

Kısa bir süre önce C++ ile çalışmaya başladım ve bir tamsayı değerleri matrisi ile en iyi yolu bulan basit bir test uygulaması yazdım. Bu uygulamanın performansını artırmak için C++ 11 std :: thread kullanarak çoklu iş parçacığı uyguladık.Tüm mevcut konuları kullanma kötü bir uygulama?

unsigned int threadCount = std::thread::hardware_concurrency(); 
std::vector<std::thread> threads; 
for (unsigned int threadIndex = 0; threadIndex < threadCount; threadIndex++) { 
     threads.push_back(std::thread(&AltitudeMapPath::bestPath, this, threadCount, threadIndex)); 
} 

for (auto& thread : threads) { 
    thread.join(); 
} 

Şu an itibariyle ben sadece mevcut iş parçacığı sayısını belirlemek ve her iş parçacığı için testimi yürütün. Bu fantastik çalıştı ama beni düşünmeye başladı ...

Belirli bir sistem için mevcut tüm konuları denemek ve kullanmak kötü bir uygulamadır? Bu basit örneğin ötesinde, çok iş parçacıklı olan üretim düzeyi uygulamaları, olabildiğince fazla iş parçacığı almayı dener (veya problemin izin vereceği gibi) veya bu kadar açgözlü olmamam gerekir mi?

Teşekkürler, ben kullanması gereken bir uygulama, kullanıcının tercihine bağlıdır kaç çekirdek tek doğru en iyi uygulama vardır sanmıyorum

+0

Bu sorunun oldukça geniş olduğunu düşünüyorum: Bazen bir sürecin açgözlü olmasını istersiniz, ancak programın performansını gerçekten umursamayabilirsiniz. Belki de programa, kullanıcıların iş parçacığı sayısını kendilerinin belirleyebileceği bir parametre ekleyin. –

+1

'std :: async''e bir göz atmayı unutmayın. Ham ipliklerden biraz daha soyutlama sağlar. Gerçek üretim kodu için, görev tabanlı bir kütüphane kullanıyorum, ör. Intel TBB, Microsoft PPL veya Apple GCD. – Jens

+0

@Jens Bilmekte fayda var! Evet, şimdi bu beni C++ 'ya geri döndüren küçük bir proje ... ... çok iş parçacığı ve CUDA programlamasıyla uğraşıyor. Ancak, büyük resmi düşünmek her zaman iyidir! – ductiletoaster

cevap

6

. Bir kullanıcının bir başvurunun mümkün olduğunca çabuk çalışmasını istediği durumlar olacaktır ve bir kullanıcının birden fazla işi tercih edeceği ve makinenin altında bir uygulama bulunmadığı durumlar olacaktır.

Benzer bir sorunla karşılaştım ve kullanıcının yapılandırılabilir olan iş parçacığı sayısını belirlemeye karar vermesi, böylece kullanıcının hız ve cpu kaynak kullanılabilirliği arasında seçim yapabilmesine karar verdim. Benzer bir yapılandırma kullanan en az bir uygulama düşünebilirim, bu yüzden kullanıcının seçmesine izin vermenin nadir olduğunu düşünmüyorum.

Kullanıcı için seçim yapmak zorunda kalıyorsanız, kullanıcının diğer işleri gerçekleştirmesi için bir iş parçacığı oluşturmak için donanım çekirdek sayısını - 1 kullanmanızı öneririm. Ayrıca, std::thread::hardware_concurrency()'un bir ipucu olması ve bir belirleme yapamıyorsa 0'a dönmesine izin verildiğini unutmayın.

+1

'donanım çekirdek sayısı - 1 'pratikte oldukça iyidir. Tüm çekirdeklerin kullanılması çoğu zaman kullanıcı için iyi değildir. –

+0

Bu, uygulamanın/kullanıcıların gereksinimlerine göre değiştiği için iyi bir nokta. Diğer işler için en az bir çekirdekten vazgeçme önerinizi beğendim. İşletim sistemi, 8 iş parçacığı mevcutsa ve 6'yı "ayırırsam" o zaman bir çekirdeğin dokunulmayacağını bilecek kadar akıllı olduğunu farz ediyorum. – ductiletoaster

+0

@ductiletoaster Genel olarak, hem Linux hem de Windows swap'ları zaman zaman işleyen çekirdekler, aşırı ısınmayı önlemek için düşündüğüm şey. –

İlgili konular