2010-04-30 7 views
6

Ich frage mich über NVIDIAs cuBLAS-Bibliothek. Hat jemand Erfahrung damit? Wenn ich zum Beispiel ein C-Programm mit BLAS schreibe, kann ich die Aufrufe von BLAS durch Aufrufe von cuBLAS ersetzen? Oder noch besser einen Mechanismus implementieren, mit dem der Benutzer zur Laufzeit wählen kann?BLAS und CUBLAS

Was ist, wenn ich die von Boost mit C++ zur Verfügung gestellte BLAS-Bibliothek verwende?

Antwort

1

CUBLAS umschließt BLAS nicht. CUBLAS greift auch auf Matrizen in einer übergeordneten Reihenfolge zu, z. B. einige Fortran-Codes und BLAS.

Ich bin mehr daran gewöhnt, Code in C zu schreiben, auch für CUDA. Ein mit CBLAS geschriebener Code (ein C-Wrapper von BLAS) kann leicht in einen CUDA-Code umgewandelt werden. Beachten Sie, dass Fortran-Codes, die BLAS verwenden, sich stark von C/C++ - Codes unterscheiden, die CBLAS verwenden. Fortran und BLAS speichern normalerweise Matrizen oder Doppelarrays in der Reihenfolge der Spaltenmajorität, , aber C/C++ behandelt normalerweise die Reihenfolge der Zeilen. ich Griff normalerweise dieses Problem zu schreiben, die Matrizen in einem 1D-Arrays zu speichern, und verwenden #define ein Makro Toa Zugang das Element i, j einer Matrix als schreiben:

/* define macro to access Aij in the row-wise array A[M*N] */ 
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M */ 
/* define macro to access Aij in the col-wise array A[M*N] */ 
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

cblas Bibliothek hat eine gut Parameter organisieren und Konventionen (const enum Variablen) , um jeder Funktion die Reihenfolge der Matrix zu geben. Beachten Sie, dass auch die Speicherung von Matrizen variiert, eine zeilenweise gebänderte Matrix wird nicht wie eine spaltenweise Bandmatrix gespeichert.

Ich glaube nicht, dass es Mechanismen gibt, die dem Benutzer erlauben, zwischen der Verwendung von BLAS oder CUBLAS zu wählen, ohne den Code zweimal zu schreiben. CUBLAS hat auch in den meisten Funktionsaufrufen eine "handle" Variable, die nicht auf BLAS erscheint. ich von #define, um den Namen bei jedem Funktionsaufruf zu ändern, aber dies funktioniert möglicherweise nicht.

0

Ich habe BLAS-Code nach CUBLAS portiert. Die BLAS-Bibliothek, die ich benutze, ist ATLAS, also kann das, was ich sage, nur bis zur Auswahl der BLAS-Bibliothek korrekt sein.

ATLAS BLAS erfordert, dass Sie angeben, wenn Sie die Reihenfolge der Hauptspalte oder der Hauptspalte der Spalte verwenden, und ich habe die Hauptspalte für die Spalte ausgewählt, seit ich CLAPACK verwendet habe. LAPACKE dagegen würde Reihenreihenfolge verwenden. CUBLAS ist Spaltenhauptbestellung. Sie müssen möglicherweise entsprechend anpassen.

Auch wenn die Bestellung kein Problem ist, war die Portierung auf CUBLAS keineswegs ein Ersatz. Das größte Problem ist, dass Sie die Daten in den Speicherbereich der GPU verschieben müssen. Dieser Speicher wird mit cudaMalloc() eingerichtet und mit cudaFree() freigegeben, was wie erwartet funktioniert. Sie verschieben Daten mit cudaMemcpy() in den GPU-Speicher. Die Zeit, um dies zu tun, wird ein wichtiger Faktor sein, wenn es sich lohnt, von CPU zu GPU zu wechseln.

Sobald dies jedoch getan wird, sind die Anrufe ziemlich ähnlich. Aus CblasNoTrans wird CUBLAS_OP_N und aus CblasTrans wird CUBLAS_OP_T. Wenn Ihre BLAS-Bibliothek (wie es ATLAS tut) erlaubt, Skalare nach Wert zu übergeben, müssen Sie das durch Verweis konvertieren (wie es für FORTRAN normal ist).

Vor diesem Hintergrund wäre jeder Schalter, der eine CPU/GPU-Wahl ermöglicht, am leichtesten auf einem höheren Level als innerhalb der Funktion, die BLAS verwendet. In meinem Fall habe ich CPU- und GPU-Varianten des Algorithmus und wähle sie auf einer höheren Ebene, abhängig von der Größe des Problems.

5

Die Antwort von janneb ist falsch, cuBLAS ist nicht ein Drop-in Ersatz für eine CPU BLAS. Es wird davon ausgegangen, dass sich Daten bereits auf dem Gerät befinden und die Funktionssignaturen einen zusätzlichen Parameter besitzen, um einen cuBLAS-Kontext zu verfolgen.

In CUDA 6.0 kommt jedoch eine neue Bibliothek namens NVBLAS, die genau diese "Drop-in" -Funktionalität bietet. Es fängt Level3-BLAS-Aufrufe (GEMM, TRSV, usw.) ab und sendet sie automatisch an die GPU, wodurch die PCIE-Übertragung effektiv mit On-GPU-Berechnungen gekachelt wird.

Es gibt einige Informationen hier: https://developer.nvidia.com/cublasxt, und CUDA 6.0 ist für CUDA registrierte Entwickler heute verfügbar.

Die vollständigen Dokumente werden online sein, sobald CUDA 6.0 veröffentlicht wird.

Verwandte Themen