Richtiger Weg, um eine Parallele zu machen. Um Daten aus dem Array zu berechnen

wollen: Summe x und Summe x * x. Wobei x = Linie [i]. Da mehr als ein Thread in "sumAll" und "sumAllQ" lesen / schreiben möchte, muss ich seinen Zugriff sperren. Das Problem ist, dass die Sperre die Dinge hier serialisiert. Ich würde diese Operation in # "Environment.ProcessorCount" für Schleifen aufteilen müssen, wobei jede einen Teil des Arrays summiert und schließlich ihre Ergebnisse summiert. Aber wie kann ich es programmatisch machen?

Beispielcode:

//line is a float[]
Parallel.For(0, line.Length,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
i =>
{
    x = (double)line[i];
    lock (sumLocker)
    {
        sumAll += x;
        sumAllQ += x * x;
    }
});

EDIT 1: Matthew Watson beantwortet Benchmark-Ergebnisse

Zuhause. CPU Core 2 Quad Q9550 bei 2,83 GHz:

Result via Linq:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via loop:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via partition: SumAll=49999950000, SumAllQ=3,333328333335E+15
Via Linq took: 00:00:02.6983044
Via Loop took: 00:00:00.4811901
Via Partition took: 00:00:00.1595113

Auf Arbeit. CPU i7 930 2,8 GHz:

Result via Linq:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via loop:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via partition: SumAll=49999950000, SumAllQ=3,333328333335E+15
Via Linq took: 00:00:01.5728736
Via Loop took: 00:00:00.3436929
Via Partition took: 00:00:00.0934209

Antworten auf die Frage(2)

Ihre Antwort auf die Frage