【问题标题】:How do I parallelise this with or without PLINQ?如何在有或没有 PLINQ 的情况下并行化?
【发布时间】:2012-12-12 00:16:10
【问题描述】:

我有以下代码sn-p:

// Initialise rectangular matrix with [][] instead of [,]
double data[][] = new double[m];
for (int i = 0; i < m; i++)
  data[i] = new double[n];

// Populate data[][] here...

// Code to run in parallel:
for (int i = 0; i < m; i++)
  data[i] = Process(data[i]);

如果这是有道理的,我有一个双打矩阵。我需要对矩阵的每一行进行转换。它是“令人尴尬的并行”,因为从一行到另一行的数据没有连接。

如果我这样做:

data.AsParallel().ForAll(row => { row = Process[row]; });

首先,我不知道data.AsParallel()是否知道只看第一个下标,还是会枚举所有m * n个双精度数。其次,由于row 是我正在枚举的元素,我不知道是否可以这样更改它 - 我怀疑不会。

那么,不管有没有 PLINQ,在 C# 中并行化这个循环的好方法是什么?

【问题讨论】:

    标签: c# linq parallel-processing plinq


    【解决方案1】:

    这里有两种方法:

            data.AsParallel().ForAll(row =>
            {
                Process(row);
            });
    
            Parallel.For(0, data.Length, rowIndex =>
            {
                Process(data[rowIndex]);
            });
    

    在这两种情况下,一维双精度数组都是通过引用传递的,修改 Process 方法中的值将修改数据数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多