2012-10-16 30 views
0

如果多核CPU的代碼被並行化,將這個CPU加載到100%以下,這是否僅僅是因爲I/O和互斥量的預期?或者也許是因爲緩存未命中並等待訪問RAM或其他內容?什麼導致並行代碼的CPU負載低於100%?

+1

如果沒有代碼和運行時環境的親密知識,您如何期待任何人給你任何準確的答案? – asawyer

+0

阿門那。您可以並行化代碼並使其運行速度不會快於順序版本。即使你做得很好,獲得100%利用率仍然取決於問題。這是一個問題很少的問題。嘗試提供更多細節。 –

回答

0

您的進程不會是唯一正在運行的進程。其他進程(包括OS內核)將佔用百分比。上下文切換,等待I/O和互斥鎖只是其中的一部分。

0

我確信有很多很多可能的原因沒有達到100%的CPU使用率,我們將無法確定確切的原因,而無需更多的環境知識。

如果你的CPU是超線程(HT),比其他一些CPU設計有更多的考慮; CPU的某些部分是重複的,這意味着操作系統將您的物理核心視爲多個邏輯核心,這些邏輯核心就像任務管理器顯示的一樣。在某些情況下,CPU的非重複部分可能成爲瓶頸,這可能意味着重複的組件無法以100%的使用率運行。

有趣的是,英特爾認爲HT CPU的性能與非HT CPU相比只有30%左右的性能提升,即使邏輯核心的數量增加了一倍。

0

我不知道我是否理解了您的問題的要點,因此我將假定您問爲什麼您的多線程應用程序不使用核心上可用的CPU功率的100%。

當我編寫一個使用50%可用容量的多線程外殼排序(兩個內核爲50%)時,即使沒有其他事情發生,也就是說我期望它在兩個內核上都使用100% 。

我糾正了這個問題,通過使用親和函數將線程綁定到特定的核心。在雙核機器上只會創建兩個線程。這種排序現在可以使用任意數量的內核(儘管它不會擴展到三個內核之外),並以100%的速度運行它們。與通過分類完成的工作相比,操作系統和相關過程所完成的工作微乎其微。由於線程與核心綁定,操作系統在管理它們時幾乎沒有選擇/很少做任何事情。

0

Amdahl的法律和同步開銷將是我的第一個嫌疑犯。只要你有某種同步或線程管理,就會一直髮生。

如果我們假設這接近於零,所有在這個線程中提出的其他事情都可以。 IO,緩存,操作系統干擾,硬件問題,如HT(如果在Intel x86上),...

測試此方法的一個好方法是將程序移到不同類型的體系結構上運行(Intel,AMD,Power ,Sparc,HT,非HT)和操作系統,並查看行爲是否改變。這往往以非常有效的方式揭示程序的核心行爲。

相關問題