2017-05-14 66 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