2013-02-19 100 views
2

我試圖使用工作線程來加速更大的算法,當我發現在更多的線程上使用獨立的優先級隊列實際上會降低性能。於是我寫了一個小測試用例。緩慢的工作線程性能與優先級隊列

在其中我查詢要啓動多少個線程,將每個線程設置爲它自己的處理器,並從我的優先級隊列中推送和彈出很多東西。每個線程都擁有自己的優先級隊列,並且它們分開分配,所以我不懷疑虛假分享。

我把測試用例here,因爲它比片段更長。 (處理器關聯位來自NCrunch

優先級隊列是我自己創建的,因爲.NET沒有內置隊列。如果這有什麼不同,它使用Pairing Heap

無論如何,如果我用一個線程和一個核心運行程序,它會獲得大約100%的使用率。 One core 兩根線程/兩個核心的使用率下降 Two cores 最終,所有8個核心的使用率降至30%。 eight cores

這是一個問題,因爲性能的下降會使任何操作都無效,這將會從多線程中獲益。什麼導致性能下降?每個隊列完全獨立於另一個線程

+0

如果您運行的物理內核很少(並且啓用了超線程),那可能都是正常的。請參閱http://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference和http://superuser.com/questions/420329/single-threaded-program-takes-too -low-cpu – 2013-02-19 16:53:11

+0

嗯,我將不得不嘗試禁用超線程。但是,如果我做一些像http://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c計算Pi,我全面獲得100%。 – Tocs 2013-02-19 17:02:48

+0

@Tocs請發佈你的結果 - 我一直有類似的問題,並沒有意識到超線程可能是責備。 – AngryHacker 2013-02-19 17:44:48

回答

2

像解決pi問題更適合於並行化,超線程可以讓你加快速度。當你正在處理像你這樣的沉重記憶問題時,超線程無法幫助並且實際上可能會受到傷害。檢查CPU架構中的「流水線」。

通過使用2-cpus可以獲得2x加速的實際問題並不多。越多cpus,開銷越大。在您的測試案例算法中,我懷疑內核不得不等待內存子系統。如果您調整了內存需求,當您將內存需求移至CPU高速緩存大小時,您會看到性能(和利用率)的增加。

+0

我可以看到這是一個問題,隊列的堆不完全是在內存中的本地。它經常分配一小部分內存,因此分散。我會試着找到一個更加緩存友好的堆實現,看看它是否改善了它。 – Tocs 2013-02-19 18:32:33

+0

對於某個與優先級隊列有相同問題的人,我寫了一個QuickHeap的粗略實現,它是一個緩存遺忘的堆。這意味着它可以在不知道大小的情況下優化使用緩存。 http://pastie.org/6316709。使用這個優先級隊列時,我看到幾乎100%的CPU使用率,同時推動和彈出。記憶確實是個問題。 – Tocs 2013-02-22 14:26:13

0

操作系統正在將處理分配給它希望的任何CPU。因此,你看到每個處理器都在做一些工作。

此外,當您說「性能下降」時,您是否檢查過系統正在創建多少個爭用?您可能也正在減輕線程間的爭用。