2012-10-24 102 views
7

CUDA運行時具有便利功能cudaGetErrorString(cudaError_t error),它將錯誤枚舉轉換爲可讀的字符串。 cudaGetErrorString用於許多人用於CUDA錯誤處理的宏CUDA_SAFE_CALL(someCudaFunction())用於cuBLAS的cudaGetErrorString的等價物?

我與CUBLAS現在熟悉自己,我想創建一個宏類似於CUDA_SAFE_CALL的CUBLAS。爲了使我的宏的打印輸出有用,我想在cuBLAS中有類似於cudaGetErrorString的東西。

是否存在的cudaGetErrorString()在CUBLAS等效?或者,有任何cuBLAS用戶編寫這樣的功能?

回答

6

在CUDA 5.0,假設你安裝了樣本,還有一個文件.... /樣品/普通/ INC/helper_cuda.h其具有以下:

#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 

有可能是在CUDA SDK(樣品)的早期版本類似的東西。如果你問這個問題,這並不是爲了回答「內置的東西」的問題,而是回答你的問題:「是否有任何cuBLAS用戶編寫了這樣的功能?」

+0

幻想!我在我的答案中自己寫了大致相同的代碼。 :) – solvingPuzzles

+0

據我所知,沒有這樣的功能。我會建議通過NVIDIA錯誤報告系統提交功能請求(稱爲RFE =增強請求)。 – njuffa

2

我仍然好奇是否有一種內置的方式來獲取錯誤字符串在cuBLAS,但我現在寫了我自己的

按照cuBLAS Guide的第8.1節中只有8 CUBLAS類型cublasError_t值。 我打印出來......

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

打印輸出:

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 

我的函數來獲取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

你'cublasGetErrorString'是*非常*不好的編程習慣。你不應該只用名字來引用一個枚舉值。使用枚舉的全部重點是將值抽象出來。 NVIDIA可能決定明天更改枚舉值,並且代碼將會中斷,而[此代碼](http://stackoverflow.com/a/13041801/681865)不會。 – talonmies

+0

好點。我修好了它! – solvingPuzzles