2013-05-01 9 views
6

पर चल रहा है या नहीं, क्या कोई यह जानता है कि कोड को GPU या CPU पर Cuda का उपयोग करके चल रहा है या नहीं?जांचें कि कोड GPU या CPU

__device__ __host__ double count_something(double variable) { 
    if (RUN_ON_GPU) { 
    use_cuda_variables(); 
    } else { 
    use_cpu_variables(); 
    } 
} 

उत्तर

11

जो वास्तुकला कोड का एक टुकड़ा पर चल रहा है क्रम जांच करने के लिए कोई तरीका नहीं है, लेकिन वहां भी पता करने के लिए कोई जरूरत नहीं है, क्योंकि यह संकलन समय पर निर्धारित किया जा सकता है और उसके अनुसार संभाला। nvcc कई प्रीप्रोसेसर प्रतीकों को परिभाषित करता है जिनका उपयोग संकलन प्रक्षेपण को पार्स करने के लिए किया जा सकता है जबकि कोड संकलित किया जा रहा है। मुख्य प्रतीक __CUDA_ARCH__ है जिसे होस्ट कोड संकलित करते समय कभी परिभाषित नहीं किया जाता है और डिवाइस कोड संकलित करते समय हमेशा परिभाषित किया जाता है।

__device__ __host__ float function(float x) 
{ 
#ifdef __CUDA_ARCH__ 
    return 10.0f * __sinf(x); 
#else 
    return 10.0f * sin(x); 
#endif 
} 

जो चाहे वह GPU या मेजबान के लिए संकलित किया गया है के आधार पर अलग कोड फेंकना होगा:

तो यह इस तरह एक समारोह लिखने के लिए संभव है। आप इस Stack Overflow question में संकलन स्टीयरिंग के बारे में और CUDA प्रोग्रामिंग मार्गदर्शिका के C language extensions अनुभाग में अधिक व्यापक चर्चा पढ़ सकते हैं।

+0

यह बिल्कुल सही नहीं है। कुछ मामलों में यह कोड काम नहीं करता है - समाधान मिलने से पहले मैंने डीबगिंग में काफी समय बिताया है। – avtomaton

+0

@avtomaton: क्या सही नहीं है? डीबगिंग कैसे प्रभावी ढंग से सी ++ प्रीप्रोसेसर कोड में फिट होती है? – talonmies

+1

यह बिल्कुल सही नहीं है। कुछ मामलों में यह कोड काम नहीं करता है - समाधान मिलने से पहले मैंने डीबगिंग में काफी समय बिताया है। '__CUDA_ARCH__' को होस्ट कोड में भी परिभाषित किया जा सकता है, लेकिन इस तरह के मामले में 0 को परिभाषित किया गया है। इस प्रकार उचित जाँच कुछ इस तरह है: '__device__ __host__ नाव समारोह (नाव एक्स) { #if (परिभाषित (__ CUDA_ARCH__) && (__CUDA_ARCH__> 0)) वापसी 10.0f * __sinf (x); #else // होस्ट कोड यहां #endif } ' – avtomaton

2

मैं टिप्पणियों में उचित कोड मार्कडाउन नहीं जोड़ सकता - पूर्ण उत्तर जोड़ने का निर्णय लिया। केवल __CUDA_ARCH__ परिभाषित जांच पूरी तरह से सही नहीं है। कुछ मामलों में यह कोड काम नहीं करता है - मैंने समाधान मिलने से पहले डीबगिंग में काफी समय बिताया है (सीयूडीए दस्तावेज के बारे में अब इसका कोई उल्लेख नहीं है)।
__CUDA_ARCH__ होस्ट कोड में भी परिभाषित किया जा सकता है, लेकिन इस तरह के मामले में 0 को परिभाषित किया गया है। इस प्रकार उचित जांच इस प्रकार है:

__device__ __host__ float function(float x) 
{ 
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 0)) 
    // device code here 
    return 10.0f * __sinf(x); 
#else 
    // host code here 
    return 10.0f * sin(x); 
#endif 
} 
संबंधित मुद्दे