无论是否使用PLINQ,我如何将其并行化?

时间:2012-12-12 00:16:11

标签: c# linq parallel-processing plinq

我有以下代码段:

// 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#中并行化这个循环的好方法是什么?

1 个答案:

答案 0 :(得分:4)

以下是两种方法:

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

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

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