簡體   English   中英

C#中的並行遞歸

[英]Parallel recursion in c#

    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方法並行工作? 用我的代碼當前結果是

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

如您所見,並行方法打印的數字是原來的4倍,並且需要花費更多的時間來計算,這是沒有意義的。 我如何解決遞歸並行運行的問題?

編輯將for循環更改為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;
    }

我想到的解決方案是使用Parallel.For 要做到這一點,你應該只是實現for使用Parallel.For 要查看示例,請訪問此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM