2012-10-24 18 views
7

Środowisko wykonawcze CUDA ma funkcję wygody cudaGetErrorString(cudaError_t error), która tłumaczy wyliczenie błędu na czytelny ciąg znaków. cudaGetErrorString jest używane w makrze CUDA_SAFE_CALL(someCudaFunction()), którego wiele osób używa do obsługi błędów w CUDA.Odpowiednik cudaGetErrorString dla cuBLAS?

Poznaję teraz cuBLAS i chciałbym stworzyć makro podobne do CUDA_SAFE_CALL dla cuBLAS. Aby wydruki mojego makra były przydatne, chciałbym mieć coś podobnego do cudaGetErrorString w cuBLAS.

Czy istnieje odpowiednik cudaGetErrorString() w cuBLAS? Czy też użytkownicy cuBLAS napisali taką funkcję?

Odpowiedz

6

W CUDA 5.0, zakładając, że zainstalowane próbek znajduje się plik ..../samples/common/inc/helper_cuda.h, który ma:

#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 

Prawdopodobnie jest coś podobnego we wcześniejszych wersjach SDK CUDA (Sample). To nie jest odpowiedź na pytanie "czy coś jest wbudowane", jeśli o to prosiłeś, ale w odpowiedzi na twoje pytanie "czy użytkownicy cuBLAS napisali taką funkcję?"

+0

Fantasic! Skończyłem na tym, że napisałem mniej więcej ten sam kod w mojej odpowiedzi. :) – solvingPuzzles

+0

Według mojej wiedzy nie ma takiej funkcji. Proponowałbym złożenie wniosku o funkcję (znanego jako RFE = żądanie rozszerzenia) za pośrednictwem systemu zgłaszania błędów NVIDIA. – njuffa

2

Wciąż jestem ciekawy, czy istnieje wbudowany sposób, aby uzyskać ciągi błędów w cuBLAS, ale Napisałem na razie swój własny.

Zgodnie z rozdziałem 8.1 cuBLAS Guide w cuBLAS występuje tylko 8 typów wartości cublasError_t. wydrukowałem je ...

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); 

Wydruk:

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 

Moja funkcja aby uzyskać ciąg błędu cuBLAS:

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

Twoja 'cublasGetErrorString' jest * bardzo * złą praktyką programowania. Nigdy nie powinieneś odnosić się do enum według wartości, tylko po imieniu. Cały punkt używania wyliczenia polega na tym, że wartości są pomijane. NVIDIA może podjąć decyzję o zmianie wartości wyliczenia na jutro, a twój kod zostanie zerwany, natomiast [ten kod] (http://stackoverflow.com/a/13041801/681865) nie będzie. – talonmies

+0

Dobra uwaga. Naprawiłem to! – solvingPuzzles