2016-04-29 14 views
0

Ich habe eine Wrapper-Klasse CudaMatrix, die mehrere CuBLAS-Operationen implementiert, so dass ich m1.multiply(m2) aufrufen kann, die sgemm Operation auf den internen Datenzeiger ausgeführt wird.Wie implementiert man eine Schnittstelle zu einer Sub-Matrix in CUDA?

Ich mag die Klasse von Operationen auf Submatrizen erweitern, so etwas wie

CudaMatrix a(100,100); 
CudaMatrix b(100,100); 
// fill a and b 

int i=5, j=15; 
CudaSubMatrix sa(a, i, j, i+10, j+10); // sa := a[5:15, 15:25] 

i=50, j=60; 
CudaSubMatrix sb(b, i, j, i+10, j+10); // sb := b[50:60, 60:70]  

CudaMatrix res; 
res.copy(sa); 
res.multiply(sb) // res = sa*sb 

In der letzten Reihe, multiply() muss auf einer Untermatrix sb betreiben, so dass die Zeilen nicht zusammenhängend ist und Ich kann nicht die gleichen sgemm Operationen wie zuvor aufrufen.

Wie implementiere ich eine effiziente Schnittstelle zu Submatrizen, die das explizite Kopieren von Daten vermeidet? Gibt es Open-Source-Implementierungen, nach denen ich suchen kann?

+1

Ich verstehe die Frage nicht. CUBLAS verfügt bereits über alles, was erforderlich ist, um Operationen auf Submatrizen auszuführen, ohne zusätzlichen Schnittstellencode oder Wrapper zu benötigen – talonmies

Antwort

1

Die Multiplikation der Submatrizen kann mit dem LDX-Parameter der API-Aufrufe durchgeführt werden.

Indexing wird am 1.1 DataLayout Abschnitt beschrieben:

#define IDX2C (i, j, ld) (((j) * (ld)) + (i))

dann verwenden, um die cublasSgemm beispielsweise mit lda Parameter gleich der Anzahl der Zeilen

die cuBLAS Bibliothek verwendet column-Hauptspeicher

der ursprünglichen Matrix und m, n, k für die Submatrizen.

Hinweis Indexierung kann in Fortran für C-Indexierungsschema abweichen.

Also was Sie wirklich brauchen, ist die Größe Ihrer Untermatrix (col, Zeilen) und die Größe einer Spalte in der Eingabematrix (die Anzahl der Zeilen).