簡體   English   中英

Plinq、Cores 和 WithDegreeOfParallelism?

[英]Plinq, Cores and WithDegreeOfParallelism?

據我了解,Plinq 通過內核數決定要打開多少線程(每個線程在不同內核上的線程上)。

__________

  Core 1
  Core 2
  Core 3
  Core 4
___________

所以如果我有一個 Plinq 任務找到所有前 1000 個素數,Plink 將Thread on each Core打開一個新Thread on each Core以最大化效率。

所以在這里,每個核心都將運行 1000/4 個數字,即尋找素數的邏輯。

但是我讀過像IO這樣的阻塞操作應該與WithDegreeOfParallelism一起使用,這樣 cpu 就不會認為這是一個密集的 cpu 操作,並且它允許使用比cores more線程。

問題 :

1)准確嗎? 我理解正確嗎?

2)如果我設置WithDegreeOfParallelism (7)那么它肯定會使用所有 4 個內核,但其他 3 個呢? (7-4) 他們會跑到哪里去? 在哪個核心/秒?

首先,.Net 不會選擇哪個核心執行哪個線程,操作系統會。 如果系統上沒有其他 CPU 密集型應用程序在運行,您可以預期每個線程將在單獨的內核上執行。 但是,如果有其他應用程序,例如操作系統可能會決定在單個內核上運行所有線程,並在它們之間切換。

它甚至比這更復雜。 線程通常不在單個內核上運行,操作系統一直在內核之間切換它。 例如,請看以下任務管理器中的屏幕截圖,其中顯示了單線程 CPU 密集型應用程序的執行情況。

任務管理器 CPU 使用率截圖

您會注意到單線程在我的所有 4 個內核上執行,並且在它運行的幾秒鍾內使用了每個內核的大約 25%。

.Net 不知道您計算機的 CPU 使用情況,因此它假設執行 CPU 密集型工作的最佳線程數與內核數相同。

我不知道 PLINQ 究竟是如何工作的,但我不希望每個核心在您的示例中產生 1000/4 個質數。 如果一個線程已經產生了它的素數份額而另一個線程還沒有完成,那么讓第一個線程保持空閑狀態是沒有效率的。

是的,對於 IO 操作,最佳線程數不取決於內核數,因此您應該手動設置並行度。 (不要忘記,最佳線程數可能是 1;硬盤順序讀取最快,而不是在許多文件之間來回尋找。)

如果你設置WithDegreeOfParallelism(7)它肯定會使用 7 個線程(同樣,不能保證內核的數量)。 操作系統將決定如何在您的 4 個內核上運行這 7 個線程。 如果所有這些線程都是 CPU 密集型的,則很可能會為每個線程分配 4/7 ≈ 57 % 的內核。 如果它們是 IO 綁定的,它將為剛剛在任何可用內核上喚醒(未阻塞)的線程執行代碼。

並且WithDegreeOfParallelism()確實設置了線程的確切數量,而不是它們的最大數量,請參閱 Stephen Toub 的ParallelOptions.MaxDegreeOfParallelism與 PLINQ 的WithDegreeOfParallelism

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM