2013-07-11 3 views
26

मैंने हाल ही में अपने सिर को प्राप्त किया है कि कैसे एनवीसीसी विभिन्न गणना आर्किटेक्चर के लिए CUDA डिवाइस कोड को संकलित करता है।एनवीडिया के एनवीसीसी कंपाइलर में एकाधिक "आर्क" झंडे का उपयोग करने का क्या उद्देश्य है?

मेरी समझ से, एनवीसीसी के -gencode विकल्प का उपयोग करते समय, "आर्क" प्रोग्रामर के अनुप्रयोग द्वारा आवश्यक न्यूनतम गणना आर्किटेक्चर है, और न्यूनतम डिवाइस गणना आर्किटेक्चर भी है जो एनवीसीसी का जेआईटी कंपाइलर पीटीएक्स कोड संकलित करेगा।

मैं यह भी समझता है कि -gencode के "कोड" पैरामीटर गणना वास्तुकला जो NVCC पूरी तरह से, के लिए आवेदन संकलित ऐसी है कि कोई JIT संकलन आवश्यक है।

विभिन्न CUDA परियोजना Makefiles के निरीक्षण के बाद, मैंने देखा है निम्नलिखित नियमित रूप से हो:

-gencode arch=compute_20,code=sm_20 
-gencode arch=compute_20,code=sm_21 
-gencode arch=compute_21,code=sm_21 

और कुछ पढ़ने के बाद, मैंने पाया कि कई डिवाइस आर्किटेक्चर एक भी बाइनरी फ़ाइल में के लिए संकलित किया जा सकता है - में इस मामले में sm_20, sm_21।

मेरे प्रश्न हैं क्यों इतने सारे आर्क/कोड जोड़े आवश्यक हैं? क्या ऊपर दिए गए "आर्क" के सभी मान हैं?

कि और के बीच अंतर क्या है कहना:

-arch compute_20 
-code sm_20 
-code sm_21 

स्वचालित रूप से चयनित "कट्टर" क्षेत्र में जल्द से जल्द आभासी वास्तुकला है, या कुछ अन्य अस्पष्ट व्यवहार है?

क्या कोई अन्य संकलन और रनटाइम व्यवहार है जिसके बारे में मुझे अवगत होना चाहिए?

मैं मैनुअल, http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation पढ़ा है और मैं अभी भी स्पष्ट के बारे में क्या संकलन या क्रम में क्या होता है नहीं कर रहा हूँ।

चीयर्स,

जेम्स। -> PTX -> एस.ए.एस.एस.

आभासी वास्तुकला (जैसे compute_20, जो कुछ भी -arch compute... द्वारा निर्दिष्ट किया जाता

CUDA C/C++ डिवाइस कोड स्रोत:

उत्तर

31

मोटे तौर पर, कोड संकलन प्रवाह इस प्रकार है) निर्धारित करता है कि किस प्रकार का पीटीएक्स कोड उत्पन्न होगा। अतिरिक्त स्विच (उदा। -code sm_21) निर्धारित करें कि किस प्रकार का SASS कोड उत्पन्न होगा। SASS वास्तव में एक GPU (मशीन भाषा) के लिए निष्पादन योग्य ऑब्जेक्ट कोड है। एक निष्पादन योग्य में एसएएसएस और/या पीटीएक्स के कई संस्करण हो सकते हैं, और एक रनटाइम लोडर तंत्र है जो वास्तव में इस्तेमाल होने वाले जीपीयू के आधार पर उपयुक्त संस्करणों को चुनता है।

आप बाहर बिंदु के रूप में, GPU के आपरेशन के काम विशेषताओं में से एक JIT-संकलन है। जीआईटी-संकलन GPU ड्राइवर द्वारा किया जाएगा (CUDA टूलकिट को स्थापित करने की आवश्यकता नहीं है) किसी भी समय उपयुक्त पीटीएक्स कोड उपलब्ध है लेकिन एक उपयुक्त SASS कोड नहीं है।

कई वर्चुअल आर्किटेक्चर (यानी पीटीएक्स के कई संस्करण) सहित एक लाभ यह है कि आपके पास लक्ष्य GPU उपकरणों की एक विस्तृत विविधता के साथ निष्पादन योग्य संगतता है (हालांकि कुछ डिवाइस आवश्यक एसएएसएस बनाने के लिए एक जेआईटी-संकलन ट्रिगर कर सकते हैं)।

एकाधिक "असली जीपीयू लक्ष्य" (यानी।एकाधिक SASS संस्करण) यह है कि आप जेआईटी-संकलन चरण से बच सकते हैं, जब उनमें से एक लक्ष्य डिवाइस मौजूद है।

यदि आप विकल्पों का एक खराब सेट निर्दिष्ट करते हैं, तो निष्पादन योग्य बनाना संभव है जो किसी विशेष GPU पर (सही ढंग से) नहीं चलाएगा।

इनमें से बहुत से विकल्पों को निर्दिष्ट करने का एक संभावित नुकसान कोड आकार ब्लोट है। एक और संभावित नुकसान संकलन समय है, जो आमतौर पर अधिक विकल्प निर्दिष्ट करते समय आमतौर पर लंबा होगा।

ऐसे एक्स्ट्यूटेबल्स बनाना भी संभव है जिनमें कोई पीटीएक्स न हो, जो उनके आईपी को अस्पष्ट करने की कोशिश करने वालों के लिए रूचि हो।

code स्विच के लिए जेआईटी के लिए उपयुक्त पीटीएक्स बनाना specifying a virtual architecture द्वारा किया जाना चाहिए।

+1

क्षमा याचना, और धन्यवाद। मैं कई वास्तविक आर्किटेक्चर के लिए पीटीएक्स को जेआईटी संकलन के उद्देश्य को समझता हूं, लेकिन क्या ऐसे सभी पुराने पीटीएक्स आर्किटेक्चर, या केवल न्यूनतम विनिर्देश पीटीएक्स को शामिल करना आवश्यक है? उदाहरण के लिए, यदि मैं चाहता हूं कि कोड जितना संभव हो सके उतने GPU पर चलाना चाहें, तो क्या मैं कह सकता हूं, - compute_11, 12 13 ... 30, 35, या बस शामिल करें-compute_11? बेस्ट, जेम्स। –

+3

आप केवल '-arch compute_11' निर्दिष्ट कर सकते हैं और आप सीसी 1.1 पीटीएक्स कोड उत्पन्न करेंगे। अब और भविष्य में सभी जीपीयू पीटीएक्स के इस संस्करण से कुछ उपयोगी मशीन कोड (सीसी 1.0 उपकरणों के अपवाद के साथ) में जेआईटी-संकलन करने में सक्षम होना चाहिए। हालांकि, अतिरिक्त पीटीएक्स संस्करणों को निर्दिष्ट करके, आप "नया" पीटीएक्स जोड़कर, एक नए आर्किटेक्चर का बेहतर लाभ लेने का अवसर प्रदान कर सकते हैं, और इस प्रकार आपका कोड एक सीसी 3.0 डिवाइस कह सकता है, यदि आप 'compute_30' भी निर्दिष्ट किया गया। यह कोड आकार/संकलन समय और सर्वोत्तम perf के बीच एक व्यापार है। आपकी माइलेज भिन्न हो सकती है। –

+0

अब सभी स्पष्ट, महान उत्तरों। आपके समय के लिए धन्यवाद! –

0

एकाधिक -arch झंडे का उद्देश्य सशर्त संकलन (यानी, #ifdef का उपयोग करके) अलग-अलग अनुकूलित कोड पथों के लिए __CUDA_ARCH__ मैक्रो का उपयोग करना है।

यहाँ देखें: तुम्हारा के लिए देर से उत्तर के लिए http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-identification-macro

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