سؤال

I have the following code snippet:

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

If this makes sense, I have a matrix of doubles. I need to apply a transformation to each individual row of the matrix. It is "embarrassingly parallel", as there is no connection for the data from one row to another.

If I do something like:

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

First of all, I don't know whether data.AsParallel() knows to only look at the first subscript, or if it will enumerate all m * n doubles. Secondly, since row is the element I'm enumerating over, I have no idea if I can change it like this - I suspect not.

So, with or without PLINQ, what is a good way to parallelise this loop in C#?

هل كانت مفيدة؟

المحلول

Here are two ways to do it:

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

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

In both cases, the one-dimensional array of doubles is passed by reference and modifying values in your Process method will modify the data array.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top