CUDA में, हम मेजबान मेमोरी से डिवाइस साइड शेयर्ड मेमोरी को होस्ट मेमोरी से डिवाइस शेयर्ड मेमोरी में कर्नेल प्रबंधित डेटा ट्रांसफर प्राप्त कर सकते हैं। ऐशे ही:
int *a,*b,*c; // host pointers
int *dev_a, *dev_b, *dev_c; // device pointers to host memory
…
cudaHostGetDevicePointer(&dev_a, a, 0); // mem. copy to device not need now, but ptrs needed instead
cudaHostGetDevicePointer(&dev_b, b, 0);
cudaHostGetDevicePointer(&dev_c ,c, 0);
…
//kernel launch
add<<<B,T>>>(dev_a,dev_b,dev_c);
// dev_a, dev_b, dev_c are passed into kernel for kernel accessing host memory directly.
उपरोक्त उदाहरण में, कर्नेल कोड होस्ट मेमोरी तक पहुंच सकता है dev_a
, dev_b
तथा dev_c
। कर्नेल इन बिंदुओं का उपयोग मेजबान मेमोरी से डेटा को साझा करने के लिए सीधे कर सकते हैं, वैश्विक मेमोरी द्वारा उन्हें रिले किए बिना।
लेकिन लगता है कि यह OpenCL में एक मिशन असंभव है? (ओपनसीएल में स्थानीय मेमोरी CUDA में साझा मेमोरी का प्रतिरूप है)
उत्तर:
जवाब के लिए 3 № 1आप OpenCL में बिल्कुल समान एपीआई पा सकते हैं।
यह CUDA पर कैसे काम करता है:
इसके अनुसार यह प्रस्तुति और यह आधिकारिक दस्तावेज.
पैसे के बारे में बोली cudaHostGetDevicePointer
:
द्वारा होस्ट की गई मैप्ड होस्ट मेमोरी के डिवाइस पॉइंटर को पास करता है cudaHostAlloc या cudaHostRegister द्वारा पंजीकृत।
CUDA cudaHostAlloc
साथ में cudaHostGetDevicePointer
ठीक वैसे ही काम करता है CL_MEM_ALLOC_HOST_PTR
साथ में MapBuffer
OpenCL में काम करता है। मूल रूप से अगर यह एक असतत जीपीयू है तो परिणाम डिवाइस में कैश्ड हो जाते हैं और अगर यह होस्ट के साथ साझा मेमोरी के साथ असतत जीपीयू है तो यह सीधे मेमोरी का उपयोग करेगा। इसलिए CUDA में असतत GPU के साथ कोई वास्तविक "शून्य प्रति" ऑपरेशन नहीं है।
कार्यक्रम cudaHostGetDevicePointer
कच्चे मैलोकेड पॉइंटर्स को अंदर की तरह नहीं लेता हैOpenCL में सीमा क्या है। एपीआई उपयोगकर्ताओं के दृष्टिकोण से उन दोनों बिल्कुल समान दृष्टिकोण हैं जो कार्यान्वयन को बहुत अधिक समान अनुकूलन करने की अनुमति देते हैं।
असतत GPU के साथ पॉइंटर से आपको पॉइंट मिलते हैंऐसा क्षेत्र जहां GPU सीधे DMA के माध्यम से सामान स्थानांतरित कर सकता है। अन्यथा ड्राइवर आपका पॉइंटर लेगा, डेटा को डीएमए क्षेत्र में कॉपी करेगा और फिर ट्रांसफर शुरू करेगा।
हालाँकि OpenCL2 में।0 जो आपके डिवाइस की क्षमताओं के आधार पर स्पष्ट रूप से संभव है। बेहतरीन ग्रैन्युलैरिटी शेयरिंग के साथ आप बेतरतीब ढंग से बनाए गए मेज़बान पॉइंटर्स का उपयोग कर सकते हैं और यहाँ तक कि होस्ट के साथ एटमिक्स का भी उपयोग कर सकते हैं, इसलिए आप इसे चलते समय होस्ट से कर्नेल को गतिशील रूप से नियंत्रित कर सकते हैं।
http://www.khronos.org/registry/cl/specs/opencl-2.0.pdf
साझा वर्चुअल मेमोरी स्पेक के लिए पेज 162 देखें। ध्यान दें कि जब आप गुठली लिखते हैं, तब भी ये कर्नेल बिंदु से सिर्फ __global संकेत होते हैं।