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.
Ein Beispiel für sieht so aus:
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.
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.
quelle
Antworten:
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.
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 .
quelle
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:
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.
quelle