2013-01-09 55 views
1

我有180個SVM模型可以同時運行。 目前我在開始時將模型加載到數組中。 然後,當我需要運行模型時,我使用pthread創建180個線程,然後每個線程獲取指向每個模型的指針,並進行一些計算。使用多線程加載的多個模型

我的問題是,每次我想要做一些計算時創建180個線程可能會產生嚴重的開銷(並且有很多計算要做)。 所以我在想,在開始時將SVM模型加載到180個線程中,並且每次我想要做一些計算時都重用它們。

我的想法是否可行?將不同的模型加載到每個線程中並同時使用所有線程? 我想過線程池,但我不認爲這是一個典型的線程池用例。 我會很感激任何形式的建議。謝謝。

+1

確定這是可行的 - 爲什麼不呢?在頂部使用一些合適的信號發送一次while循環應該沒問題。如果您可以避免不斷創建/終止/銷燬180個線程,那麼太棒了!不確定線程​​池問題 - 如果其中任何一個進行阻塞調用,則180個線程都可以正常工作,但如果CPU密集型,則可能需要嘗試任務/池解決方案。 –

+0

感謝您的回覆!我的任務實際上是CPU密集型的,所以我對「threadpool.sourceforge.net」做了一些測試。 但是性能並沒有比使用pthread更好。 我想因爲boost :: thread是pthread的包裝,所以不會有任何「很大」的性能改進。 我打算現在測試OpenMP。如果這樣做不成功,我不妨堅持使用pthread。 – mp2893

回答

0

你不能同時運行它們,除非你有180個CPU來玩。否則,你在浪費大量的線程間能量切換,而他們互相爭鬥以取得進展。

更好的方法可能是創建一些接近可用CPU或核心數量的線程,並將各個模型分配到隊列中的線程。

假設您有8個內核要用於此目的。創建8個「worker」線程,讓每個線程從180個隊列中選擇一個線程並對其進行處理。當任何工作線程完成時,它會對上述180線程場景中的結果執行任何操作,並將下一個SVM模型從隊列中取出。繼續下去,直到處理完所有180個模型。

它可能需要較少的掛鐘時間來完成,並且幾乎肯定會比180個線程一次減少資源負載。完成此設置後,您可以嘗試運行的工作線程數來確定池大小的最佳位置。

+0

感謝您的提示!我實際上已經嘗試過使用上面提到的線程池方案。我使用的是Xeon 12核心機器,所以自然12個「工人」線程給我帶來了最好的結果。然後我嘗試使用OpenMP,並獲得比12「工作者」線程方案稍微好的結果(將掛鐘時間從256秒減少到249秒)。我猜OpenMP是一種很好實現的方式。 – mp2893