2009-07-09 94 views
1

這是一個有點泛泛的問題。假設我使用Java或VC++創建了一個簡單的應用程序,它創建了兩個線程,並在多核系統中運行該應用程序。如果沒有任何特定的指令爲哪個內核運行,應用程序本身是否會將線程分佈到各個內核?多核處理器中的多線程應用程序

謝謝。

回答

8

應用程序不會分配線程,但OS會。這是它的工作。 :)

有趣的是,在單個運行進程中,線程可以在相當頻繁的內核之間進行交換,因爲其他負載和中斷可能會影響CPU核心。

如果您決定需要指定特定線程可以運行的核心,則操作系統通常會提供一種機制,將線程的「關聯」設置爲特定的cpu。在高級優化場景中這可能是有價值的,以保持特定線程的高速緩存,例如,雖然通常不需要。

3

操作系統將進程和線程分配給不同的內核。這並不是說你不能影響決策,有些操作系統允許你在決定這一點時進行一些控制。必要時,內核之間的流程也可以移動,以確保核心的良好利用率。

1

您可以SetThreadIdealProcessor和相關API調用做到這一點在Windows上:

http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx

如果你的線程每一個都要求大量的資源,那麼你會希望操作系統對他們在可用內核分配。

我有點擔心線程關聯的混亂,因爲你有效地猜測操作系統的調度程序。例如,您可能會導致您的應用程序響應速度變慢,但以與您的應用程序的主UI線程競爭的方式調度線程。

我通常做法事按以下順序用探查的幫助和一些固定的應用基準,以便我可以比較不同的方法

  1. 算法
  2. 算法 - 認真!在考慮其他擔心算法之前。
  3. 編譯器開關 - 您是否爲發佈構建啓用了所有優化。
  4. 編譯器提示 - 確保你的代碼給了編譯器儘可能多的信息,以便優化。例如,你是否過度使用指針或編譯器無法再猜測的其他一些機制。
  5. 緩存,螺紋親和力等

阿德