2013 के अंत तक CUDA बनाम ओपनसीएल


34

प्रोग्रामर के नजरिए से 2013 के अंत तक CUDA और OpenCL एक दूसरे से तुलना कैसे करते हैं? मेरा समूह GPU कंप्यूटिंग का उपयोग करने की कोशिश करने के बारे में सोच रहा है। क्या हम हार्डवेयर का चयन करके खुद को काफी सीमित कर लेंगे जो केवल OpenCL का समर्थन करता है लेकिन CUDA का नहीं?

थोड़ा और अधिक विशिष्ट होने के लिए, निम्नलिखित धारणाएं सही हैं?

  • CUDA में जो कुछ भी संभव है वह OpenCL में भी संभव है

  • जब तक हम पुस्तकालयों का उपयोग नहीं कर रहे हैं, तब तक किसी भी कार्य को उन दोनों में से करना बहुत आसान (या अधिक कठिन) नहीं है

  • CUDA का मुख्य लाभ पुस्तकालयों की उपलब्धता है

  • दोनों को सभी तीन मुख्य प्लेटफार्मों (विन / ओएसएक्स / लिनक्स) के लिए अच्छा समर्थन है


1
मैं इस प्रश्न को अपडेट करने की कोशिश करूंगा कि क्या यह पर्याप्त विशिष्ट नहीं है ... हम इस डोमेन के लिए नए हैं, और यह मूल प्रश्नों में से एक है जो विशेष रूप से हार्डवेयर की पसंद के कारण आया है। एक बात जिसने मेरा ध्यान खींचा और मुझे ओपनसीएल के बारे में सतर्क किया वह है यह धागा । यदि OpenCL, रेस्ट्रिंग (ब्लेंडर) के लिए पर्याप्त नहीं है, तो शायद यह HPC के लिए भी अच्छा नहीं है ...
Szabolcs

मैं 2011 से जीपीयू में सक्रिय नहीं था, इसलिए मैं किसी और को अप-टू-डेट जवाब दूंगा, लेकिन आपका कथन "किसी दिए गए कार्य को उन दोनों में से करना बहुत आसान नहीं है" कुछ ऐसा था जो मुझे नहीं मिला बिल्कुल सही। यहाँ व्यक्तिगत पूर्वाग्रह है, लेकिन मुझे लगा कि CUDA विकास की आसानी के मामले में OpenCL से मीलों आगे था। मुझे खुद को अपडेट करना होगा, लेकिन अगर आपने मुझसे 2 साल पहले पूछा था तो मैंने कहा था कि मैं 10 फुट के पोल के साथ ओपनसीएल को नहीं छूऊंगा।
ऑरेलियस

मैं इस सवाल से अवगत हूं: द फ्यूचर ऑफ ओपनसीएल , लेकिन यह ठीक वैसा ही सवाल नहीं है और यह 2 साल पुराना है। मुझे लगता है कि दो साल में चीजें बदल सकती हैं।
शेजाबल्स

हमारे लिए व्यावहारिक प्रश्नों में से एक है अगर एएमडी फायरप्रो कार्ड के साथ 2013 का मैक प्रो परिचित है और जीपीयू कंप्यूटिंग (कोई CUDA समर्थन नहीं) का उपयोग करने के लिए अच्छा है।
शेजाबल्स

अपने रडार पर भी C ++ AMP रखने के लिए इसके लायक हो सकता है। एक llvm कार्यान्वयन कार्यों में है। hsafoundation.com/bringing-camp-beyond-windows-via-clang-llvm । Microsoft पहले ही FFT, BLAS और LAPACK के लिए C ++ AMP लाइब्रेरी बना चुका है।
रोजर दहल

जवाबों:


37

मैं अपने अनुभवों को संक्षेप में प्रस्तुत करने की कोशिश करूँगा, जो कि वियनांकल के विकास के दौरान प्राप्त हुआ है, जहाँ हमारे पास बहुत सारे गणना गुठली के ज्यादातर 1: 1 अनुवादों के साथ CUDA और OpenCL बैकएंड हैं। आपके प्रश्न से मैं यह भी मान सकता हूँ कि हम ज्यादातर GPU के बारे में यहाँ ले रहे हैं।

प्रदर्शन पोर्टेबिलिटी।सबसे पहले, प्रदर्शन-पोर्टेबल गुठली जैसी कोई चीज नहीं है इस अर्थ में कि आप एक बार एक कर्नेल लिखते हैं और यह हर हार्डवेयर पर कुशलता से चलेगा। OpenCL में नहीं, जहां यह हार्डवेयर की व्यापक रेंज के कारण अधिक स्पष्ट है, लेकिन CUDA में भी नहीं है। CUDA में हार्डवेयर की छोटी रेंज समर्थित होने के कारण यह कम स्पष्ट है, लेकिन यहां तक ​​कि हमें पहले से ही कम से कम तीन हार्डवेयर आर्किटेक्चर (प्री-फर्मी, फर्मी, केप्लर) को भेदना होगा। ये प्रदर्शन उतार-चढ़ाव आसानी से 20 प्रतिशत के प्रदर्शन भिन्नता में परिणाम कर सकते हैं, यह निर्भर करता है कि आप धागे का चयन कैसे करते हैं और कौन से कार्य समूह आकार चुनते हैं, भले ही कर्नेल एक बफर कॉपी के रूप में सरल हो। यह शायद यह भी ध्यान देने योग्य है कि प्री-फर्मी और फर्मी जीपीयू पर सीयूडीए में सीधे तेजी से मैट्रिक्स-मैट्रिक्स गुणा कर्नेल लिखना संभव था। जबकि नवीनतम केपलर जीपीयू के लिए ऐसा लगता है कि किसी को CUBLAS के प्रदर्शन के करीब पहुंचने के लिए PTX छद्म विधानसभा भाषा में जाना पड़ता है। इस प्रकार, यहां तक ​​कि एक विक्रेता द्वारा नियंत्रित भाषा जैसे कि CUDA में हार्डवेयर विकास के साथ तालमेल रखने के लिए मुद्दे हैं। इसके अलावा, सभी CUDA कोड संवैधानिक रूप से संकलित होने पर संकलित हो जाते हैं, जो कुछ हद तक -वांचक ध्वज के माध्यम से एक संतुलन कार्य की आवश्यकता होती है, जबकि OpenCL कर्नेल को बस-इन-टाइम संकलक से रन-टाइम पर संकलित किया जाता है, इसलिए आप सिद्धांत दर्जी गुठली के लिए एक विशेष कम्प्यूट डिवाइस की बहुत बारीकियों के लिए नीचे। हालांकि, बाद में काफी शामिल है और आमतौर पर केवल एक बहुत ही आकर्षक विकल्प बन जाता है क्योंकि आपका कोड परिपक्व होता है और जैसे ही आपका अनुभव जमा होता है। भुगतान करने की कीमत सिर्फ समय के संकलन के लिए आवश्यक ओ (1) समय है, जो कुछ स्थितियों में एक मुद्दा हो सकता है। ओपनसीएल 2।

डिबगिंग और प्रोफाइलिंग। CUDA डिबगिंग और प्रोफाइलिंग उपकरण GPGPU के लिए सबसे अच्छा उपलब्ध हैं। एएमडी के उपकरण या तो खराब नहीं हैं, लेकिन उनमें क्यूडा-जीडीबी या क्यूडा-मेमचेक जैसे रत्न शामिल नहीं हैं। इसके अलावा, आज भी NVIDIA जीपीजीपीयू के लिए सबसे मजबूत ड्राइवर और एसडीके प्रदान करता है, बुग्गी गुठली के कारण सिस्टम फ्रीज वास्तव में अपवाद हैं, न कि नियम, दोनों OpenCL और CUDA के साथ। जिन कारणों से मुझे शायद यहाँ समझाने की ज़रूरत नहीं है, NVIDIA अब CCLA 5.0 और इसके बाद के संस्करण के साथ OpenCL के लिए डिबगिंग और प्रोफाइलिंग प्रदान नहीं करता है।

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

सॉफ्टवेयर लाइब्रेरी के पहलू। जबकि पिछले आइटम CUDA के पक्ष में थे, अन्य सॉफ्टवेयर में एकीकरण OpenCL के लिए एक बड़ा प्लस है। आप केवल OpenCL को साझा की गई OpenCL लाइब्रेरी के साथ जोड़कर OpenCL का उपयोग कर सकते हैं और यही वह है, जबकि CUDA के साथ आपको संपूर्ण CUDA टूलचैन उपलब्ध होना आवश्यक है। इससे भी बदतर, आपको काम करने के लिए nvcc के लिए सही होस्ट कंपाइलर का उपयोग करने की आवश्यकता है। यदि आपने कभी जीसीसी 4.6 या नए के साथ उदाहरण के लिए CUDA 4.2 का उपयोग करने की कोशिश की, तो आपके पास काम करने के लिए कठिन समय होगा। आम तौर पर, यदि आपके पास किसी भी संकलक का उपयोग होता है जो CUDA SDK की तुलना में नया है, तो परेशानी होने की संभावना है। सीएमके जैसी निर्माण प्रणालियों में एकीकरण सिरदर्द का एक अन्य स्रोत है (उदाहरण के लिए पेट्सक पर आप पर्याप्त सबूत भी पा सकते हैंईमेल की सूची)। यह आपकी स्वयं की मशीन पर एक समस्या नहीं हो सकती है जहां आपका पूर्ण नियंत्रण है, लेकिन जैसे ही आप अपना कोड वितरित करते हैं आप उन परिस्थितियों में चले जाएंगे जहां उपयोगकर्ता अपने सॉफ़्टवेयर स्टैक में कुछ हद तक प्रतिबंधित हैं। दूसरे शब्दों में, CUDA के साथ आप अपने पसंदीदा होस्ट कंपाइलर का चयन करने के लिए स्वतंत्र नहीं हैं, लेकिन NVIDIA यह निर्धारित करता है कि आपको कौन से कंपाइलर्स का उपयोग करने की अनुमति है।

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

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

मेरी सिफारिश। कृपया CUDA के बजाय CUDA और OpenCL पर विचार करें याOpenCL। अपने आप को एक मंच पर अनावश्यक रूप से प्रतिबंधित करने की आवश्यकता नहीं है, बल्कि इसके बजाय दोनों दुनिया से सबसे अच्छा ले लो। मेरे लिए अच्छी तरह से काम करता है CUDA में एक प्रारंभिक कार्यान्वयन स्थापित करना, इसे डीबग करना, इसे प्रोफाइल करना, और फिर ओपन स्ट्रिंग को सरल स्ट्रिंग प्रतिस्थापन द्वारा पोर्ट करना है। (आप अपनी OpenCL कर्नेल स्ट्रिंग पीढ़ी के रूटीन को भी परिमार्जन कर सकते हैं जैसे कि आपके पास कुछ लचीलापन है। लक्ष्य हार्डवेयर में ट्यूनिंग में।) पोर्टिंग का यह प्रयास आमतौर पर आपके समय के 10 प्रतिशत से कम की खपत करेगा, लेकिन आपको अन्य हार्डवेयर पर भी चलने की क्षमता देता है। आप आश्चर्यचकित हो सकते हैं कि कुछ स्थितियों में गैर-एनवीआईडीआईए हार्डवेयर कितना अच्छा प्रदर्शन कर सकता है। सभी में से अधिकांश, पुस्तकालयों में कार्यक्षमता के पुन: उपयोग को सबसे बड़ी सीमा तक संभव मानते हैं। जबकि एक त्वरित और कुछ कार्यक्षमता का गंदा पुन: क्रियान्वयन अक्सर सीपीयू पर एकल-थ्रेडेड निष्पादन के लिए स्वीकार्य काम करता है, यह अक्सर आपको बड़े पैमाने पर समानांतर हार्डवेयर पर खराब प्रदर्शन देगा। आदर्श रूप से आप पुस्तकालयों के लिए भी सब कुछ उतार सकते हैं और कभी इस बात की परवाह नहीं करते हैं कि वे CUDA, OpenCL या आंतरिक रूप से दोनों का उपयोग करते हैं या नहीं। व्यक्तिगत रूप से मैं अब से कई वर्षों में किसी ऐसे व्यक्ति पर भरोसा करने की हिम्मत नहीं कर पाऊंगा, जिस पर मैं कई वर्षों से भरोसा करना चाहता हूं, लेकिन इस विचारधारात्मक पहलू को एक अलग चर्चा में जाना चाहिए।


आप दोनों प्लेटफॉर्म में मानक 1 डी, 2 डी, 3 डी एफएफटी के वर्तमान प्रदर्शन और प्रयोज्य के बारे में क्या सोचते हैं?
अनिश्चित

JIT संकलन के संबंध में, CUDA भी उस संभावना की पेशकश करता है , लेकिन कुछ बाधाओं के साथ।
BenC

@hwlau: FFT विक्रेता पुस्तकालयों के लिए मानक कार्यक्षमता है, इसलिए CUDA बनाम OpenCL से स्वतंत्र है।
कार्ल रुप

@BenC: बाधाएं वास्तव में बहुत गंभीर हैं, यह अंतर्निहित हार्डवेयर के लिए पूर्वनिर्मित CUDA-kernels की विशेषज्ञता है।
कार्ल रुप

1
क्या आपके पास इस संभावित समस्या पर कोई टिप्पणी है ? यह मेरे लिए स्पष्ट नहीं है अगर यह एएमडी हार्डवेयर के साथ या ओपनसीएल के साथ एक ही समस्या है (यानी क्या समस्या NVIDIA के साथ ओपनसीएल के साथ कोई संबंध नहीं है)। शायद यह अधिकांश वैज्ञानिक कंप्यूटिंग अनुप्रयोगों के साथ कोई समस्या नहीं है क्योंकि वे एक उन्नत रेअटरर से छोटे और कम जटिल होते हैं? BTW महान जवाब के लिए धन्यवाद!
शेजाबल्क्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.