.net 并行代码中的并行

.net 并行代码中的并行,.net,parallel-processing,task-parallel-library,vb.net-2010,.net,Parallel Processing,Task Parallel Library,Vb.net 2010,一旦我将任务划分为4个独立的任务,并使它们并行运行。 是否可以进一步使每个任务并行运行?(也就是说,每个任务,每个循环都有很多可实现的并行代码)您当然可以,但它是 不过,你必须考虑多个因素 迭代的大小是多少(越多越好) 您的CPU可以处理多少并发线程 处理器中的内核数量 Parallel.For(0, length1, i => { Parallel.For(0, length2, j => { Console.WriteLin

一旦我将任务划分为4个独立的任务,并使它们并行运行。
是否可以进一步使每个任务并行运行?(也就是说,每个任务,每个循环都有很多可实现的并行代码)

您当然可以,但它是

不过,你必须考虑多个因素

  • 迭代的大小是多少(越多越好)
  • 您的CPU可以处理多少并发线程
  • 处理器中的内核数量

    Parallel.For(0, length1, i =>
    {
        Parallel.For(0, length2, j =>
        {           
            Console.WriteLine(i * j);
        });
    });
    

也许你应该重新考虑你的算法,只保留一个并行的.For()。原因在本链接中描述:在“外部循环与内部循环”一段中:

“Parallel.For和Parallel.ForEach通常在外循环而不是内环上工作得最好。这是因为使用前者,您将提供更大的并行工作块,从而稀释管理开销。内环和外环的并行化通常是不必要的。在下面的示例中,我们通常需要100多个内核才能从内部并行化中获益:


我通常取线程数=核心数,因为我认为每个核心一次可以处理一个线程。我显然错了。(你的意思是“摊销”,而不是“稀释”)。如果Foo(I,j)提供的工作大小不均。然后您希望您的程序最大限度地识别并行机会,并让编译器/运行时系统选择在实际处理器上并行运行的程序。要使其工作,您必须有偷功调度程序。如果C#有,则不知道。
Parallel.For (0, 100, i =>
{
    Parallel.For (0, 50, j => Foo (i, j));   // Sequential would be better
});