我有以下代码段:
// 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#中并行化这个循环的好方法是什么?
答案 0 :(得分:4)
以下是两种方法:
data.AsParallel().ForAll(row =>
{
Process(row);
});
Parallel.For(0, data.Length, rowIndex =>
{
Process(data[rowIndex]);
});
在这两种情况下,一维双精度数组都是通过引用传递的,而修改过程方法中的值将修改数据数组。