如果多核CPU的代碼被並行化,將這個CPU加載到100%以下,這是否僅僅是因爲I/O和互斥量的預期?或者也許是因爲緩存未命中並等待訪問RAM或其他內容?什麼導致並行代碼的CPU負載低於100%?
回答
您的進程不會是唯一正在運行的進程。其他進程(包括OS內核)將佔用百分比。上下文切換,等待I/O和互斥鎖只是其中的一部分。
我確信有很多很多可能的原因沒有達到100%的CPU使用率,我們將無法確定確切的原因,而無需更多的環境知識。
如果你的CPU是超線程(HT),比其他一些CPU設計有更多的考慮; CPU的某些部分是重複的,這意味着操作系統將您的物理核心視爲多個邏輯核心,這些邏輯核心就像任務管理器顯示的一樣。在某些情況下,CPU的非重複部分可能成爲瓶頸,這可能意味着重複的組件無法以100%的使用率運行。
有趣的是,英特爾認爲HT CPU的性能與非HT CPU相比只有30%左右的性能提升,即使邏輯核心的數量增加了一倍。
我不知道我是否理解了您的問題的要點,因此我將假定您問爲什麼您的多線程應用程序不使用核心上可用的CPU功率的100%。
當我編寫一個使用50%可用容量的多線程外殼排序(兩個內核爲50%)時,即使沒有其他事情發生,也就是說我期望它在兩個內核上都使用100% 。
我糾正了這個問題,通過使用親和函數將線程綁定到特定的核心。在雙核機器上只會創建兩個線程。這種排序現在可以使用任意數量的內核(儘管它不會擴展到三個內核之外),並以100%的速度運行它們。與通過分類完成的工作相比,操作系統和相關過程所完成的工作微乎其微。由於線程與核心綁定,操作系統在管理它們時幾乎沒有選擇/很少做任何事情。
Amdahl的法律和同步開銷將是我的第一個嫌疑犯。只要你有某種同步或線程管理,就會一直髮生。
如果我們假設這接近於零,所有在這個線程中提出的其他事情都可以。 IO,緩存,操作系統干擾,硬件問題,如HT(如果在Intel x86上),...
測試此方法的一個好方法是將程序移到不同類型的體系結構上運行(Intel,AMD,Power ,Sparc,HT,非HT)和操作系統,並查看行爲是否改變。這往往以非常有效的方式揭示程序的核心行爲。
- 1. 紅寶石無限循環導致100%的CPU負載
- 2. JMeter負載測試導致目標服務器達到100%CPU
- 3. Eclipse與Python:由於PythonHome重新索引導致100%的CPU負載
- 4. 爲什麼選擇導致高cpu系統負載?
- 5. UITextView導致CPU去100%
- 6. 爲什麼「while(true)」與「Thread.sleep」會導致100%的CPU使用率?
- 7. Java socket偵聽器100%的CPU負載
- 8. 爲什麼這個while循環導致100%cpu
- 9. Java分析:檢測哪一段代碼會導致CPU負載過高
- 10. CPU負載和CPU溫度的C++代碼
- 11. 工人級別是否始終處於CPU 100%負載狀態?
- 12. 爲什麼我的代碼導致ArrayIndexOutOfBoundsException?
- 13. 多個選擇的Mysql查詢導致高CPU負載
- 14. 高CPU負載,但低CPU使用率和內存使用率
- 15. 爲什麼頁面上的SVG圖像會導致Chrome使用100%的CPU?
- 16. popen掛起並導致CPU使用率爲100
- 17. 什麼導致JVM退出代碼10?
- 18. 此代碼爲什麼會導致ArgumentOutOfRangeException?
- 19. 爲什麼此代碼會導致NullPointerException?
- 20. 什麼導致我的服務器上的負載峯值?
- 21. jffs2_gcd_mtd1 CPU負載
- 22. GNU'make -j'會導致CPU高負載和桌面無響應
- 23. 是什麼導致MySQL基數降低?
- 24. 什麼會導致JVM無法解析負載下的DNS?
- 25. 小PHP代碼 - 導致服務器負載?幫助優化
- 26. 爲什麼「返回數組的屬性容易導致代碼效率低下」?
- 27. 爲什麼我的代碼導致運行時錯誤?
- 28. PHP導致高SQL負載
- 29. 什麼CSS導致這個子菜單低於它應該是?
- 30. 爲什麼節點使用100%的CPU?
如果沒有代碼和運行時環境的親密知識,您如何期待任何人給你任何準確的答案? – asawyer
阿門那。您可以並行化代碼並使其運行速度不會快於順序版本。即使你做得很好,獲得100%利用率仍然取決於問題。這是一個問題很少的問題。嘗試提供更多細節。 –