सामान्य रूप से आप अपने डेटा से मेल खाने के लिए अपने ब्लॉक/ग्रिड को आकार देना चाहते हैं और एक साथ अधिभोग को अधिकतम करना चाहते हैं, यानी, एक समय में कितने धागे सक्रिय हैं। अधिभोग को प्रभावित करने वाले प्रमुख कारक साझा स्मृति उपयोग, पंजीकरण का उपयोग, और थ्रेड ब्लॉक आकार साझा किए जाते हैं।
एक सीयूडीए सक्षम जीपीयू की प्रोसेसिंग क्षमता एसएम (स्ट्रीमिंग मल्टीप्रोसेसर) में विभाजित है, और एसएम की संख्या वास्तविक कार्ड पर निर्भर करती है, लेकिन यहां हम सादगी के लिए एक एकल एसएम पर ध्यान केंद्रित करेंगे (वे सभी एक ही व्यवहार करते हैं)। प्रत्येक एसएम में 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) तेजी से पूर्ण हो सकते हैं क्योंकि विशेष रूप से धीमी ब्लॉक कम संसाधनों को हॉग करेगा, लेकिन यह कोड पर बहुत निर्भर है।
रजिस्टरों और साझा स्मृति के संबंध में, उस पर ध्यान दें, क्योंकि यह आपके अधिभोग को सीमित कर सकता है। साझा स्मृति पूरी एसएम के लिए सीमित है, इसलिए इसे उस राशि में उपयोग करने का प्रयास करें जो एसएम पर अभी भी फिट होने के लिए जितना संभव हो उतना ब्लॉक देता है। रजिस्टर के उपयोग के लिए भी यही है। दोबारा, ये संख्या गणना क्षमता पर निर्भर करती हैं और विकिपीडिया पेज पर सारणीबद्ध पाई जा सकती हैं। सौभाग्य!
हम डिवाइस क्षमता का उपयोग कर ब्लॉक/धागे की गणना क्यों नहीं कर सकते? मान लीजिए मेरे पास 2.1 क्षमता (जीटी 520) वाला डिवाइस है, इसलिए इसमें 48 एसएम, 8 ब्लॉक प्रत्येक ब्लॉक और 1024 थ्रेड प्रति ब्लॉक हैं। मुझे यह नहीं मिल सकता है, क्षमा करें अगर मेरा प्रश्न मूर्खतापूर्ण है। – greg
क्या कुछ सीयूडीए एपीआई का उपयोग करके प्रोग्राम प्रति ब्लॉक की अधिकतम संख्या निर्धारित करने का कोई तरीका है? –