2016-03-26 7 views
14

मैं एक शब्द में एक बार नहीं ठोकर खाई है "गैर सुसंगत" औरजीपीयू पर सुसंगत स्मृति क्या है?

tech papers ग्राफिक्स है programming.I एक सरल और स्पष्ट विवरण के लिए खोज कर दिया गया से संबंधित में "सुसंगत" स्मृति, लेकिन पाया ज्यादातर 'कट्टर' के कागजात this प्रकार। मुझे जीएमयू आर्किटेक्चर पर वास्तव में कौन सी सुसंगत स्मृति है और इसकी तुलना अन्य (संभवतः संगत) स्मृति प्रकारों की तुलना में की जाती है, इस पर आम आदमी के स्टाइल जवाब प्राप्त करने में मुझे खुशी होगी।

+1

"सुसंगत" का अर्थ है कि यदि एकाधिक ऑब्जेक्ट्स (या एकाधिक पथों पर) डेटा ऑब्जेक्ट का उपयोग किया जाता है, तो प्रत्येक एक ही स्थिति को बिल्कुल देखेगा। दो एजेंट एक सीपीयू और एक जीपीयू हो सकता है। दो पठित पथों के लिए उदाहरण बनावट कैश बनाम एल 1 कैश के माध्यम से हो सकता है। सहारे को बनाए रखने के लिए आमतौर पर अतिरिक्त हार्डवेयर तंत्र की आवश्यकता होती है, उदा। एमईएसआई या एमओईएसआई कैश लाइनों की स्थिति को ट्रैक करने के लिए बिट्स, और आसपास के शिपिंग डेटा के लिए महत्वपूर्ण मात्रा में कोचेंसी यातायात का कारण बन सकता है, खासकर यदि कई एजेंट हैं। – njuffa

+1

GPUs में बनावट कैश एक "अंतर्निहित" तंत्र के लिए एक विशिष्ट उदाहरण है। यदि बनावट मैपिंग में अंतर्निहित डेटा बदलता है, तो बनावट कैश में किसी भी कैश की गई सामग्री को अमान्य या रीफ्रेश नहीं किया जा सकता है, और इसके बाद बनावट कैश के परिणामस्वरूप स्टेल डेटा पढ़ा जा सकता है। – njuffa

उत्तर

16

मेमोरी मेमोरी है। लेकिन अलग-अलग चीजें उस स्मृति तक पहुंच सकती हैं। जीपीयू मेमोरी एक्सेस कर सकता है, सीपीयू मेमोरी एक्सेस कर सकता है, शायद अन्य हार्डवेयर बिट्स, जो भी हो।

पाठक को दृश्य दिखाई देने वाले किसी भी चीज़ में स्मृति के लिए "सुसंगत" पहुंच है। अब, आपको लगता है कि यह मूर्खता है। आखिरकार, अगर स्मृति बदल दी गई है, तो संभवतः इसे देखने में असमर्थ कैसे हो सकता है?

बस डालें, कैश।

यह पता चला है कि बदलती मेमोरी महंगा है। तो हम से सब कुछ संभव कर सकते हैं तब तक स्मृति को बदलना जब तक कि हमें बिल्कुल नहीं करना पड़े। जब आप सीपीयू से स्मृति में एक पॉइंटर लिखते हैं, तो CPU उस बाइट को अभी तक नहीं लिखता है। या कम से कम, स्मृति के लिए नहीं। यह इसे उस स्मृति की स्थानीय प्रतिलिपि में लिखता है जिसे "कैश" कहा जाता है।

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

लेकिन यदि आपके पास दो अलग-अलग डिवाइस हैं जो समान स्मृति का उपयोग करते हैं, तो आपको यह सुनिश्चित करने के लिए कुछ तरीका चाहिए कि एक डिवाइस बनाता है अन्य उपकरणों के लिए दृश्यमान होता है। अधिकांश जीपीयू सीपीयू कैश नहीं पढ़ सकते हैं। और अधिकांश सीपीयू भाषाओं में भाषा-स्तर का समर्थन नहीं है "अरे, वह सामान जो मैंने स्मृति में लिखा था? मैं वास्तव में आपके लिए इसे स्मृति में लिखना चाहता हूं।" इसलिए आपको आमतौर पर परिवर्तन की दृश्यता सुनिश्चित करने के लिए कुछ चाहिए।

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

सुसंगत स्मृति के साथ, हार्डवेयर के मामले में दो चीजों में से एक चल रहा है। किसी भी सीपीयू के कैश में मेमोरी तक सीपीयू का उपयोग कैश नहीं किया जाता है, या जीपीयू के पास सीपीयू के कैश की सीधी पहुंच होती है (शायद सीपीयू के समान मरने के कारण)। आप आमतौर पर बता सकते हैं कि उत्तरार्द्ध हो रहा है, क्योंकि वल्कन के जीपीयू कार्यान्वयन गैर-सुसंगत स्मृति विकल्पों की पेशकश करने के लिए परेशान नहीं हैं।

4

यदि स्मृति सुसंगत है तो उस स्मृति तक पहुंचने वाले सभी धागे हर समय स्मृति की स्थिति पर सहमत होना चाहिए, उदाहरण के लिए: यदि थ्रेड 0 स्मृति स्थान पढ़ता है तो ए और थ्रेड 1 एक ही स्थान पर एक ही स्थान को पढ़ता है, दोनों धागे हमेशा एक ही मूल्य पढ़ें।

लेकिन अगर स्मृति सुसंगत नहीं है तो थ्रेड ए और बी अलग-अलग मान वापस पढ़ सकते हैं।थ्रेड 0 सोच सकता है कि स्थान ए में 1 होता है, जबकि थ्रेड सोचता है कि उस स्थान में 2 है। विभिन्न धागे में स्मृति का एक अंतर्निहित दृश्य होगा।

कोयरेन्स को उच्च संख्या में कोर के साथ हासिल करना मुश्किल है। अक्सर हर कोर को अन्य सभी कोरों से स्मृति पहुंच के बारे में पता होना चाहिए। तो यदि आपके पास क्वाड कोर सीपीयू में 4 कोर हैं, तो समेकन को हासिल करना मुश्किल नहीं है क्योंकि प्रत्येक कोर को स्मृति के बारे में सूचित किया जाना चाहिए 3 अन्य कोर के पते तक पहुंचता है, लेकिन जीपीयू में 16 कोर के साथ, प्रत्येक कोर को अवगत कराया जाना चाहिए स्मृति 15 अन्य कोरों द्वारा उपयोग की जाती है। कोर "कैश समेकन प्रोटोकॉल" नामक अपने कैश की सामग्री के बारे में डेटा का आदान-प्रदान करते हैं।

यही कारण है कि जीपीयू अक्सर सहारे के सीमित रूपों का समर्थन करते हैं। अगर कुछ स्मृति स्थान केवल पढ़े जाते हैं या केवल एक थ्रेड द्वारा उपयोग किए जाते हैं, तो कोई समन्वय आवश्यक नहीं है। यदि कैश छोटे होते हैं और समन्वय हमेशा आवश्यक नहीं होते हैं, लेकिन केवल कार्यक्रम के विशिष्ट निर्देशों पर, तो विशिष्ट मेमोरी एक्सेस से पहले या बाद में कैश फ्लश का उपयोग करके प्रोग्राम के सही व्यवहार को प्राप्त करना संभव है।

यदि आपका हार्डवेयर दोनों सुसंगत और गैर-सुसंगत स्मृति प्रकार प्रदान करता है, तो आप उम्मीद कर सकते हैं कि गैर-सुसंगत स्मृति तेज हो जाएगी, लेकिन यदि आप इस स्मृति का उपयोग करके समांतर एल्गोरिदम चलाने की कोशिश करते हैं तो वे वास्तव में अजीब तरीकों से असफल हो जाएंगे।

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