我見過非常類似的問題,但似乎沒有提供任何科學評估。我的問題是,我想優化我的Java線程池中用於分形呈現應用程序的線程數。我應該使用多少個線程來渲染圖像?
通過將圖像分割成子圖像,我能夠同時呈現每個子圖像是完全獨立的。
所以我的想法是根據處理器中可用線程的數量製作一個固定的線程池。然後每個線程可以渲染一個或多個子圖像。如果我這樣做,我應該使用什麼比例的線程到子圖像?有沒有更好的方法來分割負載?
如果我只有很多電腦有不同數量的核心,我可以通過實驗找到自己。不幸的是,我沒有這樣的奢侈品= [
我見過非常類似的問題,但似乎沒有提供任何科學評估。我的問題是,我想優化我的Java線程池中用於分形呈現應用程序的線程數。我應該使用多少個線程來渲染圖像?
通過將圖像分割成子圖像,我能夠同時呈現每個子圖像是完全獨立的。
所以我的想法是根據處理器中可用線程的數量製作一個固定的線程池。然後每個線程可以渲染一個或多個子圖像。如果我這樣做,我應該使用什麼比例的線程到子圖像?有沒有更好的方法來分割負載?
如果我只有很多電腦有不同數量的核心,我可以通過實驗找到自己。不幸的是,我沒有這樣的奢侈品= [
通常情況下,理想的情況是每個處理器有一個線程,但前提是此時系統上沒有其他CPU負載較重的應用程序正在運行。
這背後的基本原理是線程之間的切換是一個昂貴的操作(關係),因此有效使用多核CPU的最佳方式是避免線程切換,同時仍然給CPU足夠的線程以便使用每個內核。可以
Runtime.getRuntime().availableProcessors();
獲得
系統的CPU內核數在支持超線程的系統,這會給你的虛擬CPU,而不是物理的人的數量。當您爲每個虛擬內核運行一個線程而不是每個物理內核一個線程時,每個線程可能需要更長的時間才能完成,但總體而言,他們在同一時間完成了更多工作,因爲可以更高效地使用CPU的內部資源。所以你應該爲每個虛擬內核運行一個,除非對你來說每個單獨的線程儘可能快地完成(在這種情況下,你可能會考慮使用單線程,因爲執行單線程的多核英特爾CPU超頻了它的內核運行並在核心之間切換,以便其他人可以冷卻)。
對於您要發送給最終用戶的應用程序,您可能會考慮將此值用作默認值,但允許它們對其進行更改,因爲用戶可能希望與其他CPU並行運行程序強烈的應用程序。在這種情況下,他們可能想要減少應用程序產生的線程數量,而不會減慢其他線程數量。
聽起來不錯,但考慮到Java選擇將線程交給哪裏,這是否真的可行?保證在所有線程中均衡分配?此外,調度程序可以隨意掛起任何這些線程,因此在任何時候,可能只有少數線程正在運行。 – CJxD 2013-03-14 13:23:10
您的子圖像渲染是否都是用CPU完成的,還是還有磁盤訪問需要考慮? – 2013-03-14 13:05:28
沒有磁盤訪問。至於'完全CPU'部分,我現在要擴展我的算法以利用GPU。 – CJxD 2013-03-14 13:19:45
http://stackoverflow.com/questions/13834692/threads-configuration-based-on-no-of-cpu-cores – assylias 2013-03-16 13:50:30