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