Ausnutzen von Mustern in der Matrix für eine effiziente Matrix-Vektor-Multiplikation

8

Ich habe die folgende Situation: Ich habe eine Folge von Vektoren und für jeden möchte ich das Produkt berechnen, wobei zu Beginn festgelegt ist. Obwohl es keine Informationen über die Struktur von , hat normalerweise ein bestimmtes Muster, in dem viele Werte wiederholt werden, und ich möchte diese Produkte so schnell wie möglich berechnen.x1,x2,..EINxichEINxichEIN

Ein Beispiel für sieht so aus:EIN

Geben Sie hier die Bildbeschreibung ein

Hier sind die weißen Bereiche 0.

Ich frage mich, ob es eine Möglichkeit gibt, Informationen über speichern oder sie irgendwie zu ändern, um die Anzahl der Vorgänge für jedes Produkt zu reduzieren. Für Zeilen, die alle 0 sind, ist dies trivial - man kann nur die Zeilenangaben speichern, die solche Zeilen anzeigen. Es ist auch möglich, Informationen darüber zu speichern, welche Zeilen dupliziert werden, um Zeilenberechnungen wiederzuverwenden. Ich habe auch darüber nachgedacht, die Zeilen der Matrix so anzuordnen, dass die mittlere Differenz zwischen jeder Zeile minimiert wird und nur die Differenz in jeder Zeile berechnet wird. Dies scheint jedoch bei den komplizierteren Mustern auf Probleme zu stoßen.EIN

Ich habe mich gefragt, ob es bekannte Methoden für diese Art von Problemen gibt.

Edit: Eine andere Idee, die ich hatte, ist, dass seit der Nr. Die der eindeutigen Werte in der Matrix ist ziemlich niedrig. Man könnte das Produkt als wobei nur einen eindeutigen Wert enthält, aber ich bin mir immer noch nicht sicher, ob dies einen Vorteil für dieses Problem bieten kann.EINx=EIN1x+EIN2x+EINnxEINich

Slug Pue
quelle
2
xichxich
dddxeinxich1+bxich2+bxich3+einxich4+einxich5=ein(xich1+xich4+xich5)+b(xich2+xich3)
1
EIN1,EIN2,
1
Verwenden Sie jetzt Blas, um sich ein Bild zu machen?
Mauro Vanzetto
1
Und wie macht man das Produkt? Ich versuche eine praktische Überlegung anzustellen. Die direkte oder indirekte Verwendung von Blas durch eine andere Bibliothek ermöglicht die nahezu optimale Verwendung Ihrer Hardware (was mit einem benutzerdefinierten Matrixvektorprodukt sehr schwer zu erreichen ist). Also vielleicht mit dem Einsatz von Blas können Sie eine große Geschwindigkeit Archivierung mit begrenztem Aufwand auf.
Mauro Vanzetto

Antworten:

3

Ich schlage einen anderen Standpunkt vor. Vielleicht können Sie mit einer cleveren Matrixmultiplikation eine Verbesserung der Leistung erzielen, aber es gibt mehr als eine Möglichkeit, dass Sie kleine Ergebnisse erzielen, wenn Sie den Aufwand respektieren.

138×78

Es ist sehr schwierig, für uns nahezu unmöglich zu sein und zu versuchen, die beste Leistung in Bezug auf die Blas-Funktion zu erzielen. Die klassischen Beispiele sind die verschachtelten Schleifen. Zum Beispiel macht der Atlas eine bestimmte Implementierung von Blas, wenn installiert, eine automatische Optimierung über die Hardware (siehe dieses PDF ).

Aus diesem Grund ist der erste Vorschlag, den ich Ihnen sage, der Versuch, eine Blas-Bibliothek zu verwenden. Auf der vorherigen Wiki-Seite finden Sie eine Liste, es gibt kommerzielle oder kostenlose, hier hängt von Ihnen ab (vielleicht können Sie mit OpenBlas beginnen). Beachten Sie, dass es auch Bibliotheken gibt, die Blas verwenden, und die komfortabler sind.

Wenn dies nicht ausreicht, versuchen Sie es auf andere Weise, aber denken Sie daran, Blas für die Multiplikation zu verwenden.

Der Fall ist anders, wenn die Anzahl der Nullelemente immer größer wird, nein, dies ist der Fall, um eine Vorstellung von etwa 90% zu geben. Hier haben Sie eine spärliche Matrix und können verschiedene Speichermethoden verwenden, um einen Vorteil zu erzielen. Beachten Sie, dass Sie auch in diesem Fall spärliche Blas finden können .

Mauro Vanzetto
quelle
Ich stimme dieser Antwort voll und ganz zu, insbesondere was das betrifft, was zuerst versucht werden soll. Ausgehend von einem dichten Matrixvektorprodukt unter Verwendung einer hochoptimierten linearen Algebra-Bibliothek ist es eine gute Sache, und später können Sie alle cleveren Techniken, die Sie sich einfallen lassen, damit vergleichen. Bei Bedarf und Wunsch.
Anton Menshov
0

Haftungsausschluss: Ich habe keine Ahnung, ob dies Ihre Berechnung tatsächlich beschleunigt, da dies einen erheblichen Rechenaufwand bedeutet. Da Ihre Matrix anscheinend nicht sehr spärlich ist, ist es schwer vorstellbar, eine BLAS- Implementierung wie Intel MKL zu schlagen .


Das heißt, hier ist eine Idee:

EINichEINJ.EINx

Wenn Sie einige Werte in der Matrix haben, die keine Duplikate enthalten, können Sie sie alle in eine herkömmliche Sparse-Matrix werfen und das MVP auf die "normale" Sparse-Matrix-Weise ausführen.

xich

LedHead
quelle