2010-12-14 11 views
1

Was ist die schnellste und effizienteste Möglichkeit, alle Matrixelemente parallel in .net 4.0 zusammenzufassen?beste Methode zum Zusammenfassen von Matrixelementen parallel in C#

mit Parallel.Für Ende in innere Schleife, die Sperre (ObjektLock) {Ergebnis + = Matrix [i, j]} ist 2 mal langsamer als sequenzielle Annäherung.

Dank für Hinweise, bye

+2

'Sperre' blockiert effektiv Ihren Code, um es zu synchronisieren, so sollte die Verlangsamung erwartet werden. – SWeko

Antwort

1

Nun können Sie parallel Ihren martrix [m, n] zu m-Arrays, deren Länge n und dann addieren Sie die m-Arrays betrachten. Übrigens sollten Sie lock nicht verwenden, verwenden Sie stattdessen Interlocked.Add. Ich bin jetzt beschäftigt, ich werde ein Beispiel schreiben, wenn ich Zeit habe.

-1

Verwenden statische Variablen für i, j und führen ohne Schloss mit

+0

Sie können das Ergebnis nicht mit atomaren Operationen aus mehreren Threads ändern und das korrekte Ergebnis erwarten. Jeder Thread benötigt seinen eigenen Akku und fügt dann alle Akkus mit einem einzigen Thread hinzu. – CodesInChaos

2

ParallelEnumerable.Sum weiß, wie die Summe zu tun, ohne entweder Rast- oder verriegelt Operationen zu benötigen (ich nehme es fasst Teilmengen auf jedem Thread und summiert dann diese Ergebnisse) .

Ihre Matrix Unter der Annahme IEnumerable<IEnumerable<numeric>>:

var sum = (from row in matrix.AsParallel() 
      select row.Sum()).Sum(); 

Die AsParallel bedeutet die Zeilen parallel verarbeitet werden, aber die inneren (Spalte) Summe ist nur Enumerable.Sum (es sei denn, die Zeilen sehr lang sind, wird der Overhead der Parallelität überwältigen alle möglichen Vorteile).

+0

Bearbeite deine Antwort: 'select (row.Sum()). Sum();' um 'row.Sum()). Sum();' –

+0

@Saeed: typo corrected, thanks. – Richard

Verwandte Themen