2012-10-24 11 views
7

CUDA Runtime verfügt über eine Komfortfunktion cudaGetErrorString(cudaError_t error), die eine Fehleraufzählung in eine lesbare Zeichenfolge übersetzt. cudaGetErrorString wird im Makro CUDA_SAFE_CALL(someCudaFunction()) verwendet, das von vielen Benutzern für die CUDA-Fehlerbehandlung verwendet wird.Entspricht cudaGetErrorString für cuBLAS?

Ich mache mich jetzt vertraut mit cuBLAS, und ich möchte ein Makro ähnlich CUDA_SAFE_CALL für cuBLAS erstellen. Um die Ausdrucke meines Makros nützlich zu machen, möchte ich etwas analoges zu cudaGetErrorString in cuBLAS haben.

Gibt es ein Äquivalent von cudaGetErrorString() in cuBLAS? Oder haben irgendwelche cuBLAS-Benutzer eine solche Funktion geschrieben?

Antwort

6

In CUDA 5.0, vorausgesetzt, Sie die Proben installiert , es gibt eine Datei ..../samples/common/inc/helper_cuda.h, die folgendes hat:

#ifdef CUBLAS_API_H_ 
// cuBLAS API errors 
static const char *_cudaGetErrorEnum(cublasStatus_t error) 
{ 
    switch (error) 
    { 
     case CUBLAS_STATUS_SUCCESS: 
      return "CUBLAS_STATUS_SUCCESS"; 

     case CUBLAS_STATUS_NOT_INITIALIZED: 
      return "CUBLAS_STATUS_NOT_INITIALIZED"; 

     case CUBLAS_STATUS_ALLOC_FAILED: 
      return "CUBLAS_STATUS_ALLOC_FAILED"; 

     case CUBLAS_STATUS_INVALID_VALUE: 
      return "CUBLAS_STATUS_INVALID_VALUE"; 

     case CUBLAS_STATUS_ARCH_MISMATCH: 
      return "CUBLAS_STATUS_ARCH_MISMATCH"; 

     case CUBLAS_STATUS_MAPPING_ERROR: 
      return "CUBLAS_STATUS_MAPPING_ERROR"; 

     case CUBLAS_STATUS_EXECUTION_FAILED: 
      return "CUBLAS_STATUS_EXECUTION_FAILED"; 

     case CUBLAS_STATUS_INTERNAL_ERROR: 
      return "CUBLAS_STATUS_INTERNAL_ERROR"; 
    } 

    return "<unknown>"; 
} 
#endif 

In früheren Versionen des CUDA SDK (Samples) ist wahrscheinlich etwas Ähnliches. Dies ist keine Antwort auf eine Frage "Ist etwas eingebaut", wenn Sie das gefragt haben, aber als Antwort auf Ihre Frage "haben irgendwelche cuBLAS Benutzer eine Funktion wie diese geschrieben?"

+0

Fantasisch! Am Ende schrieb ich ungefähr denselben Code in meiner Antwort. :) – solvingPuzzles

+0

Meiner Kenntnis nach gibt es keine solche Funktion. Ich würde vorschlagen, eine Feature-Anfrage (bekannt als ein RFE = Antrag auf Verbesserung) durch das NVIDIA-Fehlermeldesystem zu archivieren. – njuffa

2

Ich bin immer noch neugierig, ob es eine eingebaute Möglichkeit gibt, Fehlerzeichenfolgen in CuBLAS zu bekommen, aber Ich schrieb meine eigene für jetzt.

Gemäß Abschnitt 8.1 der cuBLAS Guide gibt es nur 8 Arten von cublasError_t -Werten in cuBLAS. ich sie gedruckt ...

printf("CUBLAS_STATUS_SUCCESS = %d \n", CUBLAS_STATUS_SUCCESS); 
printf("CUBLAS_STATUS_NOT_INITIALIZED = %d \n", CUBLAS_STATUS_NOT_INITIALIZED); 
printf("CUBLAS_STATUS_ALLOC_FAILED = %d \n", CUBLAS_STATUS_ALLOC_FAILED); 
printf("CUBLAS_STATUS_INVALID_VALUE = %d \n", CUBLAS_STATUS_INVALID_VALUE); 
printf("CUBLAS_STATUS_ARCH_MISMATCH = %d \n", CUBLAS_STATUS_ARCH_MISMATCH); 
printf("CUBLAS_STATUS_MAPPING_ERROR = %d \n", CUBLAS_STATUS_MAPPING_ERROR); 
printf("CUBLAS_STATUS_EXECUTION_FAILED = %d \n", CUBLAS_STATUS_EXECUTION_FAILED); 
printf("CUBLAS_STATUS_INTERNAL_ERROR = %d \n", CUBLAS_STATUS_INTERNAL_ERROR); 

Der Ausdruck:

CUBLAS_STATUS_SUCCESS = 0 
CUBLAS_STATUS_NOT_INITIALIZED = 1 
CUBLAS_STATUS_ALLOC_FAILED = 3 
CUBLAS_STATUS_INVALID_VALUE = 7 
CUBLAS_STATUS_ARCH_MISMATCH = 8 
CUBLAS_STATUS_MAPPING_ERROR = 11 
CUBLAS_STATUS_EXECUTION_FAILED = 13 
CUBLAS_STATUS_INTERNAL_ERROR = 14 

Meine Funktion der cuBLAS Fehlerstring zu erhalten:

const char* cublasGetErrorString(cublasStatus_t status) 
{ 
    switch(status) 
    { 
     case CUBLAS_STATUS_SUCCESS: return "CUBLAS_STATUS_SUCCESS"; 
     case CUBLAS_STATUS_NOT_INITIALIZED: return "CUBLAS_STATUS_NOT_INITIALIZED"; 
     case CUBLAS_STATUS_ALLOC_FAILED: return "CUBLAS_STATUS_ALLOC_FAILED"; 
     case CUBLAS_STATUS_INVALID_VALUE: return "CUBLAS_STATUS_INVALID_VALUE"; 
     case CUBLAS_STATUS_ARCH_MISMATCH: return "CUBLAS_STATUS_ARCH_MISMATCH"; 
     case CUBLAS_STATUS_MAPPING_ERROR: return "CUBLAS_STATUS_MAPPING_ERROR"; 
     case CUBLAS_STATUS_EXECUTION_FAILED: return "CUBLAS_STATUS_EXECUTION_FAILED"; 
     case CUBLAS_STATUS_INTERNAL_ERROR: return "CUBLAS_STATUS_INTERNAL_ERROR"; 
    } 
    return "unknown error"; 
} 
+3

Ihr 'cublasGetErrorString' ist * sehr * schlechte Programmierpraxis. Sie sollten sich niemals auf ein Enum nach Wert beziehen, nur nach Namen. Der ganze Sinn der Aufzählung besteht darin, dass die Werte abstrahiert werden. NVIDIA könnte entscheiden, die Werte der Enumeration morgen zu ändern, und Ihr Code wird beschädigt, während [dieser Code] (http://stackoverflow.com/a/13041801/681865) nicht wird. – talonmies

+0

Guter Punkt. Ich habe es repariert! – solvingPuzzles