Wir müssen Kovarianzmatrizen mit Größen von bis 100000 × 100000 berechnen . Wir haben Zugriff auf GPUs und Cluster und fragen uns, was der beste parallele Ansatz ist, um diese Berechnungen zu beschleunigen.
matrix
parallel-computing
gpu
Mach den Weg frei
quelle
quelle
Antworten:
Als erstes müssen Sie erkennen, dass Sie dies mit BLAS tun können. Wenn Ihre Datenmatrix (jedes x ist ein Spaltenvektor, der einer Messung entspricht; Zeilen sind Versuche), dann können Sie die Kovarianz wie folgt schreiben: C i j = E [ x i , x j ] - E [ x i ] E. [ x j ] = 1X.= [ x1x2x3. . . ] ∈ R.m × n x
Wir können dies schreiben als:
C=1
Ihre Daten- und Ergebnismatrizen können etwa 64 GB groß sein, sodass Sie nicht auf einen einzelnen Knoten oder die GPUs eines Knotens passen. Für einen Nicht-GPU-Cluster sollten Sie sich PBLAS ansehen , das sich wie ein Scalapack anfühlt. Für GPUs sind Bibliotheken mit mehreren Knoten noch nicht ganz vorhanden. Magma hat eine zugrunde liegende parallele BLAS-Implementierung, die jedoch möglicherweise nicht benutzerfreundlich ist. Ich denke, CULA macht noch keine Multi-Node, aber es ist etwas, das man im Auge behalten sollte. CUBLAS ist ein Einzelknoten .
Ich würde auch vorschlagen, dass Sie die Parallelität unbedingt selbst implementieren, insbesondere wenn Sie mit MPI vertraut sind und dies in eine vorhandene Codebasis einbinden müssen. Auf diese Weise können Sie einfach zwischen CPU und GPU BLAS wechseln und mit den Daten genau dort beginnen und enden, wo Sie sie möchten. Sie sollten nicht mehr als ein paar MPI_ALLREDUCE- Aufrufe benötigen .
quelle
Ich habe die von @Max Hutchinson gegebene Formel mit CUBlas und Cuda Thrust implementiert und mit Online-Tools zur Berechnung der Varianz verglichen. Es scheint, als würde ich gute Ergebnisse erzielen. Der folgende Code ist für QDA Bayes geplant. Die angegebene Matrix kann also mehr als eine Klasse enthalten. Es werden also mehrere Co-Varianz-Matrizen berechnet. Ich hoffe, es wird für jemanden nützlich sein.
quelle