2015-08-24 109 views
6

我在Parallel.For區塊內並行使用Math.Net Numerics進行繁重的數學計算。Parallel.For不利用所有核心

當我使用4個內核(2 * 2)在本地系統中運行代碼時,它使用全部4個內核。

但是,當我在我們的開發服務器上運行8個內核(4 * 2)的相同代碼時,它僅使用4個內核。

我試過設置MaxDegreeOfParallism,但忍不住。

任何想法爲什麼所有核心都沒有被利用。

以下是樣本代碼。

Parallel.For(0,10000,(i)=> 
{ 

// heavy math computations using matrices 
}); 
+1

您的服務器是否有支持超線程的8個內核或4個內核? – vcsjones

+0

@vcsjones:4個CPU,每個CPU有2個內核,因此總共4 * 2 = 8個內核 – malkam

+0

您是否使用本地提供程序? Math.NET Numerics本身並行化(至少部分) - 如果您更喜歡在頂部進行自己的並行化,請考慮通過調用Control.UseSingleThread()來禁用Math.NET的並行化;使用Intel的ChristophRüegg的 –

回答

0

MSDN

默認情況下,和foreach將利用然而,許多線程的基本調度程序提供,所以從默認的改變MaxDegreeOfParallelism唯一的限制很多併發任務將被如何使用。

我閱讀文檔的方式:如果底層的調度程序只提供一個單獨的線程,然後設置MaxDegreeOfParallelism > 1仍然會導致在單個線程。

+0

已經創建了多個線程/任務,但是當8個內核可用時,它們只能在4個內核上運行。 – malkam

+0

池的調度程序和運行時/ TPL實際上決定哪些線程在何時何地運行。如果運行時僅調度到4個邏輯內核,那麼無論已創建的線程數是多少,這都是並行運行的數量。 – theB

1

並行化是基於當前條件和許多其他情況在運行時完成的。您不能強制.NET使用所有核心(至少在託管代碼中)。

MSDN

「相反,默認情況下,Parallel.ForEach和方法的Parallel.For可以使用可變數量的任務這就是爲什麼,例如,ParallelOptions類有一個MaxDegreeOfParallelism屬性,而不是的。 「MinDegreeOfParallelism」屬性,其思想是系統可以使用比請求的線程更少的線程來處理循環 通過允許並行任務的工作線程數隨時間變化,.NET線程池動態適應不斷變化的工作負載。系統會觀察增加線程數量是提高還是降低整體吞吐量,並相應地調整工作線程數量。

如果使用並行循環,需要幾秒或更長時間的單個步驟,請小心。這可能會發生在I/O限制的工作負載以及冗長的計算中。如果循環需要很長時間,由於.NET ThreadPool類的線程注入邏輯使用的啓發式防止線程匱乏,您可能會遇到無限增長的工作線程。 「

相關問題