Matrix inversion in OpenCL
Ich versuche zu beschleunigen, einige Berechnungen mit OpenCL und Teil des Algorithmus besteht in der Invertierung einer matrix. Gibt es eine open-source-Bibliothek oder frei verfügbare code zur Berechnung lu-Faktorisierung (lapack dgetrf und dgetri) der matrix oder Allgemeine inversion geschrieben in OpenCL oder CUDA? Die matrix ist real und Platz, aber keine anderen speziellen Eigenschaften außerdem. Bisher habe ich es geschafft, nur basic-blas matrix-Vektor-Operationen-Implementierungen auf der gpu.
Die matrix ist ziemlich klein, nur etwa 60-100 Zeilen und Spalten, so könnte es sein, schneller berechnet auf die cpu, aber es wird irgendwie in der Mitte des Algorithmus, so hätte ich es zu übertragen, zu hosten, berechnen Sie die inverse, und übertragen Sie dann das Ergebnis wieder auf das Gerät, wo es dann in viel größeren Berechnungen.
- Sie sollten auch beachten, dass das invertieren einer matrix eine teure operation sein kann, insbesondere für große Matrizen, und sehr oft gibt es eine alternative Möglichkeit zur Lösung des Problems bei der hand. LU-ZERLEGUNG ist ein "Baustein", dass kann verwendet werden, um zu vermeiden, tun eine echte inverse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nicht eine Implementierung in Open-CL, aber beide "Numerical Recipes" und Gil Strang ist "In der Angewandten Mathematik" haben wunderbare Erklärungen, die wäre einfach zu code. "NR" ist C-code, den Sie anpassen konnte.
Dies ist falsch. Sie sind nicht der Berechnung einer inverse mit LR-ZERLEGUNG, Sie sind in der ZERLEGUNG der matrix. Wenn Sie wollten, dass die inverse, die Sie würde tun müssen, forward-back-substitution mit einer Reihe von einheitsvektoren. Es ist ein kleiner aber wichtiger Unterschied.
Blick auf ViennaCL: http://viennacl.sourceforge.net/
Überprüfen CULA
http://www.culatools.com/
http://www.culatools.com/versions/basic
Ich weiß das ist ziemlich spät, aber wenn Sie versuchen zu tun, alle matrix-Berechnungen auf eine matrix, die kleine (60-100 Zeilen), dann die Berechnungen viel schneller von der CPU anstatt GPU weil die Zeit, die es braucht, um kopieren Sie die Daten vom Hauptspeicher auf die GPU zu Gedenken. Wenn Sie wollen, um dies zu tun, dann würde ich vorschlagen, Blick in eine parallele Sprache, wie z.B. OpenMP oder MPI, da diese erlauben würde, Sie zu parallelisieren code, um die Geschwindigkeit der Berechnungen auf die CPU.
Ich machen, die Rechnung bis zu 2k x 2k bei CPU über den Multi-Thread-mit eigen lib, also es ist jetzt 3.5-3.65-mal schneller (hängt von Größe der matrix) als mit einem thread.
Ich habe eine Intel Xeon 3,5 Ghz E5-1620 v3 Prozessor und 16Gb ram. (Leider habe ich gelöscht, die alte version hinzufügen genauen Werte, aber wenn hat Priorität, ich könnte schreiben Sie die sw)
Dies ist meine matrix inverse Algorithmus, den ich verwendet, zu vergleichen mit. (Es ist richtig, wie gesagt, eine Menge von tests, die wieder excel-Ergebnis):
Die ursprüngliche Frage (jetzt 7 Jahre alt) tatsächlich gelöst wurde 4 Jahre später in einem Papier beschreiben, matrix inversion in CUDA auf der Grundlage von Gauss-Jordan. Er versucht, zum verteilen der Berechnungen auf verschiedene threads, und gibt detaillierte performance-Hinweise für Matrizen von bis zu 2048 in der Größe.
Zwar nicht OpenCL, die Allgemeinen Ideen übersetzen von CUDA ganz einfach.