我已經在多線程版本中實現了PageRank的一個版本。我在4核Q6600上運行它。當我運行它設置爲創建4個線程,我得到:爲什麼有更多的線程比核心更快?
real 6.968s
user 26.020s
sys 0.050s
當我和128個線程運行我得到:
real 0.545s
user 1.330s
sys 0.040s
這是沒有意義的我。基本算法是sum-reduce:
- 所有線程總和輸入的一個子集;
- 同步;
- 然後每個線程累積來自其他線程的部分結果;
- 主線程將所有線程的中間值相加,然後確定是否繼續。
分析沒有幫助。我不確定哪些數據有助於理解我的代碼 - 請只問。
真的讓我感到困惑。
這種情況下的輸入是什麼?有什麼IO限制?你有沒有測量每個單獨的步驟? – 2011-05-13 06:02:02
是否有可能有更多的線程,每個線程都得到足夠小的塊來在一個時間片內完成?有些調度系統會在第一個切片中爲線程留出一點額外時間。如果它沒有及時完成,它就會被安排並參與正常切片。如果工作被分解到真正簡單的級別,那麼您可以通過爲應用程序獲取更多切片並盜取其他進程來「遊戲系統」。你也可以嘗試以更高的優先級運行,看看你是否得到類似的結果。 – 2011-05-13 14:52:13
輸入全部在開始時讀入,所以沒有IO界限。我重寫了多線程代碼的很大一部分,並刪除了一個錯誤共享的實例。虛假分享修復會稍微提高速度。 – laurencer 2011-05-14 09:39:19