2017-05-14 11 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メソッドを並列に動作させることができますか?私のコードを使用すると、パラレルアプローチプリント4倍大きい数を見ることができるように、現在の結果がCでの並列再帰

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

であり、それは意味を成さない計算に時間がかかります。再帰が並行して機能するように、この問題にどのようにアプローチできますか?

EDITループをParallelに変更しました。上記と同じ結果が得られました。 Parallel.Forを使用している私の心に来るソリューションに

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を使用してforを実装するだけです。例を見るには、hereをご覧ください。

+0

ループをParalle.Forに変更しましたが、同じ結果が表示されます – Simas

+0

したがって、Paralell.Forコードバージョンを共有して、 。 – OmG