1

次のコードスニペットがあります。

// 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]);

これが理にかなっている場合、私はdoubleの行列を持っています。行列の個々の行に変換を適用する必要があります。ある行から別の行へのデータの接続がないため、これは「驚異的並列」です。

私が次のようなことをした場合:

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

まず第一にdata.AsParallel()、最初の添え字だけを見ることを知っているのか、それともすべてのm *ndoublesを列挙するのかわかりません。第二に、row私が列挙している要素なので、このように変更できるかどうかわかりません-私はそうは思わない。

では、PLINQの有無にかかわらず、C#でこのループを並列化するための良い方法は何ですか?

4

1 に答える 1

4

これを行うには、次の 2 つの方法があります。

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

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

どちらの場合も、double の 1 次元配列は参照によって渡され、Process メソッドで値を変更すると、データ配列が変更されます。

于 2012-12-12T00:45:29.647 に答える