2012-08-22 11 views
9

में शुरू किया जा सकता है, मैं फर्मि जीपीयू में लॉन्च किए जा सकने वाले थ्रेड की अधिकतम संख्या के बारे में उलझन में हूं।थ्रेड की अधिकतम संख्या जिसे एक एकल CUDA कर्नेल

मेरा जीटीएक्स 570 डिवाइस क्वेरी निम्नलिखित बताती है।

एक CUDA कर्नेल हम सबसे 65536 ब्लॉक पर शुरू कर सकते हैं के लिए:

Maximum number of threads per block:   1024 
    Maximum sizes of each dimension of a block: 1024 x 1024 x 64 
    Maximum sizes of each dimension of a grid:  65535 x 65535 x 65535 

मेरी समझ से, मैं के रूप में उपरोक्त कथन को समझते हैं। प्रत्येक लॉन्च ब्लॉक में 1024 थ्रेड हो सकते हैं। इसलिए सिद्धांत रूप में, मैं 65536 * 1024 (= 67108864) थ्रेड तक लॉन्च कर सकता हूं।

क्या यह सही है? क्या होगा यदि मेरा धागा बहुत सारे रजिस्टरों का उपयोग करता है? क्या हम अभी भी इस सैद्धांतिक अधिकतम संख्या में धागे तक पहुंचने में सक्षम होंगे?

सीयूडीए कर्नेल लिखने और लॉन्च करने के बाद, मुझे कैसे पता चलेगा कि मैंने लॉन्च किए गए धागे और ब्लॉक की संख्या वास्तव में को तत्काल कर दिया गया है। मेरा मतलब है कि मैं नहीं चाहता कि जीपीयू कुछ जंक की गणना करे, या अजीब तरीके से व्यवहार करे, अगर मेरे पास उस विशेष कर्नेल के लिए संभवतः अधिक धागे को तुरंत मौका दिया गया है।

+0

यह आपकी मदद कर सकता है: http://stackoverflow.com/questions/2392250/understanding-cuda-grid-dimensions-block-dimensions-and-threads- संगठनात्मक- – user1154664

उत्तर

17

एक सीयूडीए कर्नेल के लिए हम सबसे अधिक 65536 ब्लॉक लॉन्च कर सकते हैं। प्रत्येक लॉन्च ब्लॉक में 1024 थ्रेड तक हो सकते हैं। इसलिए सिद्धांत रूप में, मैं 651236 * 1024 (= 67108864) धागे तक लॉन्च कर सकता हूं।

नहीं यह सही नहीं है। आप 65535 x 65535 x 65535 ब्लॉक तक की ग्रिड लॉन्च कर सकते हैं, और प्रत्येक ब्लॉक में प्रति ब्लॉक अधिकतम 1024 थ्रेड होते हैं, हालांकि प्रति थ्रेड संसाधन सीमा प्रति ब्लॉक के थ्रेड की कुल संख्या को अधिकतम से कम तक सीमित कर सकती है।

क्या होगा यदि मेरा धागा बहुत रजिस्ट्रार का उपयोग करता है? क्या हम अभी भी इस सैद्धांतिक अधिकतम धागे की संख्या तक पहुंच पाएंगे?

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

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

यदि आप एक अवैध निष्पादन कॉन्फ़िगरेशन (इसलिए गलत ब्लॉक आकार या ग्रिड आकार) चुनते हैं तो कर्नेल लॉन्च नहीं होगा और रनटाइम cudaErrorInvalidConfiguration त्रुटि संदेश जारी करेगा। आप किसी भी कर्नेल लॉन्च की स्थिति की जांच के लिए मानक cudaPeekAtLastError() और cudaGetLastError() का उपयोग कर सकते हैं।

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