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