2010-12-08 13 views
41

मैं सीयूडीए प्रतिमान के लिए नया हूं। मेरा सवाल प्रति ब्लॉक धागे की संख्या, और प्रति ग्रिड ब्लॉक निर्धारित करने में है। क्या कला और परीक्षण में थोड़ा सा खेलता है? जो मैंने पाया है वह है कि इन उदाहरणों के लिए कई उदाहरणों को मनमाने ढंग से चुना गया है।सीयूडीए प्रति ब्लॉक धागे का निर्धारण, प्रति ग्रिड ब्लॉक

मैं एक समस्या पर विचार कर रहा हूं जहां मैं किसी भी आकार के मैट्रिस - गुणा के लिए एक विधि को पारित करने में सक्षम होगा। इसलिए, सी के प्रत्येक तत्व (जैसे सी = ए * बी) की गणना एक थ्रेड द्वारा की जाएगी। इस मामले में आप थ्रेड/ब्लॉक, ब्लॉक/ग्रिड कैसे निर्धारित करेंगे?

उत्तर

66

सामान्य रूप से आप अपने डेटा से मेल खाने के लिए अपने ब्लॉक/ग्रिड को आकार देना चाहते हैं और एक साथ अधिभोग को अधिकतम करना चाहते हैं, यानी, एक समय में कितने धागे सक्रिय हैं। अधिभोग को प्रभावित करने वाले प्रमुख कारक साझा स्मृति उपयोग, पंजीकरण का उपयोग, और थ्रेड ब्लॉक आकार साझा किए जाते हैं।

एक सीयूडीए सक्षम जीपीयू की प्रोसेसिंग क्षमता एसएम (स्ट्रीमिंग मल्टीप्रोसेसर) में विभाजित है, और एसएम की संख्या वास्तविक कार्ड पर निर्भर करती है, लेकिन यहां हम सादगी के लिए एक एकल एसएम पर ध्यान केंद्रित करेंगे (वे सभी एक ही व्यवहार करते हैं)। प्रत्येक एसएम में 32 बिट रजिस्टरों की एक सीमित संख्या होती है, साझा स्मृति, अधिकतम सक्रिय ब्लॉक, और सक्रिय धागे की अधिकतम संख्या होती है। ये संख्या आपके जीपीयू की सीसी (गणना क्षमता) पर निर्भर करती हैं और विकिपीडिया लेख http://en.wikipedia.org/wiki/CUDA के बीच में पाई जा सकती हैं।

सबसे पहले, आपका थ्रेड ब्लॉक आकार हमेशा 32 का एक होना चाहिए, क्योंकि कर्नेल युद्धों (32 धागे) में निर्देश जारी करते हैं।उदाहरण के लिए, यदि आपके पास 50 धागे का ब्लॉक आकार है, तो GPU अभी भी 64 थ्रेड तक कमांड जारी करेगा और आप उन्हें बर्बाद कर देंगे।

दूसरा, साझा स्मृति और रजिस्टरों के बारे में चिंता करने से पहले, आकार करने के लिए अपने ब्लॉक है कि आपके कार्ड की गणना क्षमता के अनुरूप धागे और ब्लॉक की अधिकतम संख्या के आधार पर प्रयास करें। कभी-कभी ऐसा करने के कई तरीके हैं ... उदाहरण के लिए, प्रत्येक सीएम 3.0 कार्ड में 16 सक्रिय ब्लॉक और 2048 सक्रिय थ्रेड हो सकते हैं। इसका मतलब है कि यदि आपके पास प्रति ब्लॉक 128 धागे हैं, तो आप 2048 थ्रेड सीमा को मारने से पहले अपने एसएम में 16 ब्लॉक फिट कर सकते हैं। यदि आप 256 धागे का उपयोग करते हैं, तो आप केवल 8 फिट कर सकते हैं, लेकिन आप अभी भी सभी उपलब्ध थ्रेड का उपयोग कर रहे हैं और अभी भी पूर्ण अधिभोग होगा। हालांकि प्रति ब्लॉक 64 थ्रेड का उपयोग केवल 16 थ्रेड का उपयोग करेगा जब 16 ब्लॉक सीमा हिट होगी, इसलिए केवल 50% अधिभोग। यदि साझा स्मृति और पंजीकरण का उपयोग एक बाधा नहीं है, तो यह आपकी मुख्य चिंता होनी चाहिए (आपके डेटा आयामों के अलावा)।

अपने ग्रिड के विषय पर ... अपने ग्रिड में ब्लॉक शुरू करने के लिए एसएमएस पर फैला दिया जाता है, और फिर शेष ब्लॉकों एक पाइप लाइन में रखा जाता है। जैसे ही ब्लॉक को लेने के लिए एसएम में पर्याप्त संसाधन हैं, प्रोसेसिंग के लिए ब्लॉक को एसएम में स्थानांतरित कर दिया जाता है। दूसरे शब्दों में, जैसे कि एसएम में पूर्ण ब्लॉक होते हैं, नए स्थानांतरित हो जाते हैं। आप तर्क दे सकते हैं कि छोटे ब्लॉक (पिछले उदाहरण में 256 के बजाय 128) तेजी से पूर्ण हो सकते हैं क्योंकि विशेष रूप से धीमी ब्लॉक कम संसाधनों को हॉग करेगा, लेकिन यह कोड पर बहुत निर्भर है।

रजिस्टरों और साझा स्मृति के संबंध में, उस पर ध्यान दें, क्योंकि यह आपके अधिभोग को सीमित कर सकता है। साझा स्मृति पूरी एसएम के लिए सीमित है, इसलिए इसे उस राशि में उपयोग करने का प्रयास करें जो एसएम पर अभी भी फिट होने के लिए जितना संभव हो उतना ब्लॉक देता है। रजिस्टर के उपयोग के लिए भी यही है। दोबारा, ये संख्या गणना क्षमता पर निर्भर करती हैं और विकिपीडिया पेज पर सारणीबद्ध पाई जा सकती हैं। सौभाग्य!

+0

हम डिवाइस क्षमता का उपयोग कर ब्लॉक/धागे की गणना क्यों नहीं कर सकते? मान लीजिए मेरे पास 2.1 क्षमता (जीटी 520) वाला डिवाइस है, इसलिए इसमें 48 एसएम, 8 ब्लॉक प्रत्येक ब्लॉक और 1024 थ्रेड प्रति ब्लॉक हैं। मुझे यह नहीं मिल सकता है, क्षमा करें अगर मेरा प्रश्न मूर्खतापूर्ण है। – greg

+0

क्या कुछ सीयूडीए एपीआई का उपयोग करके प्रोग्राम प्रति ब्लॉक की अधिकतम संख्या निर्धारित करने का कोई तरीका है? –

14

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

प्रति ब्लॉक धागे की संख्या का चयन करना बहुत जटिल है। अधिकांश सीयूडीए एल्गोरिदम संभावनाओं की एक बड़ी श्रृंखला स्वीकार करते हैं, और विकल्प कर्नेल को सबसे अधिक कुशलतापूर्वक चलाने के आधार पर आधारित है। थ्रेड शेड्यूलिंग हार्डवेयर कैसे काम करता है, इसकी वजह से यह लगभग हमेशा 32 का एक और कम से कम 64 है। एक पहला प्रयास के लिए अच्छा चुनाव 128 या 256.

+0

क्या आप प्रति ब्लॉक निरंतर धागे के लिए अपने तर्क की बेहतर व्याख्या दे सकते हैं? (या एक प्रासंगिक लेख को भी जोड़ना)। बहुत धन्यवाद, –

16

http://developer.download.nvidia.com/compute/cuda/CUDA_Occupancy_calculator.xls

CUDA अधिभोग कैलक्यूलेटर आप किसी दिए गए CUDA कर्नेल द्वारा एक GPU की मल्टीप्रोसेसर अधिभोग गणना करने के लिए अनुमति देता है। मल्टीप्रोसेसर अधिभोग जीपीयू के मल्टीप्रोसेसर पर समर्थित अधिकतम संख्या में युद्धों के सक्रिय युद्धों का अनुपात है। डिवाइस पर प्रत्येक मल्टीप्रोसेसर में सीयूडीए प्रोग्राम थ्रेड्स द्वारा उपयोग के लिए उपलब्ध एन रजिस्टरों का एक सेट होता है। ये रजिस्ट्रार एक साझा संसाधन हैं जो मल्टीप्रोसेसर पर निष्पादित थ्रेड ब्लॉक के बीच आवंटित किए जाते हैं। CUDA कंपाइलर एक साथ मशीन में सक्रिय थ्रेड ब्लॉक की संख्या को अधिकतम करने के लिए रजिस्टर उपयोग को कम करने का प्रयास करता है। एक कार्यक्रम के एक गिरी जिसके लिए रजिस्टर धागा बार धागा ब्लॉक आकार अधिक से अधिक एन से, लांच असफल हो जायेगी है प्रति इस्तेमाल किया ...

2

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

उदाहरण के लिए, संदर्भ स्विचिंग के संदर्भ में, 32 कार्यों में से कोई भी एक ही काम करता है। तो 1 डी मामले के लिए, 64 थ्रेड के साथ 1 ब्लॉक लॉन्च करना या 32 थ्रेड के साथ 2 ब्लॉक प्रत्येक ग्लोबल मेमोरी एक्सेस के लिए कोई फर्क नहीं पड़ता है। हालांकि, अगर हाथ में समस्या स्वाभाविक रूप से 1 लंबाई -64 वेक्टर में विघटित हो जाती है, तो पहला विकल्प बेहतर होगा (कम मेमोरी ओवरहेड, प्रत्येक थ्रेड एक ही साझा स्मृति तक पहुंच सकता है) दूसरे की तुलना में।

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