किसी के बीच के अंतर का वर्णन कर सकते हैं __global__
और __device__
?
मुझे कब उपयोग करना चाहिए __device__
, और कब उपयोग करना चाहिए __global__
?
किसी के बीच के अंतर का वर्णन कर सकते हैं __global__
और __device__
?
मुझे कब उपयोग करना चाहिए __device__
, और कब उपयोग करना चाहिए __global__
?
जवाबों:
वैश्विक कार्यों को "कर्नेल" भी कहा जाता है। यह फ़ंक्शन है जिसे आप CUDA कर्नेल कॉल शब्दार्थ ( <<<...>>>
) का उपयोग करके होस्ट की ओर से कॉल कर सकते हैं ।
डिवाइस फ़ंक्शंस को केवल अन्य डिवाइस या वैश्विक फ़ंक्शंस से बुलाया जा सकता है। __device__
होस्ट कोड से कार्यों को नहीं बुलाया जा सकता है।
के बीच मतभेद __device__
और __global__
कार्य हैं:
__device__
फ़ंक्शन को केवल डिवाइस से बुलाया जा सकता है, और इसे केवल डिवाइस में निष्पादित किया जाता है।
__global__
फ़ंक्शन को होस्ट से कॉल किया जा सकता है, और इसे डिवाइस में निष्पादित किया जाता है।
इसलिए, आप __device__
कर्नेल फ़ंक्शन से फ़ंक्शन कॉल करते हैं, और आपको कर्नेल सेटिंग्स सेट करने की आवश्यकता नहीं है। आप एक फ़ंक्शन को "अधिभार" भी कर सकते हैं, उदाहरण के लिए: आप घोषणा कर सकते हैं void foo(void)
और __device__ foo (void)
, फिर एक होस्ट पर निष्पादित किया जाता है और केवल एक होस्ट फ़ंक्शन से कॉल किया जा सकता है। दूसरे को डिवाइस पर निष्पादित किया जाता है और केवल डिवाइस या कर्नेल फ़ंक्शन से कॉल किया जा सकता है।
आप निम्न लिंक पर भी जा सकते हैं: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , यह मेरे लिए उपयोगी था।
__global__
- GPU पर चलता है, सीपीयू या GPU से बुलाया जाता है *। <<<dim3>>>
तर्कों के साथ निष्पादित ।__device__
- GPU पर चलता है, GPU से बुलाया जाता है। वैरिएबल के साथ भी इस्तेमाल किया जा सकता है।__host__
- सीपीयू, सीपीयू से बुलाया पर चलाता है।*) __global__
कार्यों दूसरे से कहा जा सकता है __global__
शुरू कर कार्यों
गणना क्षमता 3.5।
मैं इसे एक उदाहरण से समझाऊंगा:
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
}
जब हम डिवाइस (GPU) फ़ंक्शन को होस्ट करने के लिए एक होस्ट (CPU) फ़ंक्शन चाहते हैं, तो ' ग्लोबल ' का उपयोग किया जाता है। इसे पढ़ें: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctional "
और जब हम एक और कर्नेल फ़ंक्शन को कॉल करने के लिए डिवाइस (GPU) फ़ंक्शन (बल्कि कर्नेल) चाहते हैं, तो हम ' डिवाइस ' का उपयोग करते हैं । इसे " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceooction.com " पढ़ें
यह अंतर समझने के लिए पर्याप्त होना चाहिए।
मैं कुछ निराधार अटकलों को इस समय के लिए रिकॉर्ड कर रहा हूं (जब मैं कुछ आधिकारिक स्रोत पर आऊंगा तो बाद में इनका वर्णन करूंगा) ...
__device__
फ़ंक्शंस में शून्य के अलावा एक वापसी प्रकार हो सकता है, लेकिन __global__
फ़ंक्शंस को हमेशा शून्य होना चाहिए।
__global__
कार्यों __device__
को कॉलिंग कर्नेल के रूप में एक ही धागे पर चलाने के दौरान अतिरिक्त जीपीयू थ्रेड्स (CUDA गतिशील समानांतरवाद मॉडल (उर्फ CNP) के भाग के रूप में) लॉन्च करने के लिए GPU पर चलने वाले अन्य कर्नेल के भीतर से फ़ंक्शन को कॉल किया जा सकता है ।
__global__
फ़ंक्शन कर्नेल की परिभाषा है। जब भी सीपीयू से कॉल किया जाता है, तो उस कर्नेल को GPU पर लॉन्च किया जाता है।
हालाँकि, उस कर्नेल को निष्पादित करने वाले प्रत्येक थ्रेड को कुछ कोड को बार-बार निष्पादित करने की आवश्यकता हो सकती है, उदाहरण के लिए दो पूर्णांकों की अदला-बदली। इस प्रकार, यहां हम एक हेल्पर फ़ंक्शन लिख सकते हैं, जैसे हम एक सी प्रोग्राम में करते हैं। और GPU पर थ्रेडिंग निष्पादित करने के लिए, एक सहायक फ़ंक्शन को घोषित किया जाना चाहिए __device__
।
इस प्रकार, एक डिवाइस फ़ंक्शन को कर्नेल के थ्रेड्स से बुलाया जाता है - एक थ्रेड के लिए एक उदाहरण। जबकि, सीपीयू थ्रेड से एक वैश्विक फ़ंक्शन कहा जाता है।
__global__
एक CUDA C कीवर्ड (घोषणा विनिर्देश) है जो कहता है कि फ़ंक्शन,
वैश्विक फ़ंक्शंस (गुठली) का उपयोग करके होस्ट कोड द्वारा लॉन्च किया गया <<< no_of_blocks , no_of threads_per_block>>>
। प्रत्येक थ्रेड अपनी अनूठे थ्रेड आईडी द्वारा कर्नेल को निष्पादित करता है।
हालाँकि, __device__
फ़ंक्शन को होस्ट कोड से नहीं बुलाया जा सकता है। यदि आपको इसे दोनों का उपयोग करने की आवश्यकता है __host__
__device__
।
ग्लोबल फ़ंक्शन को केवल होस्ट से कॉल किया जा सकता है और उनके पास रिटर्न प्रकार नहीं है, जबकि डिवाइस फ़ंक्शन को केवल अन्य डिवाइस फ़ंक्शन के कर्नेल फ़ंक्शन से कॉल किया जा सकता है, इसलिए कर्नेल सेटिंग की आवश्यकता नहीं है
__global__
फ़ंक्शन को CUDA कर्नेल सिमेंटिक (<<< ... >>>) का उपयोग करके डिवाइस से भी कॉल किया जा सकता है यदि आप गतिशील समानता का उपयोग कर रहे हैं - जिसके लिए CUDA 5.0 की आवश्यकता होती है और क्षमता 3.5 या उच्चतर की आवश्यकता होती है।