2016-04-27 16 views
1

Angenommen, Sie eine dichte Matrix der Größe haben 1500x500 und Sie müssen es mit einem Block-Diagonalmatrix der Größe 500x500 multiplizieren, die auf der Diagonalen sitzen zehn Untermatrizen der Größe 50x50 besteht: Manchmal alleWie dichte x Blockdiagonale Matrixmultiplikation in CUDA implementieren?

S 0 ... 0 0 
0 S  0 0 
... 
0 0 ... S 0 
0 0 ... 0 S <- each S is 50x50 

S sind gleich, manchmal nicht.

Ich habe noch kein Profil erstellt, aber ich fühle mich wie eine direkte CUBLAS-Multiplikation würde zu viel Zeit mit den Nullen verschwenden. Gibt es effiziente Möglichkeiten, eine solche Multiplikation zu implementieren?

Antwort

2

Sie können cuSparse mit dem Block Compressed Sparse Zeilenformat wie beschrieben here verwenden. Ihr Matrix-Typ kann von anderen Optimierungen profitieren, aber dieser ist jetzt verfügbar. Alternativ können Sie cublas<>gemmBatchedcublas<>gemmBatched verwenden, indem Sie auf Ihre dichte Matrix zugreifen, indem Sie Zeilen- oder Spaltenblöcke verwenden und Ihre Blockdiagonale als eine Menge kleinerer dichter Matrizen definieren (möglicherweise dieselben Daten wiederverwendend).