जब मैं अपना सीयूडीए प्रोग्राम चलाता हूं जो केवल वैश्विक स्मृति (20 एम से नीचे) आवंटित करता है, तो मुझे "स्मृति से बाहर" त्रुटि मिलती है। (अन्य लोगों की पोस्ट से, मुझे लगता है कि समस्या स्मृति विखंडन से संबंधित है) मैं इस समस्या को समझने की कोशिश करता हूं, और महसूस करता हूं कि मेरे पास CUDA स्मृति प्रबंधन से संबंधित कुछ प्रश्न हैं।सीयूडीए मेमोरी कैसे प्रबंधित की जाती है?
क्या सीयूडीए में वर्चुअल मेमोरी अवधारणा है?
यदि समाप्ति के बाद, केवल एक कर्नेल को सीयूडीए पर चलाने की अनुमति है, तो क्या यह सभी मेमोरी का उपयोग या आवंटित किया जाएगा? यदि नहीं, तो जब ये स्मृति मुक्त हो गई?
यदि कुडा पर एक से अधिक कर्नेल चलाने की अनुमति है, तो वे कैसे सुनिश्चित कर सकते हैं कि वे जिस स्मृति का उपयोग करते हैं, वह ओवरलैप नहीं होता है?
किसी को भी मदद कर सकते हैं मुझे इन सवालों के जवाब? धन्यवाद
संपादित करें 1: ऑपरेटिंग सिस्टम: x86_64 जीएनयू/लिनक्स CUDA संस्करण: 4.0 डिवाइस: Geforce 200, यह GPUs मशीन से जुड़ी में से एक है, और मुझे नहीं लगता कि यह एक प्रदर्शन उपकरण है।
संपादित करें 2: कुछ शोध करने के बाद मुझे निम्नलिखित मिला। मुझे सही करने के लिए स्वतंत्र महसूस करें।
CUDA प्रत्येक होस्ट थ्रेड के लिए एक संदर्भ बनाएगा। यह संदर्भ जानकारी को बनाए रखेगा जैसे स्मृति के किस हिस्से (पूर्व आवंटित स्मृति या गतिशील रूप से आवंटित स्मृति) इस एप्लिकेशन के लिए आरक्षित किया गया है ताकि अन्य एप्लिकेशन इसे लिख न सके। जब यह एप्लिकेशन समाप्त होता है (कर्नेल नहीं), स्मृति का यह भाग जारी किया जाएगा।
सीयूडीए मेमोरी एक लिंक सूची द्वारा बनाए रखा जाता है। जब किसी एप्लिकेशन को स्मृति आवंटित करने की आवश्यकता होती है, तो यह देखने के लिए कि यह निरंतर स्मृति खंड आवंटन के लिए उपलब्ध है या नहीं, यह लिंक सूची के माध्यम से जाएगा। यदि यह इस तरह के एक हिस्से को खोजने में विफल रहता है, तो "स्मृति से बाहर" त्रुटि उपयोगकर्ताओं को रिपोर्ट करेगी, भले ही कुल उपलब्ध स्मृति आकार अनुरोधित स्मृति से अधिक हो। और यह स्मृति विखंडन से संबंधित समस्या है।
cuMemGetInfo आपको बताएगा कि कितनी मेमोरी मुफ्त है, लेकिन यह आवश्यक नहीं है कि आप मेमोरी विखंडन के कारण अधिकतम आवंटन में कितनी मेमोरी आवंटित कर सकें।
Vista प्लेटफार्म (डब्लूडीडीएम) पर, जीपीयू मेमोरी वर्चुअलाइजेशन संभव है। यही है, कई अनुप्रयोग लगभग पूरी GPU मेमोरी आवंटित कर सकते हैं और डब्लूडीडीएम मुख्य मेमोरी में डेटा को स्वैप करने का प्रबंधन करेगा।
नए प्रश्न: 1. यदि स्मृति संदर्भ में सुरक्षित पूरी तरह से जारी किया जाएगा के बाद आवेदन समाप्त कर दिया गया, स्मृति विखंडन मौजूद नहीं चाहिए। स्मृति में कुछ प्रकार का डेटा छोड़ा जाना चाहिए। 2. क्या GPU स्मृति को पुन: स्थापित करने का कोई तरीका है?
क्या आप इस ऑपरेटिंग सिस्टम, जीपीयू और क्यूडा संस्करण का उपयोग कर रहे हैं, और क्या GPU एक डिस्प्ले या गैर डिस्प्ले डिवाइस शामिल करने के लिए प्रश्न संपादित कर सकते हैं। यह आपके प्रश्न के सही उत्तर पर असर डालेगा। – talonmies
अतिरिक्त प्रश्नों के उत्तर देने के लिए - उपयोगकर्ता देखे जाने योग्य विखंडन * संदर्भ के भीतर * होता है, और GPU के भीतर मेमोरी मैपिंग को बदलने का कोई तरीका नहीं है, जिसे होस्ट होस्ट द्वारा नियंत्रित किया जाता है। – talonmies
जैसा कि आप समझाते हैं, एक संदर्भ आवंटन संदर्भ स्थिर आवंटन, संदर्भ उपयोगकर्ता आवंटन और CUDA संदर्भ रनटाइम ढेर से बना है। मुझे लगता है कि संदर्भ स्थिर आवंटन और संदर्भ उपयोगकर्ता आवंटन का आकार पूर्व निर्धारित है। इसलिए, मुझे लगता है कि स्मृति विखंडन का एकमात्र कारण संदर्भ रनटाइम ढेर है जो केवल फर्मि वास्तुकला पर है। क्या वो सही है? मुझे लगता है कि सिस्टम संदर्भ रनटाइम ढेर के लिए स्मृति का एक हिस्सा आवंटित करेगा ताकि इन-कर्नेल गतिशील स्मृति आवंटन सक्षम हो। – xhe8