2012-10-24 51 views
7

CUDA रनटाइम में सुविधा सुविधा cudaGetErrorString(cudaError_t error) है जो एक पठन योग्य स्ट्रिंग में त्रुटि enum का अनुवाद करता है। cudaGetErrorStringCUDA_SAFE_CALL(someCudaFunction()) मैक्रो में उपयोग किया जाता है कि कई लोग CUDA त्रुटि हैंडलिंग के लिए उपयोग करते हैं।cuBLAS के लिए cudaGetErrorString के समतुल्य?

मैं अब खुद को क्यूब्ला के साथ परिचित कर रहा हूं, और मैं CUDA_SAFE_CALL को कुब्ला के लिए एक मैक्रो बनाना चाहता हूं। मेरे मैक्रो के प्रिंटआउट को उपयोगी बनाने के लिए, मैं cublas में cudaGetErrorString के समान कुछ करना चाहता हूं।

क्या CUBLAS में cudaGetErrorString() के बराबर है? या, क्या किसी भी 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 

शायद सीयूडीए एसडीके (नमूने) के पिछले संस्करणों में कुछ ऐसा ही है। यदि आपने यह पूछा है, तो यह एक प्रश्न के उत्तर में नहीं है "कुछ अंतर्निहित है", लेकिन आपके प्रश्न के उत्तर में "क्या कोई क्यूब्ला उपयोगकर्ता इस तरह एक समारोह लिखा है?"

+0

Fantasic! मैंने अपने जवाब में लगभग उसी कोड को लिखना समाप्त कर दिया। :) – solvingPuzzles

+0

मेरे ज्ञान के लिए, ऐसा कोई कार्य नहीं है। मैं एनवीआईडीआईए बग रिपोर्टिंग सिस्टम के माध्यम से एक फीचर अनुरोध (जिसे आरएफई = एन्हांसमेंट के लिए अनुरोध के रूप में जाना जाता है) दर्ज करने का सुझाव दूंगा। – njuffa

2

मैं अभी भी उत्सुक लगा सकते हैं कि एक अंतर्निहित तरीका cuBLAS में त्रुटि तार पाने के लिए कर रहा हूँ, लेकिन अभी तो मैं अपना खुद का लिखा था।

cuBLAS Guide की धारा 8.1 के अनुसार CUBLAS में केवल 8 प्रकार के 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' * बहुत * खराब प्रोग्रामिंग अभ्यास है। आपको कभी भी नाम से मूल्य के आधार पर एक enum का उल्लेख नहीं करना चाहिए। गणना का उपयोग करने का पूरा बिंदु यह है कि मूल्यों को सारणित किया जाता है। एनवीआईडीआईए कल गणना के मूल्यों को बदलने का फैसला कर सकता है और आपका कोड टूट जाएगा, जबकि [यह कोड] (http://stackoverflow.com/a/13041801/681865) नहीं होगा। – talonmies

+0

अच्छा बिंदु। मैंने ठीक कर दिया! – solvingPuzzles