2017-05-14 47 views
0
class CustomData 
    { 
     public int TNum; 
     public int TResult; 
    } 

    public static int F_recursion(int n, int w) 
    { 
     if (n == 0 || w == 0) 
      return 0; 
     else if (s[n] > w) 
      return F_recursion(n - 1, w); 
     else 
     { 
      return Math.Max(F_recursion(n - 1, w), p[n] + F_recursion(n - 1, w - s[n])); 
     } 
    } 

    public static int F_recursion2(int n, int w) 
    { 
     int numba = 0; 
     int countCPU = 8; 
     Task[] tasks = new Task[countCPU]; 
      for (var j = 0; j < countCPU; j++) 
      tasks[j] = Task.Factory.StartNew(
       (object p) => 
       { 
       var data = p as CustomData; if (data == null) return; 
        data.TResult = F_recursion(n - data.TNum, w); 
       }, 
      new CustomData() { TNum = j }); 
      Task.WaitAll(tasks); 
      numba = (tasks[0].AsyncState as CustomData).TResult 
      + (tasks[1].AsyncState as CustomData).TResult 
      + (tasks[2].AsyncState as CustomData).TResult 
      + (tasks[3].AsyncState as CustomData).TResult; 

     return numba; 
    } 

我怎样才能使F_recursion2方法并行工作?我的代码目前的结果是c#中的并行递归

Time in milliseconds for recursion: 1,075 
recursion( 150) =  7,237 
Time in milliseconds for parallel recursion: 1,581 
recursion( 150) = 28,916 

正如你可以看到平行的方式打印4次比较大的数字,它需要更多的时间来计算这没有任何意义。我怎么能解决这个递归可以并行工作的问题?

编辑将循环更改为并行。对于与上述结果相同的结果。

public static int F_recursion2(int n, int w) 
    { 
     int numba = 0; 
     int countCPU = 8; 
     Task[] tasks = new Task[countCPU]; 
     Parallel.For(0, countCPU, j => 
     { 
      tasks[j] = Task.Factory.StartNew(
       (object p) => 
       { 
        var data = p as CustomData; if (data == null) return; 
        data.TResult = F_recursion(n - data.TNum, w); 
       }, 
      new CustomData() { TNum = j }); 
     }); 
     Task.WaitAll(tasks); 
     numba = (tasks[0].AsyncState as CustomData).TResult 
     + (tasks[1].AsyncState as CustomData).TResult 
     + (tasks[2].AsyncState as CustomData).TResult 
     + (tasks[3].AsyncState as CustomData).TResult; 

     return numba; 
    } 
+0

所以,你应该并行删除Task.Factory! – OmG

+0

“F_recursion2”是否意图成为“F_recursion”的并行版本? – PetSerAl

+0

是的,它应该与F_recursion并行 – Simas

回答

0

我想到的解决方案是使用Parallel.For。为此,您应该使用Parallel.For实施for。要查看示例,请访问here

+0

我改为循环到Paralle.For但它仍然打印相同的结果 – Simas

+0

因此,分享你的'Paralell.For'代码版本,考虑。 – OmG