CUDA कोर पर CUDA ब्लॉक / वार / थ्रेड मैप कैसे बनाते हैं?


142

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

सबसे पहले, मैं समझना चाहूंगा कि क्या मुझे ये तथ्य सीधे मिले:

  1. प्रोग्रामर एक कर्नेल लिखता है, और इसके निष्पादन को थ्रेड ब्लॉक की ग्रिड में व्यवस्थित करता है।

  2. प्रत्येक ब्लॉक को एक स्ट्रीमिंग मल्टीप्रोसेसर (SM) को सौंपा गया है। एक बार सौंपे जाने के बाद यह दूसरे एसएम में नहीं जा सकता।

  3. प्रत्येक एसएम अपने स्वयं के ब्लॉकों को वारप्स में विभाजित करता है (वर्तमान में 32 थ्रेड्स के अधिकतम आकार के साथ)। एक ताना में सभी धागे एसएम के संसाधनों पर समवर्ती रूप से निष्पादित होते हैं।

  4. एक धागे का वास्तविक निष्पादन SM में निहित CUDA कोर द्वारा किया जाता है। धागे और कोर के बीच कोई विशिष्ट मानचित्रण नहीं है।

  5. यदि एक ताना में 20 धागे होते हैं, लेकिन वर्तमान में केवल 16 कोर उपलब्ध हैं, तो ताना नहीं चलेगा।

  6. दूसरी ओर यदि किसी ब्लॉक में 48 धागे हैं, तो इसे 2 वार में विभाजित किया जाएगा और वे समानांतर में निष्पादित करेंगे बशर्ते कि पर्याप्त मेमोरी उपलब्ध हो।

  7. यदि कोई थ्रेड कोर पर शुरू होता है, तो यह मेमोरी एक्सेस के लिए या एक लंबे फ्लोटिंग पॉइंट ऑपरेशन के लिए रुका हुआ है, तो इसका निष्पादन अलग कोर पर फिर से शुरू हो सकता है।

क्या वे सही हैं?

अब, मेरे पास GeForce 560 Ti है, इसलिए विनिर्देशों के अनुसार यह 8 SM से सुसज्जित है, प्रत्येक में 48 CUDA कोर (कुल 384 कोर) हैं।

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

  1. मैं 48 थ्रेड्स में से प्रत्येक के 8 ब्लॉक बनाता हूं, ताकि प्रत्येक एसएम को निष्पादित करने के लिए 1 ब्लॉक हो। इस स्थिति में एसएम में समानांतर 48 धागे निष्पादित होंगे (उनके लिए उपलब्ध सभी 48 कोर का शोषण)?

  2. क्या कोई अंतर है अगर मैं 6 धागे के 64 ब्लॉक लॉन्च करता हूं? (यह मानते हुए कि उन्हें एसएम के बीच समान रूप से मैप किया जाएगा)

  3. अगर मैं निर्धारित काम में जीपीयू को "जलमग्न" करता हूं (उदाहरण के लिए प्रत्येक के लिए 1024 थ्रेड के 1024 ब्लॉक बना रहा हूं), तो क्या यह मान लेना उचित है कि सभी कोर एक निश्चित बिंदु पर उपयोग किए जाएंगे, और एक ही संगणना करेंगे (यह मानते हुए कि थ्रेड्स कभी नहीं स्टाल)?

  4. क्या प्रोफाइलर का उपयोग करके इन स्थितियों की जांच करने का कोई तरीका है?

  5. क्या इस सामान के लिए कोई संदर्भ है? मैंने CUDA प्रोग्रामिंग गाइड और "प्रोग्रामिंग में बड़े पैमाने पर समानांतर प्रोसेसर" और "CUDA एप्लिकेशन डिज़ाइन और विकास" के लिए हार्डवेयर आर्किटेक्चर को समर्पित अध्याय पढ़ा; लेकिन मुझे सटीक उत्तर नहीं मिला।


मैं एक टिप्पणी के रूप में जोड़ना चाहूंगा कि "क्यूडा कोर" क्या है। "CUDA कोर" या "निष्पादन इकाई" पूरी तरह से विखंडित पूर्णांक ALU और FPU है जो एक cuda थ्रेड में घड़ी चक्र के प्रति अंकगणितीय अनुदेश निर्देश को निष्पादित करता है।
बजे

जवाबों:


123

दो सबसे अच्छे संदर्भ हैं

  1. NVIDIA Fermi कम्प्यूट आर्किटेक्चर व्हाइटपर
  2. GF104 समीक्षा

मैं आपके प्रत्येक प्रश्न का उत्तर देने का प्रयास करूंगा।

प्रोग्रामर थ्रेड्स में काम करता है, थ्रेड को थ्रेड ब्लॉक में और थ्रेड ब्लॉक को ग्रिड में विभाजित करता है। गणना कार्य वितरक स्ट्रीमिंग मल्टीप्रोसेसर (एसएम) को थ्रेड ब्लॉक आवंटित करता है। एक बार जब एक थ्रेड ब्लॉक एक एसएम को वितरित किया जाता है, तो थ्रेड ब्लॉक के लिए संसाधनों को आवंटित किया जाता है (ताना और साझा मेमोरी) और थ्रेड्स को 32 थ्रेड्स के समूहों में विभाजित किया जाता है जिन्हें वॉर्प्स कहा जाता है। एक बार एक ताना आवंटित होने के बाद इसे एक सक्रिय ताना कहा जाता है। दो ताना शेड्यूलर प्रति चक्र में दो सक्रिय वॉर लेते हैं और वार को निष्पादन इकाइयों में भेजते हैं। निष्पादन इकाइयों और अनुदेश प्रेषण पर अधिक जानकारी के लिए 1 p.7-10 और 2 देखें

४ ’है । लेनिड (एक ताना में धागे सूचकांक) और एक कोर के बीच एक मानचित्रण है।

५ ’है । यदि एक ताना में 32 से कम धागे होते हैं तो ज्यादातर मामलों में इसे उसी तरह निष्पादित किया जाएगा जैसे कि इसमें 32 धागे हों। कई कारणों से वार्प्स में 32 से कम सक्रिय थ्रेड हो सकते हैं: थ्रेड्स की संख्या प्रति ब्लॉक 32 से विभाज्य नहीं है, प्रोग्राम एक डाइवर्जेंट ब्लॉक को निष्पादित करता है ताकि थ्रेड्स जो वर्तमान पथ को निष्क्रिय नहीं करते हैं या युद्ध में एक धागा बाहर निकलता है।

६ ’है । एक थ्रेड ब्लॉक को WarpsPerBlock = (ThreadsPerBlock + WarpSize - 1) / WarpSize में विभाजित किया जाएगा। तानाशाहों को एक ही थ्रेड ब्लॉक से दो वॉर को चुनने की कोई आवश्यकता नहीं है।

'’है । एक निष्पादन इकाई एक मेमोरी ऑपरेशन पर स्टाल नहीं करेगी। यदि कोई संसाधन उपलब्ध नहीं है, जब एक निर्देश भेजने के लिए तैयार है, तो संसाधन उपलब्ध होने पर अनुदेश को भविष्य में फिर से भेजा जाएगा। वारप्स बैरियर पर स्टाल कर सकते हैं, मेमोरी ऑपरेशंस, टेक्सचर ऑपरेशंस, डेटा डिपेंडेंसीज पर ... एक स्टॉप्ड ताना ताना कमांडर द्वारा चुने जाने के लिए अयोग्य है। फर्मी पर प्रति चक्र में कम से कम 2 योग्य वॉर होना उपयोगी है ताकि ताना शेड्यूलर एक निर्देश जारी कर सके।

GTX480 और GTX560 के बीच अंतर के लिए संदर्भ 2 देखें ।

यदि आप संदर्भ सामग्री (कुछ मिनट) पढ़ते हैं तो मुझे लगता है कि आप पाएंगे कि आपका लक्ष्य समझ में नहीं आता है। मैं आपकी बातों का जवाब देने की कोशिश करूंगा।

1 'है । यदि आप कर्नेल <<< 8, 48 >>> लॉन्च करते हैं, तो आपको 32 और 16 थ्रेड्स के 2 वॉर के साथ 8 ब्लॉक मिलेंगे। इस बात की कोई गारंटी नहीं है कि इन 8 ब्लॉकों को अलग-अलग एसएम को सौंपा जाएगा। यदि 2 ब्लॉक एक एसएम को आवंटित किए जाते हैं तो यह संभव है कि प्रत्येक ताना अनुसूचक एक ताना का चयन कर सकता है और ताना को निष्पादित कर सकता है। आप केवल 48 कोर में से 32 का उपयोग करेंगे।

२ ’है । 48 धागे के 8 ब्लॉक और 6 धागे के 64 ब्लॉक के बीच एक बड़ा अंतर है। मान लें कि आपके कर्नेल में कोई विचलन नहीं है और प्रत्येक थ्रेड 10 निर्देशों को निष्पादित करता है।

  • 48 थ्रेड्स के साथ 8 ब्लॉक = 16 ताना * 10 निर्देश = 160 निर्देश
  • 6 थ्रेड्स के साथ 64 ब्लॉक = 64 वार * 10 निर्देश = 640 निर्देश

इष्टतम दक्षता प्राप्त करने के लिए काम का विभाजन 32 थ्रेड्स के गुणकों में होना चाहिए। हार्डवेयर अलग-अलग वॉर से थ्रेड्स को कोट नहीं करेगा।

३ ’है । एक GTX560 में एक बार में 8 SM * 8 ब्लॉक = 64 ब्लॉक हो सकते हैं या यदि 8 कर्नेल रजिस्टर या साझा की गई मेमोरी को अधिकतम नहीं करते हैं तो 8 SM * 48 वॉर = 512 वॉरप हो सकते हैं। किसी भी समय काम के एक हिस्से में एसएम पर सक्रिय होंगे। प्रत्येक एसएम में कई निष्पादन इकाइयाँ (CUDA कोर से अधिक) हैं। किसी भी समय कौन से संसाधन उपयोग में हैं, यह एप्लिकेशन के तानाशाह और अनुदेश मिश्रण पर निर्भर है। यदि आप TEX संचालन नहीं करते हैं तो TEX इकाइयाँ निष्क्रिय हो जाएंगी। यदि आप एक विशेष फ़्लोटिंग पॉइंट ऑपरेशन नहीं करते हैं तो SUFU इकाइयाँ बेकार हो जाएंगी।

४ ’है । समांतर दृष्टि और दृश्य Profiler शो

ए। IPC निष्पादित किया गया

ख। IPC जारी किया

सी। सक्रिय चक्र प्रति सक्रिय युद्ध

घ। सक्रिय चक्र प्रति योग्य वॉरशिप (केवल दृष्टि)

इ। ताना स्टाल कारणों (केवल दृष्टि)

च। सक्रिय धागे प्रति निर्देश निष्पादित

प्रोफाइलर किसी भी निष्पादन इकाइयों के उपयोग प्रतिशत को नहीं दिखाता है। GTX560 के लिए एक मोटा अनुमान НIPC / MaxIPC होगा। MaxIPC के लिए मान लें कि GF100 (GTX480) 2 GF10x (GTX560) 4 है, लेकिन लक्ष्य 3 एक बेहतर लक्ष्य है।


1
आपके उत्तर के लिए धन्यवाद। मैं संदर्भों को पढ़ता हूं, लेकिन कुछ चीजें हैं जो मुझे आपके उत्तर में समझ नहीं आती हैं। निम्नलिखित प्रश्नों में मैं मान रहा हूं कि हम 48 कोर (16 कोर * 3 "कोर ग्रुप") के साथ फर्मी आर्किटेक्चर का उपयोग कर रहे हैं: 1. आपने कोर और लेनिड के बीच एक मैपिंग का उल्लेख किया है। यह किस प्रकार का मानचित्रण है? 2. मुझे उन संदर्भों से पता चला है कि प्रत्येक "कोर ग्रुप" प्रति घंटा चक्र के आधे भाग (16 धागे) पर चलता है। इसलिए सिद्धांत रूप में यदि हमारे पास एक ही ब्लॉक में 48 धागे हैं, तो उन्हें 3 अर्ध-वार में व्यवस्थित किया जाएगा और 48 कोर पर समानांतर में निष्पादित किया जाएगा। क्या मैं सही हू?
डेडलस

1
CUDA कोर एकल परिशुद्धता FP इकाइयों की संख्या है। CUDA कोर के संदर्भ में निष्पादन के बारे में सोचना सही नहीं है। प्रत्येक ताना में 32 धागे होते हैं। इन थ्रेड्स को निष्पादन इकाइयों (जैसे 16 क्यूडा कोर) के एक समूह को जारी किया जाएगा। एक ही घड़ी में सभी 48 कोर को जारी करने के लिए दो ताना अनुसूचियों में से एक को एक ताना का चयन करने की आवश्यकता होती है जो एक सुपरस्क्लेयर जोड़ी के रीक से मिलती है और दोनों निर्देशों को क्यूडा कोर द्वारा निष्पादित एक प्रकार का होना चाहिए। इसके अतिरिक्त अन्य तानाशाहों को भी एक ताना-बाना चुनना होगा जिसका अगला निर्देश CUDA कोर द्वारा निष्पादित किया जाएगा।
ग्रेग स्मिथ

1
इस बात की कोई आवश्यकता नहीं है कि वॉरपैक एक ही ब्लॉक में हों या किसी ब्लॉक में वॉर्प्स समान प्रोग्राम काउंटर हो।
ग्रेग स्मिथ

2
आप उदाहरण में प्रत्येक अनुसूचक एक ताना उठा रहा है और 1 निर्देश जारी कर रहा है। इस मामले में निष्पादन इकाइयों के केवल 2 समूहों का उपयोग किया जाएगा। अधिक निष्पादन इकाइयों का उपयोग करने के लिए, अनुसूचियों में से 1 को दोहरे मुद्दे को जारी करना होगा। जैसा कि संदर्भों में संकेत दिया गया है कि कई प्रकार की निष्पादन इकाइयाँ हैं (न कि सिर्फ़ कॉडा कोर को गढ़ा गया है) और निर्देश युग्मन नियम (अच्छी तरह से प्रलेखित नहीं) हैं जो कि शेड्यूल करने वालों के लिए दोहरे मुद्दे पर मिलना चाहिए।
ग्रेग स्मिथ

1
@GregSmith मैं यह जानने के लिए पूरे वेब पर खोज कर रहा हूं कि फरमी वास्तुकला में एसएम के प्रति 8 सक्रिय ब्लॉक कहां से आते हैं। इसका उल्लेख फर्मी व्हाइटपर में भी नहीं किया गया है। क्या आपके पास इसके बारे में कोई और संदर्भ है?
ग्रेग के।

8

"ई। अगर एक ताना में 20 धागे होते हैं, लेकिन वर्तमान में केवल 16 कोर उपलब्ध हैं, तो ताना नहीं चलेगा।"

गलत है। आप कोर को उनके सामान्य अर्थों (सीपीयू में भी इस्तेमाल किया जाता है) में भ्रमित कर रहे हैं - एक GPU में "मल्टीप्रोसेसर" की संख्या, एनवीडिया मार्केटिंग स्पीक में कोर के साथ ("हमारे कार्ड में हजारों CUDA कोर हैं")।

एक ताना खुद को केवल एक ही कोर (= मल्टीप्रोसेसर) पर निर्धारित किया जा सकता है, और एक ही समय में 32 धागे तक चला सकता है; यह एक से अधिक कोर का उपयोग नहीं कर सकता है।

संख्या "48 वॉरप्स" अधिकतम संख्या में सक्रिय वॉरप्स (युद्धक हैं, जिन्हें अगले चक्र में किसी भी चक्र में काम के लिए शेड्यूल किया जा सकता है), मल्टीप्रोसेसर पर, कंप्यूट कैपेसिटी 2.x के साथ एनवीडिया जीपीयू पर; और यह संख्या 1536 = 48 x 32 थ्रेड से मेल खाती है।

इस वेबिनार पर आधारित उत्तर


@GregSmith: इसे संबोधित करने के लिए उत्तर का संपादन किया। यह ठीक है कि आप इसके साथ धैर्य रखते थे, लेकिन - पांच साल हो गए ...
einpoklum

सिंगल कोर (= मल्टीप्रोसेसर)? मुझे लगता है कि प्रश्न शब्दावली सिंगल कोर = प्रोसेसर को मानता है और मल्टीप्रोसेसर को नहीं। आपकी शब्दावली के साथ आपका उत्तर सही है।
आदर्श
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.