2012-10-24 5 views
7

CUDA 런타임에는 오류 열거 형을 읽을 수있는 문자열로 변환하는 편리한 기능 cudaGetErrorString(cudaError_t error)이 있습니다. cudaGetErrorString은 많은 사람들이 CUDA 오류 처리에 사용하는 CUDA_SAFE_CALL(someCudaFunction()) 매크로에서 사용됩니다.cuBLAS에 대한 cudaGetErrorString과 동일합니까?

지금 cuBLAS에 익숙해 져 있으며 cuBLAS에 대해 CUDA_SAFE_CALL과 비슷한 매크로를 만들고 싶습니다. 내 매크로 출력물을 유용하게 만들기 위해 cuBLAS에서 cudaGetErrorString과 비슷한 것을 사용하고 싶습니다.

cuBLAS에 cudaGetErrorString()과 동일한 항목이 있습니까? 또는 cuBLAS 사용자가 이와 같은 기능을 작성 했습니까?

답변

6

, ..../samples/common/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 절에 따르면 cuBLAS에는 cublasError_t 값이 8 개뿐입니다. 내가 그들을 인쇄 ...

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 오류 문자열을 얻을 내 기능 :

당신이 샘플을 설치 한 가정 CUDA 5.0
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는 내일 열거의 값을 변경하기로 결정할 수 있으며 코드는 중단됩니다. [this code] (http://stackoverflow.com/a/13041801/681865)는 그렇지 않습니다. – talonmies

+0

좋은 지적. 나는 그것을 고쳤다! – solvingPuzzles