[英]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 密集型應用程序的執行情況。
您會注意到單線程在我的所有 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.