Ich schrieb zwei Matrixklassen in Java, nur um die Leistung ihrer Matrixmultiplikationen zu vergleichen. Eine Klasse (Mat1) speichert ein double[][] A
Mitglied, wobei die Zeile i
der Matrix A[i]
ist. Die andere Klasse (Mat2) speichert A
und T
, wobei T
die Transponierte A
ist.Warum ist die Leistung dieser Matrixmultiplikationen so unterschiedlich?
Nehmen wir an, wir haben eine quadratische Matrix M und wir wollen das Produkt von M.mult(M)
. Rufen Sie das Produkt P
.
Wenn M ein Mat1 Beispiel verwendet der Algorithmus die einfach war:
P[i][j] += M.A[i][k] * M.A[k][j]
for k in range(0, M.A.length)
In dem Fall, wo M ein Mat2 I verwendet:
P[i][j] += M.A[i][k] * M.T[j][k]
, die der gleiche Algorithmus ist, weil T[j][k]==A[k][j]
. Bei 1000x1000 Matrizen dauert der zweite Algorithmus ungefähr 1,2 Sekunden auf meinem Rechner, während der erste mindestens 25 Sekunden dauert. Ich hatte erwartet, dass der zweite schneller sein würde, aber nicht so sehr. Die Frage ist, warum ist es so viel schneller?
Meine einzige Vermutung ist, dass die zweite die CPU-Caches besser ausnutzt, da Daten in Chunks größer als 1 Wort in die Caches gezogen werden, und der zweite Algorithmus profitiert davon, indem er nur Zeilen durchläuft, während der erste ignoriert Die Daten werden in die Caches gezogen, indem sie sofort in die darunter liegende Zeile gehen (was ~ 1000 Wörter im Speicher ist, da Arrays in der Reihenfolge der Zeilen gespeichert sind), wobei keines der Daten zwischengespeichert wird.
Ich fragte jemanden und er dachte, es sei wegen der freundlicheren Speicherzugriffsmuster (d. H. Dass die zweite Version in weniger weichen TLB-Fehlern resultieren würde). Ich habe überhaupt nicht daran gedacht, aber ich kann sehen, wie es zu weniger TLB-Fehlern kommt.
Also, was ist das? Oder gibt es einen anderen Grund für den Leistungsunterschied?
http://en.wikipedia.org/wiki/Locality_of_reference –
glaube ich diesen Stapel-Austausch [Vorschlag] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "code review") könnte für Sie von Interesse sein. Wenn es Ihre Unterstützung zeigt und helfen Sie es in die Beta zu bekommen. – greatwolf