Betrachten Sie eine Matrix A der Schwimmer der Größe 48x16 und ein Vektor der Schwimmer b der Größe 1x48.schnelle einfache Präzision Matrix Zeiten Vektor Produkt
vorschlagen Bitte einen Weg b × A so schnell wie möglich auf gemeinsame Desktop-Prozessoren der Berechnung (i5/i7).
Hintergrund. Das oben genannte Produkt befindet sich in einer engen Schleife, daher ist eine schnelle Berechnung unerlässlich. Im Moment arbeite ich mit dem folgenden naiven Algorithmus:
inline void Critical(const float A[48][16], const float b[48], float x[16]) const {
for (int u = 0; u < 48; ++u) {
for (int i = 0; i < 16; ++i) {
x[i] += A[u][i] * b[u];
}
}
}
Ich habe versucht, die Vermehrung zu MKL des SGEMV und später SGEMM aber ohne Erfolg abzuladen. Die naive Implementierung funktioniert immer noch schneller auf einem i7 4800MQ.
EDIT1.
Eigen mit statischer Zuordnung ist ungefähr so schnell wie der naive Algorithmus.
Ich habe versucht, GCC5, ICC und VC2015U3 mit Optimierungen eingeschaltet (/ O3, schnelle Mathematik, mtune = native, etc). ICC scheint unter Linux und Windows den schnellsten Code zu produzieren.
EDIT2.
Die Elemente A sind klein, max (| A _ui |) = 256. Ähnlich max (| b _u |) = 1,0. Vernünftig approximative Lösungen sind ebenfalls akzeptabel, solange der Algorithmus schneller ist als der naive.
Sie können sich meine [_Matrix_] (https://github.com/ForceBru/Matrix) -Bibliothek für Operationen mit Matrizen ansehen, um zu sehen, wie dies gemacht werden kann. – ForceBru
@ForceBru Ich betrachte nur Nicht-GPU-Lösungen. – tovugike
@Angew MKL ist eine optimierte BLAS-Implementierung von Intel. – tovugike