- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
据我了解,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 密集型应用程序的执行情况。
您会注意到,单个线程在我所有的 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/
System.Threading.ThreadPool.SetMaxThreads(50, 50); File.ReadLines().AsParallel().WithDegreeOfParalle
System.Threading.ThreadPool.SetMaxThreads(50, 50); File.ReadLines().AsParallel().WithDegreeOfParalle
据我了解,Plinq 决定打开多少个线程(每个线程在不同核心上的一个线程上)按核心数。 __________ Core 1 Core 2 Core 3 Core 4 _________
我是一名优秀的程序员,十分优秀!