ein schneller Algorithmus zur Berechnung der Matrixmultiplikation

7

In der Mitte eines C ++ - Codes, Eclipse, muss ich die Multiplikation der Matrizen A und B mit der Größe 2400 * 3600 berechnen (also sind die Dimensionen nicht gleich). Die Matrizen werden in zweidimensionalen Float-Arrays gespeichert. Sie sind nicht spärlich, keine Einschränkungen.

Jede Multiplikation dauert so lange (mehrere Minuten), und ich muss sie wirklich reduzieren, weil ich eine Schleife habe, die sich 50 Millionen Mal wiederholt. und jedes Mal sollte ein neues A und B multipliziert werden. Jede Art von Empfehlung ist willkommen, um die zeitliche Komplexität zu reduzieren. (Ändern Sie sogar die Struktur der Speicherung der Daten, wenn Sie denken, dass das helfen könnte). Was passiert zum Beispiel, wenn ich die Daten in eindimensionalen Arrays speichere? Oder Vektoren anstelle von Arrays verwenden?

In einem bestimmten Fall ist die erste Spalte immer 1 und die Werte sind entweder 1, -1 oder Null. Irgendeine Idee für diesen Fall?
In anderen Fällen können die Werte irgendeine Sache sein. ** Eine dieser Multiplikationen ist X multipliziert mit seiner Transponierten. Gibt es eine Empfehlung zu diesem speziellen?

    
Pegah 05.06.2011, 23:29
quelle

4 Antworten

13

Ich würde nicht herumalbern und versuchen, mein eigenes zu schreiben: Google für LAPACK oder BLAS, zwei bewährte Pakete für das numerische Rechnen, beide auf den N-ten Grad optimiert. Beide haben C-APIs, die Sie verwenden können.

    
Ernest Friedman-Hill 05.06.2011, 23:36
quelle
8

Es wird definitiv helfen, Ihre zweite transponierte Matrix zu speichern, so dass Spalten mit Cache-Zeilen anstelle von Zeilen übereinstimmen. Der Unterschied in der Zugriffszeit zwischen L2-Cache und Hauptspeicher ist ein Faktor von 10 oder so.

    
Ben Voigt 06.06.2011 00:12
quelle
2

Sie könnten Eigen ausprobieren.

    
genpfault 06.06.2011 01:06
quelle
1

Wenn Sie von Millionen von Multiplikationen sprechen, wende ich mich zuerst an etwas wie CUDA oder DirectCompute, um die Arbeit auf die GPU zu laden, was viel besser für diese Art von Sachen geeignet ist. Das hat MATLAB gemacht, auch wenn die GPU-Beschleunigung optional ist.

Es gibt unzählige Beispiele für GPU-beschleunigte Matrixmultiplikation, also sollte Ihre Arbeit nicht zu schwer sein.

    
Blindy 05.06.2011 23:39
quelle

Tags und Links