मैं कुछ हफ्तों के लिए सीयूडीए का उपयोग कर रहा हूं, लेकिन मुझे ब्लॉक/वार/थ्रेड के आवंटन के बारे में कुछ संदेह हैं। मैं (विश्वविद्यालय प्रोजेक्ट) के एक व्यावहारिक बिंदु से आर्किटेक्चर का अध्ययन कर रहा हूं, इसलिए चरम प्रदर्शन तक पहुंचना मेरी चिंता नहीं है।सीयूडीए कोर पर सीयूडीए ब्लॉक/वार/धागे मानचित्र कैसे करते हैं?
सबसे पहले, मैं समझता हूँ कि अगर मैं इन तथ्यों सीधे मिल चाहते हैं:
प्रोग्रामर एक कर्नेल लिखते हैं, और धागा ब्लॉक के एक ग्रिड में इसके निष्पादन का आयोजन।
प्रत्येक ब्लॉक को स्ट्रीमिंग मल्टीप्रोसेसर (एसएम) को सौंपा गया है। एक बार सौंपा गया यह किसी अन्य एसएम में माइग्रेट नहीं कर सकता है।
प्रत्येक एसएम अपने स्वयं के ब्लॉक को वारस (वर्तमान में 32 धागे के अधिकतम आकार के साथ) में विभाजित करता है। एक झुंड में सभी धागे एसएम के संसाधनों पर समवर्ती रूप से निष्पादित होते हैं।
एसएम में निहित CUDA कोर द्वारा थ्रेड का वास्तविक निष्पादन किया जाता है। धागे और कोर के बीच कोई विशिष्ट मैपिंग नहीं है।
यदि किसी युद्ध में 20 धागे होते हैं, लेकिन वर्तमान में केवल 16 कोर उपलब्ध हैं, तो वार्प नहीं चलेगा।
दूसरी ओर यदि किसी ब्लॉक में 48 धागे होते हैं, तो इसे 2 warps में विभाजित किया जाएगा और वे समानांतर में निष्पादित होंगे बशर्ते पर्याप्त स्मृति उपलब्ध हो।
यदि कोई धागा कोर पर शुरू होता है, तो यह स्मृति पहुंच के लिए या लंबे फ़्लोटिंग पॉइंट ऑपरेशन के लिए रुक गया है, इसका निष्पादन एक अलग कोर पर फिर से शुरू हो सकता है।
क्या वे सही हैं?
अब, मेरे पास एक GeForce 560 टीआई है, इसलिए विनिर्देशों के मुताबिक यह 8 एसएम से लैस है, प्रत्येक में 48 सीयूडीए कोर (कुल में 384 कोर) हैं।
मेरा लक्ष्य यह सुनिश्चित करना है कि वास्तुकला के प्रत्येक मूल समान निर्देश निष्पादित करता है। यह मानते हुए कि मेरी कोड अधिक रजिस्टर की जरूरत नहीं होगी की तुलना में लोगों को प्रत्येक एस.एम. में उपलब्ध है, मैं अलग दृष्टिकोण की कल्पना:
मैं, 48 धागे प्रत्येक के 8 ब्लॉक बनाने ताकि प्रत्येक एसएम निष्पादित करने के लिए 1 ब्लॉक है। इस मामले में 48 धागे एसएम में समानांतर में निष्पादित होंगे (उनके लिए उपलब्ध सभी 48 कोर का शोषण)?
क्या कोई अंतर है यदि मैं 6 धागे के 64 ब्लॉक लॉन्च करता हूं? (मान लीजिए कि उन्हें एसएम के बीच समान रूप से मैप किया जाएगा)
यदि मैं निर्धारित कार्य में GPU को "डुबकी" करता हूं (उदाहरण के लिए 1024 थ्रेड के 1024 ब्लॉक बनाते हैं) तो यह मानना उचित है कि सभी कोर होंगे एक निश्चित बिंदु पर प्रयोग किया जाता है, और वही गणना करेगा (मानते हैं कि थ्रेड कभी नहीं रुकते हैं)?
क्या प्रोफाइलर का उपयोग करके इन स्थितियों की जांच करने का कोई तरीका है?
क्या इस सामग्री के लिए कोई संदर्भ है?मैंने सीयूडीए प्रोग्रामिंग गाइड और "प्रोग्रामिंग बड़े पैमाने पर समांतर प्रोसेसर" और "सीयूडीए एप्लीकेशन डिज़ाइन और डेवलपमेंट" में हार्डवेयर आर्किटेक्चर को समर्पित अध्याय पढ़ा है; लेकिन मुझे एक सटीक जवाब नहीं मिला।
के आधार पर अपने जवाब के लिए धन्यवाद। मैंने संदर्भ पढ़े, लेकिन ऐसी कुछ चीजें हैं जिन्हें मैं आपके उत्तर में समझ नहीं पा रहा हूं।निम्नलिखित प्रश्नों में मैं मान रहा हूं कि हम 48 कोर (16 कोर * 3 "कोर ग्रुप") के साथ फर्मि आर्किटेक्चर का उपयोग कर रहे हैं: 1. आपने कोर और लेनदेन के बीच मैपिंग का उल्लेख किया है। यह किस तरह का मानचित्रण है? 2. संदर्भों से मुझे पता चला कि प्रत्येक "मूल समूह" प्रति घड़ी चक्र के अधिकांश आधा-वार (16 धागे) पर निष्पादित होता है। तो सिद्धांत रूप में यदि हमारे पास एक ही ब्लॉक में 48 धागे हैं, तो उन्हें 3 अर्ध-युद्ध में व्यवस्थित किया जाएगा और 48 कोर पर समानांतर में निष्पादित किया जाएगा। क्या मैं सही हू? – Daedalus
सीयूडीए कोर एकल परिशुद्धता एफपी इकाइयों की संख्या हैं। सीयूडीए कोर के संदर्भ में निष्पादन की सोच सही नहीं है। प्रत्येक वार में 32 धागे होते हैं। ये थ्रेड निष्पादन इकाइयों (उदाहरण के लिए 16 क्यूडा कोर) के समूह को जारी किए जाएंगे। एक ही घड़ी में सभी 48 कोरों को जारी करने के लिए दो वार्प शेड्यूलरों में से एक को एक सुपरपैकर जोड़ी के रिक को पूरा करने वाले एक वार्प का चयन करने की आवश्यकता होती है और दोनों निर्देशों को सीयूडीए कोर द्वारा निष्पादित एक प्रकार की आवश्यकता होती है। इसके अलावा अन्य वार शेड्यूलर को एक वार्प चुनना है जिसका अगला निर्देश सीयूडीए कोर द्वारा निष्पादित किया जाएगा। –
कोई आवश्यकता नहीं है कि एक ही ब्लॉक में युद्ध हो या ब्लॉक में एक ही प्रोग्राम काउंटर हो। –