2012-05-05 12 views
104

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

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

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

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

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

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

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

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

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

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

अब, मेरे पास एक GeForce 560 टीआई है, इसलिए विनिर्देशों के मुताबिक यह 8 एसएम से लैस है, प्रत्येक में 48 सीयूडीए कोर (कुल में 384 कोर) हैं।

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

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

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

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

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

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

उत्तर

94

सबसे अच्छा संदर्भ के दो

  1. NVIDIA Fermi Compute Architecture Whitepaper
  2. GF104 Reviews

मैं अपने प्रत्येक प्रश्न का उत्तर देने की कोशिश करेंगे कर रहे हैं।

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

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

5 '। यदि एक वार्प में 32 धागे से कम होता है तो अधिकांश मामलों में इसे उसी तरह निष्पादित किया जाएगा जैसे उसके 32 धागे हैं। कई कारणों से वॉरप्स में 32 से कम सक्रिय धागे हो सकते हैं: प्रति ब्लॉक धागे की संख्या 32 से विभाजित नहीं होती है, कार्यक्रम एक अलग ब्लॉक निष्पादित करता है, इसलिए मौजूदा पथ नहीं लेते धागे निष्क्रिय या चिह्नित थ्रू में धागे चिह्नित होते हैं।

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

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

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

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

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

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

  • 8 ब्लॉकों = 16 warps * 10 निर्देश = 160 निर्देश
  • 6 धागे के साथ 64 ब्लॉकों = 64 warps * 10 निर्देश = 640 निर्देश

आदेश में इष्टतम दक्षता प्राप्त करने के लिए काम का विभाजन 32 धागे के गुणकों में होना चाहिए। हार्डवेयर विभिन्न warps से धागे coalesce नहीं होगा।

3 '। एक GTX560 में एक समय में 8 एसएम * 8 ब्लॉक = 64 ब्लॉक हो सकते हैं या 8 एसएम * 48 warps = 512 warps अगर कर्नेल रजिस्टरों या साझा स्मृति को अधिकतम नहीं करता है। किसी भी समय काम के एक हिस्से पर एसएम पर सक्रिय होगा। प्रत्येक एसएम में कई निष्पादन इकाइयां होती हैं (सीयूडीए कोर से अधिक)। किसी भी समय पर कौन से संसाधन उपयोग में हैं, वारंटी शेड्यूलर और एप्लिकेशन के निर्देश मिश्रण पर निर्भर है। यदि आप टेक्स ऑपरेशंस नहीं करते हैं तो टेक्स इकाइयां निष्क्रिय होंगी। यदि आप एक विशेष फ्लोटिंग प्वाइंट ऑपरेशन नहीं करते हैं तो एसयूएफयू इकाइयां निष्क्रिय हो जाएंगी।

4 '। समांतर नाइट और विजुअल प्रोफाइलर शो

ए। निष्पादित आईपीसी

बी। जारी आईपीसी

सी। सक्रिय चक्र प्रति सक्रिय चक्र

डी। प्रति सक्रिय चक्र योग्य योग्य युद्ध (केवल रात)

ई। वार्प स्टॉल कारण (केवल रात)

एफ। प्रति निर्देश सक्रिय थ्रेड

प्रोफाइलर किसी भी निष्पादन इकाइयों का उपयोग प्रतिशत नहीं दिखाता है। GTX560 के लिए एक अनुमानित अनुमान जारी किया जाएगा UPIPC/MaxIPC। मैक्सआईपीसी के लिए जीएफ 100 (जीटीएक्स 480) 2 जीएफ 10 एक्स (जीटीएक्स 560) 4 है लेकिन लक्ष्य 3 एक बेहतर लक्ष्य है।

+0

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

+0

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

+0

कोई आवश्यकता नहीं है कि एक ही ब्लॉक में युद्ध हो या ब्लॉक में एक ही प्रोग्राम काउंटर हो। –

5

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

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

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

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

उत्तर this webinar

+0

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

+0

सिंगल कोर (= मल्टीप्रोसेसर)? मुझे लगता है कि प्रश्न शब्दावली एकल कोर = प्रोसेसर मानता है और मल्टीप्रोसेसर नहीं। आपकी शब्दावली के साथ आपका जवाब सही है। – Adarsh

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