【问题标题】:Parallel.For, max threads and coresParallel.For,最大线程数和内核数
【发布时间】:2011-04-28 21:02:02
【问题描述】:

在我们的服务器上,我们有一个四核处理器。当运行没有 ParallelOptions 参数的 Parallel.For 循环时,它将使用多少个线程?

另外,在运行嵌套循环时,外部循环和内部循环应该是并行的,还是只在性能方面是外部的?

【问题讨论】:

  • 你的测试揭示了什么?您在尝试此操作时获得的结果是否有一些疑问?

标签: c# .net


【解决方案1】:

你无法知道具体有多少,所以线程数在1n之间,其中n是要并行运行的任务数(一个线程可能是当前线程顺便说一句,因为Parallel 等待其任务完成)。 Parallel 不保证操作是同时运行的,但只能保证它们可能是。实现您自己的Task Scheduler,如果您想控制使用多少线程,请使用它。

如果你想知道并行运行外循环和内循环是否更好,没有答案。我们不知道你的循环在做什么。在尝试优化循环之前使用性能分析器,因为您很可能不知道性能瓶颈在哪里。

【讨论】:

    【解决方案2】:

    这取决于。 Parallel.For 中的嵌套 Parallel.For 将并行化每个并行化循环。但是,如果您不这样做,那么 for 循环将完全在同一个线程内执行。一定要阅读 MSDN 中的 Parallel 库。

    http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx

    我想说 .Net CLR 会对您尝试做的事情进行一些评估,并生成尽可能多的有意义的线程,但我不能肯定地说。

    【讨论】:

    • 不,不会的;一个进程只有这么多的线程它可以掌握,嵌套 Parallel.For 只会在线程可用时执行子 parallel.for,从而阻止它与其他远亲兄弟和它的复制父 [s]。 Parallel.For 在执行中不可预测的原因是,它们实际上是等到它们可以执行,并在它们完成时执行,在它们自己的时间。如果有的话,嵌套 Parallel.For 会降低性能。
    【解决方案3】:

    TPL 将自动确定要使用多少线程,您可以假设它能够使用所有 CPU。

    至于循环,其中只有一个应该是并行的,但哪一个真正取决于每个循环的工作负载和大小。如果外部可以是并行的,并且您不需要任何同步,这可能是更好的并行。

    【讨论】:

    • 进程永远无法使用所有的CPU;只有内核提供给它的亲和力。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2013-04-02
    • 2013-03-31
    • 2016-04-13
    • 2022-01-23
    • 2016-09-14
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多