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