खोज…


परिचय

यह विषय कहीं न कहीं डेटा डालने के विभिन्न तरीकों पर प्रकाश डालता है जहां आपका डिवाइस इसे एक्सेस कर सकता है।

एक सरणी पढ़ना

डिवाइस से होस्ट पर वापस सरणी पढ़ने के लिए, एक कॉल करता है

clEnqueueReadBuffer($queue, $memobj, $blocking, $offset, $size, $target, 0, null, null);

$ कतार कमांडक्यूयू है जिसका उपयोग डिवाइस पर मेमोरी आवंटित करने के लिए किया गया था। $ मेमोबज में डिवाइस मेमोरी, $ ऑफसेट और $ आकार का पता होता है, जहां से और कितना डेटा कॉपी किया जाता है। $ लक्ष्य होस्ट मेमोरी के लिए एक संकेतक है जहां डेटा को संग्रहीत किया जाएगा। $ लक्ष्य को आवंटित करने और उचित आकार देने की आवश्यकता है।

एक पाठ पढ़ना

एक छवि पढ़ना लगभग एक सरणी को पढ़ने की तरह है। एकमात्र अंतर यह है कि आकार और ऑफसेट को तीन-आयामी होना चाहिए।

clEnqueueReadImage($queue, $memobj, $blocking, $offset, $size, $stride, $slice_pitch, $target, 0, null, null);

$ स्ट्राइड परिभाषित करता है कि एक पंक्ति में कितने बाइट्स हैं। आम तौर पर यह सिर्फ चौड़ाई * (बाइट्स प्रति पिक्सेल) है, लेकिन कोई व्यक्ति मेमोरी बैंकों के साथ डेटा संरेखित करने के लिए इसे बदलना चाह सकता है। वही $ slice_pitch के लिए जाता है, केवल यह मान तीसरे आयाम के लिए है।

एक 2 डी बनावट लेखन

डिवाइस की बनावट की प्रतिलिपि बनाने के लिए दो चरण आवश्यक हैं

  1. डिवाइस पर मेमोरी आवंटित करें
  2. छवि को डिवाइस पर कॉपी करें
  _mem = clCreateImage2D($context, $mem_flags, $image_format, $width, $height, $stride, $source, &err);

$ मेम_फ्लैग परिभाषित करते हैं कि मेमोरी कैसे आवंटित की गई है। इसे या तो केवल पढ़ा जा सकता है, केवल या दोनों लिखा जा सकता है। इसके अतिरिक्त आप यह निर्धारित कर सकते हैं कि मेमोरी कहाँ और कैसे आवंटित की गई है। $ चौड़ाई, $ ऊंचाई और $ स्ट्राइड बहुत आत्म व्याख्यात्मक हैं।

यदि आपका मेम_फ्लैग डेटा कॉपी करता है, तो आप कर रहे हैं। यदि आप बाद में मैन्युअल रूप से ऐसा करना चाहते हैं, तो आपको तैयार होने पर एक और फ़ंक्शन को कॉल करना होगा।

err = clEnqueueWriteImage($queue, _mem, $blocking, $offset, $size, $stride, $slice_pitch, $source, 0, null, null);

$ ऑफसेट और $ आकार छवि क्षेत्र को परिभाषित करता है जिसे आप लक्ष्य मेमोरी में कॉपी करना चाहते हैं। $ स्ट्राइड परिभाषित करता है कि एक पंक्ति में कितने बाइट्स हैं। आम तौर पर यह सिर्फ चौड़ाई * (बाइट्स प्रति पिक्सेल) है, लेकिन कोई व्यक्ति मेमोरी बैंकों के साथ डेटा संरेखित करने के लिए इसे बदलना चाह सकता है। वही $ slice_pitch के लिए जाता है, केवल यह मान तीसरे आयाम के लिए है। $ Stride और $ slice_pitch दोनों को आपके इनपुट डेटा से मेल खाना है।

मेमोरी के झंडे

मेमोरी आवंटित करते समय आपके पास विभिन्न मोड्स के बीच चयन करने का विकल्प होता है:

  • रीड ओनली मेमरी
  • केवल स्मृति लिखो
  • मेमोरी पढ़ें / लिखें

रीड-ओनली मेमोरी को __constant मेमोरी क्षेत्र में आवंटित किया जाता है, जबकि अन्य दो को सामान्य __global क्षेत्र में आवंटित किया जाता है।

एक्सेसिबिलिटी के अलावा आप परिभाषित कर सकते हैं कि आपकी मेमोरी कहां आवंटित की गई है।

  • निर्दिष्ट नहीं: आपकी मेमोरी डिवाइस मेमोरी पर आवंटित की जाती है जैसा कि आप उम्मीद करेंगे। $ स्रोत सूचक को अशक्त करने के लिए सेट किया जा सकता है।
  • CL_MEM_USE_HOST_PTR: यह डिवाइस को बताता है कि डेटा सिस्टम रैम में है और इसे स्थानांतरित नहीं किया जाना चाहिए। इसके बजाय डेटा को सीधे रैम में हेरफेर किया जाता है।
  • CL_MEM_COPY_HOST_PTR: डिवाइस को दिए गए पते पर सभी मानों को कॉपी करने के लिए डिवाइस मेमोरी को बताता है या, CL_MEM_ALLOC_HOST_PTR का उपयोग सिस्टम रैम में एक अलग मेमोरी क्षेत्र में करता है।
  • CL_MEM_ALLOC_HOST_PTR: डिवाइस को सिस्टम रैम पर स्थान आवंटित करने के लिए कहता है। यदि एकमात्र पैरामीटर के रूप में उपयोग किया जाता है, तो $ स्रोत सूचक को शून्य पर सेट किया जा सकता है।

स्पीड-वार, डिवाइस ग्लोबल मेमोरी तक पहुंच सबसे तेज़ है। लेकिन डेटा कॉपी करने के लिए भी आपको इसे दो बार कॉल करना होगा। होस्ट-पॉइंटर का उपयोग करना सबसे धीमा है, जबकि Alloc_host_ptr एक उच्च गति प्रदान करता है।

Use_host_ptr का उपयोग करते समय, डिवाइस ठीक यही करता है: यह सिस्टम रैम में आपके डेटा का उपयोग करता है, जो निश्चित रूप से ओएस द्वारा पृष्ठांकित है। तो हर मेमोरी कॉल को संभावित पेजफॉल्ट्स को संभालने के लिए सीपीयू से गुजरना पड़ता है। जब डेटा उपलब्ध होता है, तो सीपीयू इसे पिन की गई मेमोरी में कॉपी करता है और इसे डीएमए कंट्रोलर को कीमती सीपीयू क्लॉक साइकल का उपयोग करके पास करता है। इसके विपरीत, आवंटन_हॉट_पार्ट सिस्टम राम में पिन किए गए मेमोरी को आवंटित करता है। इस मेमोरी को पेजव्यू मैकेनिज्म के बाहर रखा गया है और इसलिए इसकी गारंटीकृत उपलब्धता है। इसलिए डिवाइस सिस्टम रैम को एक्सेस करते समय डिवाइस को पूरी तरह से सीपीयू को छोड़ सकता है और डिवाइस में डेटा को जल्दी से कॉपी करने के लिए डीएमए का उपयोग कर सकता है।

एक सरणी लेखन

एक सरणी लिखने में दो चरण होते हैं:

  1. मेमोरी आवंटित करना
  2. डेटा की प्रतिलिपि बनाना

स्मृति को आवंटित करने के लिए, एक सरल कॉल

_mem = clCreateBuffer($queue, $mem_flags, $size, $host_ptr, &err);

पर्याप्त है। यदि आपने mem_flags के माध्यम से होस्ट पॉइंटर को कॉपी करने का निर्णय लिया है, तो आप कर रहे हैं। अन्यथा आप जब चाहें डेटा कॉपी कर सकते हैं

err = clEnqueueWriteBuffer($queue, _mem, $blocking, $offset, $size, $source, 0, null, null);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow