2014-11-21 11 views
0

Afaik:適合並行處理的數據線程的最佳數量是內核數量 - 因爲每個線程有(理論上)其核心自己運行。對於具有超線程能力的CPU,它的內核數量是2倍。如果我錯了,請糾正我。我可以依賴該操作系統調度線程「最優」(並行化)

我的問題是如果底層操作系統(Linux,Winodws OSX)會自動實現我的「意圖」,例如假設我有例如每個線程分配給單個內核。 8個內核和相應的8個線程,其中每個線程在「耗時」任務上工作?

或者相反:是否可以將線程分配給內核(特別是在Java中)?

+0

最佳線程調度除了在極少數情況下np-hard之外,所以沒有OS會這樣做。現代調度程序非常聰明,如果可能的話,不會將線程從核心移動到核心,因爲從高速緩存的角度來看,這非常糟糕。 – Voo 2014-11-21 15:15:23

回答

2

Afaik:適合並行處理的數據的最佳線程數是內核數 - 因爲每個線程都有(理論上)自己的核心運行。對於具有超線程能力的CPU,它的內核數量是2倍。如果我錯了,請糾正我。

這遠比這更復雜。

這取決於您正在優化的內容。如果您正在優化高效(即成本效益)的硬件使用情況,那麼它很難達到最佳效果。如果任何線程由於任何原因需要等待很長時間,則線程一對一分配給物理內核會導致內核利用率不足。如果這些核心可以用於別的東西(例如運行某人elses程序!),那麼你的使用是不理想的。

即使您僅針對應用程序速度進行優化,但一對一分配並不一定是最佳策略。

  • 根據線程數量,每個應用程序+工作負載都有一個「最佳位置」。這取決於任何內部爭用的數量和性質,以及與外部系統(文件系統,網絡等)的通信量和性質。

  • 如果你有嚴格的單線程每核心規則,那麼你最多可以在N核心系統上有N個線程。

  • 如果該N顯着小於線程的「甜蜜點」數量,那麼您可能會發現內核空閒很多時間。

現在用於超線程。

超線程可能會給您每個時鐘週期的額外CPU週期。但是,它們在內存系統中不會給你額外的週期。超線程「虛擬核心」的性能特徵將與物理核心不同......而對於實際應用,這種差異將是顯着的。因此,你的2 x假設是沒有根據的。

我的問題是如果底層操作系統(Linux,Winodws OSX)會自動實現我的「意圖」,例如假設我有例如每個線程分配給單個內核。 8個內核以及相應的8個線程,其中每個線程都在「耗時」任務上工作?

不一定。

  • 操作系統必須考慮系統上發生的其他事情。其他應用程序,處理您的桌面的守護進程等,處理文件系統和網絡協議的東西。

  • OS(和JVM)通常只會對調度決策中已經發生的事情做出反應。根據過去的行爲(在這個級別)預測未來的行爲不符合成本效益......現代操作系統不會試圖去做,除非是在一個非常粗略的/啓發式的級別。完美(最優)預測是不可能的,即使你有完美的知識,調度問題也是NP難題。

從理論上講,應用程序員可以設計一個最佳時間表。實際上,大多數應用程序對於這個過於複雜,並且很難考慮到系統上發生的其他「隨機」事件。

或者相反:是否可以將線程分配給內核(特別是在Java中)?

沒有切實可行的方法來做到這一點。 (見@ ksmonkey123的答案)當然,不可移植。

反正它可能不太可能在Java中工作。 Java存在隱藏的線程在應用程序背後隱藏線程的問題(例如垃圾收集器和終結器線程),Java內存管理難以預測並且難以調整。