वैश्विक और डिवाइस कार्यों के बीच अंतर


65

क्या कोई __global__ और __device__ के बीच अंतर का वर्णन कर सकता है?

मुझे __device__ का उपयोग कब करना चाहिए, और __global__ का उपयोग कब करना चाहिए?

93

वैश्विक कार्यों को "कर्नल" भी कहा जाता है। यह वह कार्य है जिसे आप CUDA कर्नेल कॉल सेमेन्टिक्स (<<<...>>>) का उपयोग कर मेजबान पक्ष से कॉल कर सकते हैं।

डिवाइस फ़ंक्शंस केवल अन्य डिवाइस या वैश्विक कार्यों से ही बुलाया जा सकता है। __device__ फ़ंक्शन होस्ट कोड से नहीं कहा जा सकता है।

+7

, '__global__' कार्य भी करता है, तो आप गतिशील समानांतरवाद उपयोग कर रहे हैं CUDA कर्नेल अर्थ विज्ञान (<<<...> >>) का उपयोग कर डिवाइस से कहा जा सकता है। 11 sep. 122012-09-11 17:44:18


10

__global__ कूडा कर्नेल के लिए है, जो कार्य सीधे मेजबान से कॉल करने योग्य हैं। __device__ कार्यों को __global__ और __device__ फ़ंक्शंस से होस्ट किया जा सकता है लेकिन होस्ट से नहीं। __device__ और __global__ कार्यों के बीच


28

मतभेद हैं:

__device__ कार्यों केवल डिवाइस से कहा जा सकता है, और यह केवल डिवाइस में मार डाला गया है।

__global__ कार्यों को मेजबान से बुलाया जा सकता है, और इसे डिवाइस में निष्पादित किया जाता है।

इसलिए, आप कर्नेल कार्यों से __device__ फ़ंक्शंस को कॉल करते हैं, और आपको कर्नेल सेटिंग्स सेट करने की आवश्यकता नहीं है। आप फ़ंक्शन को "ओवरलोड" भी कर सकते हैं, उदाहरण: आप void foo(void) और __device__ foo (void) घोषित कर सकते हैं, फिर होस्ट पर निष्पादित किया जाता है और केवल होस्ट फ़ंक्शन से ही कॉल किया जा सकता है। दूसरा डिवाइस पर निष्पादित किया जाता है और केवल डिवाइस या कर्नेल फ़ंक्शन से ही कहा जा सकता है।

आप निम्न लिंक पर भी जा सकते हैं: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, यह मेरे लिए उपयोगी था।


12

मैं एक उदाहरण के साथ यह समझा जाएगा:

main() 
{ 
    // Your main function. Executed by CPU 
} 

__global__ void calledFromCpuForGPU(...) 
{ 
    //This function is called by CPU and suppose to be executed on GPU 
} 

__device__ void calledFromGPUforGPU(...) 
{ 
    // This function is called by GPU and suppose to be executed on GPU 
} 

अर्थात जब हम एक मेजबान (CPU) समारोह एक डिवाइस (GPU) समारोह है, तो कॉल करना चाहते हैं 'वैश्विक' प्रयोग किया जाता है। इस पढ़ें: "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"

और जब हम एक युक्ति (GPU) समारोह चाहते हैं (बल्कि गिरी) एक और गिरी समारोह उपयोग हम 'डिवाइस' कॉल करने के लिए। इसे पढ़ें "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

यह अंतर को समझने के लिए पर्याप्त होना चाहिए।


5

__global__ फ़ंक्शन कर्नेल की परिभाषा है। जब भी इसे सीपीयू से कहा जाता है, तो वह कर्नेल GPU पर लॉन्च किया जाता है।

हालांकि कर्नेल को निष्पादित करने वाले प्रत्येक थ्रेड को बार-बार कुछ कोड निष्पादित करने की आवश्यकता हो सकती है, उदाहरण के लिए दो पूर्णांकों का स्वैपिंग। इस प्रकार, यहां हम एक सहायक कार्यक्रम लिख सकते हैं, जैसे कि हम एक सी प्रोग्राम में करते हैं। और जीपीयू पर निष्पादित धागे के लिए, एक सहायक समारोह __device__ के रूप में घोषित किया जाना चाहिए।

इस प्रकार, एक डिवाइस फ़ंक्शन को कर्नेल के धागे से कहा जाता है - एक उदाहरण के लिए एक उदाहरण। हालांकि, सीपीयू थ्रेड से एक वैश्विक समारोह कहा जाता है।


6

मैं (मैं इन बाद में सिद्ध होगा जब मैं कुछ आधिकारिक स्रोत के पार चलो) कुछ समय के लिए यहाँ कुछ निराधार अटकलों रिकॉर्डिंग कर रहा हूँ ...

  1. __device__ कार्यों शून्य के अलावा किसी अन्य वापसी प्रकार हो सकता है, लेकिन __global__ कार्यों को हमेशा शून्य वापस करना होगा।

  2. __global__ कार्यों अतिरिक्त GPU धागे शुरू करने के लिए __device__ कार्यों बुला गिरी के रूप में ही थ्रेड पर चलते हैं, जबकि (CUDA गतिशील समानांतरवाद मॉडल (उर्फ सीएनपी) के हिस्से के रूप) GPU पर चल रहे अन्य कर्नेल के भीतर से कहा जा सकता है।


2

ग्लोबल फ़ंक्शन केवल मेजबान से कहा जा सकता है और वे एक वापसी प्रकार की जरूरत नहीं है डिवाइस समारोह केवल अन्य डिवाइस समारोह के कर्नेल समारोह इसलिए dosen't कर्नेल स्थापित करने की आवश्यकता होती है से कहा जा सकता है, जबकि


5

__golbal__ एक CUDA सी कीवर्ड (घोषणा विनिर्देशक) जो कहता है कि समारोह,

  1. डिवाइस (GPU)
  2. कॉल मेजबान से (CPU) कोड पर निष्पादित होता है।

वैश्विक कार्य (कर्नेल) < < < no_of_blocks, no_of threads_per_block >>> का उपयोग कर मेजबान कोड द्वारा शुरू की। प्रत्येक थ्रेड कर्नेल को अपने अद्वितीय थ्रेड आईडी द्वारा निष्पादित करता है।

लेकिन __device__ कार्यों मेजबान से नहीं कहा जा सकता code.if आप इसे दोनों __host____device__


11
  1. __global__ का उपयोग करने की जरूरत है - GPU पर चलाता है, सीपीयू से कहा जाता है। <<<dim3>>> तर्कों के साथ निष्पादित।
  2. __device__ - जीपीयू से कहा जाता है, जीपीयू पर चलता है। Variabiles के साथ भी इस्तेमाल किया जा सकता है।
  3. __host__ - सीपीयू से बुलाया गया सीपीयू पर चलता है। और गणना क्षमता 3.5 या उच्चतर कि CUDA 5.0 की आवश्यकता है -
बस परिशिष्ट के रूप में
+1

यह उत्तर थोड़ा देर हो चुकी है - सवाल पूछने पर यह सही था, लेकिन [गतिशील समांतरता] के आविष्कार के बाद यह सही नहीं है (https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamic-समानांतरवाद /)। 12 sep. 162016-09-12 11:47:03