2012-05-22 15 views
5

मैं एनवीडिया 2 9 0.10 64 बिट ड्राइवरों का उपयोग करते हुए लिनक्स-आधारित सी ++ ओपनजीएल एप्लिकेशन पर काम कर रहा हूं। मैं अपनी मेमोरी पदचिह्न को कम करने की कोशिश कर रहा हूं क्योंकि यह काफी सारे लाइव डेटा का उपयोग करता है।libGL ढेर उपयोग

मैं ढेर के उपयोग का विश्लेषण करने के लिए वाल्ग्रिंड/मासफ का उपयोग कर रहा हूं, और जब यह मुझे विभिन्न चीजों को अनुकूलित करने में मदद करता है, अब तक उपयोग की जाने वाली ढेर मेमोरी का सबसे बड़ा हिस्सा libGL द्वारा आवंटित किया जाता है। इससे कोई फर्क नहीं पड़ता कि मैंने थ्रेसहोल्ड कैसे सेट किया है, मासफ मुझे विस्तार से देखने नहीं देता है, जहां उन आवंटन आते हैं, बस यह libGL है। चरम समय पर, मैं libGL द्वारा आवंटित लगभग 250 एमबी (900 एमबी कुल ढेर उपयोग से बाहर) देखता हूं। मैं ग्राफिक्स कार्ड पर समान मात्रा में स्मृति रखता हूं, वीबीओ और बनावट (ज्यादातर एक बड़ा 4096 * 4096 बनावट) के रूप में।

तो ऐसा लगता है कि जीपीयू मेमोरी में जो अपलोड किया गया है, वैसे ही स्मृति की एक समान राशि libGL द्वारा ढेर पर आवंटित की जाती है। वीबीओ की चोटी की मात्रा जब libGL आवंटन भी चोटी। क्या यह सामान्य है? मैंने सोचा कि बहुत सारी GPU मेमोरी होने के लाभों में से एक यह है कि यह रैम को मुक्त रखता है?

+1

'glbufferData' में VBO के लिए आपने किस उपयोग को निर्दिष्ट किया था? – KillianDS

+0

वीबीओ के थोक के लिए, यह GL_STATIC_DRAW है। एक मामले में यह GL_STREAM_DRAW है, लेकिन व्यवहार वही है भले ही एप्लिकेशन का यह हिस्सा अक्षम हो। – pholz

+0

@ किलियनडीएस कोई फर्क नहीं पड़ता, क्योंकि उपयोग केवल एक संकेत है, अनिवार्य नहीं है। ओपनजीएल को विभिन्न कारणों से एक प्रतिलिपि रखना चाहिए। – datenwolf

उत्तर

7

जो आप अनुभव करते हैं वह बिल्कुल सामान्य है, क्योंकि ओपनजीएल कार्यान्वयन को विभिन्न कारणों से सिस्टम मेमोरी में डेटा की एक प्रति रखना चाहिए।

ओपनजीएल में GPU के लिए कोई विशेष पहुंच नहीं है, इसलिए इसके उपयोग के आधार पर, डेटा को स्वैप करने के लिए यह संभव हो सकता है (या केवल GPU मेमोरी से कुछ ऑब्जेक्ट्स जारी करें)। इसके अलावा जीपीयू क्रैश हो सकते हैं और ड्राइवर तब उपयोगकर्ता को ध्यान में रखकर चुपचाप रीसेट कर सकते हैं। इसके लिए सभी बफर डेटा की पूरी प्रतिलिपि भी आवश्यक है।

और भूल नहीं है वहाँ पता स्थान आवंटन (मूल्य वेलग्रिंड द्वारा रिपोर्ट) और वास्तविक मेमोरी उपयोग के बीच एक बड़ा अंतर है कि।

+0

धन्यवाद, मुझे संदेह था कि ऐसा कुछ ऐसा हो सकता है। अब जब राम भर जाता है, तो क्या यह एक बुरी चीज से कम है जब तक आवंटन का एक बड़ा हिस्सा libGL से आता है? – pholz

+2

फोल्ज़: ठीक है, libGL वह जगह है जहां आवंटन कोड आता है, लेकिन स्मृति को प्रभावी ढंग से आवंटित किया जाता है जो ओपनजीएल संसाधनों को आवंटित करता है। और सिस्टम के लिए में कोई अंतर नहीं है। इसके अलावा आधुनिक ऑपरेटिंग सिस्टम रैम और स्टोरेज के बीच अंतर नहीं करते हैं। उनके लिए, केवल "स्मृति" है और रैम सिर्फ एक और कैश स्तर है। आधुनिक स्मृति उपयोग में बहुत अच्छी शुरुआत के लिए इस आलेख को देखें https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf

संबंधित मुद्दे