2008-10-28 14 views
33

जब CUDA अनुप्रयोगों लेखन, आप कर सकते हैं या तो के रूप में इस छवि पर सचित्र चालक के स्तर पर या क्रम स्तर पर काम (पुस्तकालयों CUFFT और CUBLAS उन्नत गणित के लिए कर रहे हैं):CUDA ड्राइवर एपीआई

CUDA layer model

मुझे लगता है कि दोनों के बीच ट्रेडऑफ निम्न-एवल एपीआई के लिए प्रदर्शन में वृद्धि हुई है लेकिन कोड की जटिल जटिलता की लागत पर। ठोस मतभेद क्या हैं और क्या कोई महत्वपूर्ण चीजें हैं जो आप उच्च स्तरीय एपीआई के साथ नहीं कर सकते हैं?

मैं सी # के साथ इंटरऑप के लिए CUDA.net का उपयोग कर रहा हूं और यह ड्राइवर API की एक प्रति के रूप में बनाया गया है। यह सी # में बहुत जटिल कोड लिखने को प्रोत्साहित करता है जबकि सी ++ समकक्ष रनटाइम एपीआई का उपयोग करके अधिक सरल होगा। क्या ऐसा करने से जीतने के लिए कुछ भी है? एक लाभ जो मैं देख सकता हूं वह यह है कि शेष सी # कोड के साथ बुद्धिमान त्रुटि प्रबंधन को एकीकृत करना आसान है।

+4

एक ड्राइवर एपीआई का लाभ अन्य भाषाओं में कर्नेल लिखने के लिए समर्थन जोड़ने संकलक डेवलपर्स के लिए हो सकता है कि सी –

उत्तर

31

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

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

स्पष्ट रूप से अधिक विस्तृत डिवाइस जानकारी को रनटाइम एपीआई के माध्यम से ड्राइवर एपीआई के माध्यम से पूछताछ की जा सकती है। उदाहरण के लिए, डिवाइस पर उपलब्ध मुफ्त मेमोरी केवल ड्राइवर एपीआई के माध्यम से पूछताछ की जा सकती है।

CUDA प्रोग्रामर की गाइड से:

यह दो एपीआई से बना है:

  • एक निम्न स्तर एपीआई CUDA ड्राइवर एपीआई कहा जाता है,
  • एक उच्च स्तर एपीआई कहा जाता है CUDA रनटाइम एपीआई जिसे सीयूडीए ड्राइवर एपीआई के शीर्ष पर लागू किया गया है।

ये एपीआई पारस्परिक रूप से अनन्य हैं: किसी एप्लिकेशन को या तो एक या अन्य का उपयोग करना चाहिए।

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

इसके विपरीत, CUDA ड्राइवर एपीआई अधिक कोड की आवश्यकता है, कार्यक्रम और डिबग करने के लिए कठिन है, लेकिन नियंत्रण का एक बेहतर स्तर प्रदान करता है और बाद से यह केवल cubin वस्तुओं (धारा 4.2.5 देखें) के साथ सौदा भाषा-स्वतंत्र है । विशेष रूप से, को CUDA ड्राइवर API का उपयोग करके कर्नेल को कॉन्फ़िगर और लॉन्च करना अधिक कठिन है, क्योंकि निष्पादन कॉन्फ़िगरेशन और कर्नेल पैरामीटर को खंड 4.2.3 में वर्णित निष्पादन कॉन्फ़िगरेशन सिंटैक्स के बजाय स्पष्ट फ़ंक्शन कॉल के साथ निर्दिष्ट किया जाना चाहिए। साथ ही, डिवाइस इम्यूलेशन (अनुभाग 4.5.2.9 देखें) CUDA ड्राइवर API के साथ काम नहीं करता है।

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

+2

की CUDA सबसेट एक प्रशस्ति पत्र है कि है? यदि ऐसा है, तो मुझे यह नहीं मिल रहा है। क्या आप सटीक दस्तावेज़ नाम और अध्याय का नाम दे सकते हैं जहां यह पाया जाता है? – dialer

+5

'ये एपीआई पारस्परिक रूप से अनन्य हैं': नए CUDA संस्करणों के साथ यह अब सत्य नहीं है। अब प्रलेखन में कहा गया है कि एक एप्लिकेशन रनटाइम एपीआई कोड को ड्राइवर एपीआई कोड के साथ मिश्रित कर सकता है। 'सीएफआर भी। http://stackoverflow.com/a/27014990/1938163 –

2

महत्वपूर्ण बातों की एक जोड़ी गौर करने योग्य

पहले API के बीच मतभेद केवल मेजबान साइड कोड पर लागू होते हैं। कर्नल बिल्कुल वही हैं। मेजबान पक्ष पर ड्राइवर एपीआई की जटिलता बहुत छोटी है, मौलिक मतभेद हैं:

ड्राइवर एपीआई में आपके पास कार्यक्षमता तक पहुंच है जो रनटाइम एपीआई में संदर्भों में उपलब्ध नहीं है।

एमुलेटर केवल रनटाइम एपीआई के लिए लिखे गए कोड के साथ काम करता है।

ओह और वर्तमान में cudpp जो एक बहुत ही आसान लाइब्रेरी है केवल रनटाइम एपीआई के साथ काम करता है।

0

तर्क संरेखण और ड्राइवर API के साथ कुछ वास्तविक समस्याएं हैं। अधिक जानकारी के लिए CUDA 2.2 बीटा (या बाद में) दस्तावेज़ देखें।

+1

क्या यह मामला अभी भी है? – einpoklum

15

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

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

चूंकि हम चालक एपीआई पर सब कुछ माइग्रेट कर चुके हैं, सब ठीक रहे हैं।

जम्मू

+1

क्या आप अधिक विस्तार से बता सकते हैं, या कहीं से लिंक कर सकते हैं, यह बताते हुए कि चालक का उपयोग करने से आप इन विभिन्न कार्यों के समय को नियंत्रित करने में सीधे मदद कर सकते हैं? – einpoklum