gpt4 book ai didi

c# - Plinq、Cores 和 WithDegreeOfParallelism?

转载 作者:太空狗 更新时间:2023-10-29 18:22:48 25 4
gpt4 key购买 nike

据我了解,Plinq 决定打开多少个线程(每个线程在不同核心上的一个线程上)按核心数。

__________

Core 1
Core 2
Core 3
Core 4
___________

所以如果我有一个 Plinq 任务可以找到所有前 1000 个素数,Plink 将在每个 Core 上打开一个新的 Thread 以最大限度地提高效率。

所以在这里,每个核心都将在 1000/4 数上运行,即寻找素数的逻辑。

但是我读到像 IO 这样的阻塞操作应该与 WithDegreeOfParallelism 一起使用,这样 cpu 就不会认为这是一个密集的 cpu 操作,并且它允许使用更多线程而不是核心

问题:

1) 准确吗?我理解正确吗?

2) 如果我设置 WithDegreeOfParallelism (7) 那么它肯定会使用所有 4 个内核,但是其他 3 个呢? ( 7-4 ) 他们将跑到哪里去?在哪个核心上?

最佳答案

首先,.Net 不会选择哪个内核执行哪个线程,操作系统会选择。如果系统上没有运行其他 CPU 密集型应用程序,您可以预期每个线程将在单独的内核上执行。但是,如果有其他应用程序,操作系统可能会决定在单个内核上运行所有线程,并在它们之间切换。

而且比这还要复杂。线程通常不在单个内核上运行,操作系统一直将其从一个内核切换到另一个内核。例如,请查看任务管理器中的以下屏幕截图,其中显示了单线程 CPU 密集型应用程序的执行情况。

Task Manager CPU usage screenshot

您会注意到,单个线程在我所有的 4 个内核上执行,并且在它运行的几秒钟内使用了每个内核大约 25% 的资源。

.Net 不知道您计算机的 CPU 使用率,因此它假定执行 CPU 密集型工作的最佳线程数与内核数相同。

我不知道 PLINQ 究竟是如何工作的,但我不希望每个核心在您的示例中产生恰好 1000/4 个素数。如果一个线程已经产生了它的素数份额而另一个线程尚未完成,则让第一个线程保持空闲状态效率不高。

是的,对于 IO 操作,最佳线程数不取决于内核数,因此您应该手动设置并行度。 (不要忘记最佳线程数可能是 1;硬盘在顺序读取时速度最快,而不是在许多文件之间来回搜索。)

如果您设置 WithDegreeOfParallelism(7),它肯定会使用 7 个线程(同样,不能保证核心数量)。操作系统将决定如何在 4 个内核上运行这 7 个线程。如果所有这些线程都是 CPU 密集型的,它很可能会给每个线程大约 4/7 ≈ 57% 的核心。如果它们是 IO 绑定(bind)的,它将在刚好可用的任何内核上执行刚刚唤醒(未阻塞)的线程的代码。

WithDegreeOfParallelism() 确实设置了线程的确切数量,而不是它们的最大数量,参见 Stephen Toub 的 ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism .

关于c# - Plinq、Cores 和 WithDegreeOfParallelism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12020568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com