मुझे सीपीयू के बजाय एक GPU से काम कैसे करना चाहिए?


16

जैसे नए सिस्टम OpenCL है कि हम, हमारे ग्राफिक्स प्रोसेसर पर अधिक से अधिक कोड है, जो समझ में आता है चला सकते हैं क्योंकि हम संभव के रूप में हमारे सिस्टम में बिजली की ज्यादा के रूप में उपयोग करने में सक्षम होना चाहिए ताकि किए जा रहे हैं।

हालांकि, इन सभी नई प्रणालियों के साथ, ऐसा लगता है जैसे कि जीपीयू हर तरह से सीपीयू से बेहतर हैं । क्योंकि जीपीयू समानांतर गणना कर सकता है, मल्टी-कोर जीपीयू वास्तव में ऐसा लगता है कि वे मल्टी-कोर सीपीयू की तुलना में बहुत बेहतर होंगे; आप एक ही बार में कई गणना करने में सक्षम होंगे और वास्तव में गति में सुधार करेंगे। क्या अभी भी कुछ ऐसे मामले हैं जहां सीरियल प्रोसेसिंग अभी भी बेहतर, तेज, और / या समानांतर से अधिक कुशल है?



6
वास्तव में हार्डवेयर के बारे में सवाल नहीं है। GPU (s) को प्रोग्रामिंग करने से बेहतर है जब GPU (s) को प्रोग्रामिंग करना बेहतर होगा, और ऐसा एक बहुत अच्छा p.se प्रश्न IMO है। SO पर दूसरों के बीच GPGPU टैग देखें। लेकिन आर्किटेक्चर "क्या तकनीक का उपयोग करें" सवाल यहां से बेहतर हैं।
केट ग्रेगरी

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

1
@ एना के बिंदु पर, मुझे लगता है कि जब एक प्रोग्रामर को GPU और CPU के बीच अंतर होता है तो विशुद्ध रूप से सैद्धांतिक चर्चा के बजाय GPU का उपयोग करना चाहिए, इस बारे में जवाब बहुत अधिक होना चाहिए। मैंने इसे दर्शाने के लिए शीर्षक संपादित किया है।

2
@RetroX हम डुप्लिकेट के रूप में प्रश्नों को बंद नहीं कर सकते हैं यदि वे विभिन्न साइटों पर हैं।
एडम लेअर

जवाबों:


27

हालांकि, इन सभी नई प्रणालियों के साथ, ऐसा लगता है जैसे कि जीपीयू हर तरह से सीपीयू से बेहतर हैं।

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

वर्तमान जीपीयू की एक महत्वपूर्ण सीमा यह है कि सभी कोर को एक ही कोड चलाना होगा। आपके CPU में कोर के विपरीत, आप अपने ईमेल क्लाइंट को चलाने के लिए एक GPU कोर नहीं बता सकते, और दूसरा वेब सर्वर चलाने के लिए। आप एक मैट्रिक्स को पलटने के लिए GPU को फ़ंक्शन देते हैं, और सभी कोर डेटा के विभिन्न बिट्स पर उस फ़ंक्शन को चलाते हैं।

GPU पर प्रोसेसर एक अलग दुनिया में रहते हैं। वे प्रदर्शन को नियंत्रित कर सकते हैं, लेकिन उनके पास डिस्क, नेटवर्क या कीबोर्ड तक कोई पहुंच नहीं है।

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

लब्बोलुआब यह है कि जीपीयू तब उपयोगी होता है जब आपके पास एक लंबी गणना की कई (जैसे कि सैकड़ों या हजारों में) प्रतियां होती हैं, जिनकी गणना समानांतर में की जा सकती है। विशिष्ट कार्य जिनके लिए यह सामान्य है वैज्ञानिक कंप्यूटिंग, वीडियो एन्कोडिंग और छवि प्रतिपादन हैं। एक टेक्स्ट एडिटर जैसे एप्लिकेशन के लिए केवल एक फ़ंक्शन जहां एक GPU उपयोगी हो सकता है स्क्रीन पर टाइप को रेंडर करने में है।


डबल सटीक समर्थन Shader Model 5 का हिस्सा है, और AMD / ATI के पास भी है।
बेन Voigt

@, सुधार के लिए धन्यवाद। मैंने गलत स्टेटमेंट निकाल दिया है।
चार्ल्स ई। ग्रांट

11

जीपीयू सामान्यवादी प्रोसेसर नहीं हैं जिस तरह से सीपीयू हैं। वे एक बहुत विशिष्ट चीज़ करने में माहिर हैं - एक ही कोड को बड़ी मात्रा में डेटा पर लागू करना - और वे इसे बहुत, बहुत अच्छी तरह से, एक सीपीयू की तुलना में बहुत बेहतर करते हैं। लेकिन अधिकांश अनुप्रयोगों में अधिकांश डेटा के समान कोड को लागू करने के बारे में नहीं है; यह ईवेंट लूप के बारे में है: इनपुट की प्रतीक्षा करना, इनपुट पढ़ना, उस पर कार्य करना, और फिर अधिक इनपुट की प्रतीक्षा करना। यह एक सुंदर धारावाहिक प्रक्रिया है, और GPU "धारावाहिक" को चूसते हैं।

जब आपके पास बड़ी मात्रा में डेटा है जिसे आपको संसाधित करने की आवश्यकता है, और प्रत्येक आइटम को समानांतर में, दूसरों के स्वतंत्र रूप से संसाधित किया जा सकता है, तो आगे बढ़ें और इसे GPU पर भेजें। लेकिन इस "नए प्रतिमान" के रूप में मत सोचो कि सब कुछ में निचोड़ा जाना है।

इस प्रश्न को "अनुकूलन" के रूप में चिह्नित किया गया है, इसलिए इसे एक ही मानें। GPU ऑप्टिमाइज़ेशन लागू करें जहाँ परीक्षण और प्रोफाइलिंग से पता चलता है कि ऑप्टिमाइज़ेशन की आवश्यकता है और कार्य की प्रकृति ऐसी है कि GPU ऑप्टिमाइज़ेशन लागू किया जा सकता है। अन्यथा, इसके साथ परेशान न करें, क्योंकि यह समय से पहले या गलत अनुकूलन होगा, जो इसे ठीक करने की तुलना में अधिक समस्याएं पैदा करता है।


8

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

अधिकांश वर्तमान सीपीयू भी कुछ प्रकार के ऑपरेशनों का समर्थन करते हैं जो एक वर्तमान जीपीयू केवल समर्थन करने का प्रयास नहीं करते हैं (जैसे, मल्टीटास्किंग के लिए मेमोरी सुरक्षा)।

थोड़ा अलग दिशा से इसे देखते हुए, CPUs (बड़े पैमाने पर) प्रोग्रामर के लिए यथोचित रूप से सुविधाजनक बनाने के लिए डिज़ाइन किए गए हैं, और हार्डवेयर लोगों ने हार्डवेयर बनाने के लिए अपना सर्वश्रेष्ठ प्रदर्शन किया है! प्रोग्रामर, लेकिन फिर भी जितनी जल्दी हो सके निष्पादित करता है।

जीपीयू विपरीत दिशा से चीजों पर आते हैं: वे हार्डवेयर डिजाइनर के लिए काफी हद तक सुविधाजनक हैं, और ओपनसीएल जैसी चीजों ने हार्डवेयर की बाधाओं को देखते हुए एक प्रोग्रामिंग मॉडल के उचित प्रदान करने का प्रयास किया है।

GPU पर चलाने के लिए कोड लिखना आमतौर पर सीपीयू पर समान करने की तुलना में अधिक समय और प्रयास (इसलिए इसे अधिक खर्च होगा) ले जाएगा। इस प्रकार, ऐसा करने से मुख्य रूप से यह समझ में आता है कि कब / क्या है:

  1. समस्या इतनी समानांतर है कि आप न्यूनतम प्रयास से बड़े लाभ की उम्मीद कर सकते हैं, या
  2. गति लाभ इतना महत्वपूर्ण है कि यह बहुत सारे अतिरिक्त काम को सही ठहराता है।

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

वास्तविकता यह है कि बहुत सारे (मैं "सबसे" कहने के लिए लुभाता हूं) अनुप्रयोगों, एक ठेठ सीपीयू तेजी से काफी अधिक है, और प्रोग्रामिंग सुविधा (नई सुविधाओं के आसान विकास जैसी चीजों के लिए अग्रणी) की तुलना में बहुत अधिक महत्वपूर्ण है निष्पादन की गति।


3

आप एक ही बार में कई गणना करने में सक्षम होंगे और वास्तव में गति में सुधार करेंगे।

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

मुझे गलत मत समझो - एक कोडर के रूप में मैं सीपीयू टिक को अच्छी तरह से निचोड़ने का आनंद लेता हूं। यह सिर्फ इतना है कि यह कला आम तौर पर उच्च मांग में नहीं है।

क्या अब भी कुछ ऐसे मामले हैं जहां सीरियल प्रोसेसिंग अभी भी बेहतर, तेज, और / या समानांतर से अधिक कुशल है?

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

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


2

सीपीयू अभी भी अधिक बहुमुखी हैं। उदाहरण के लिए, GPU एकल परिशुद्धता में सीपीयू की तुलना में अधिक कुशल हैं, लेकिन दोहरे परिशुद्धता में नहीं। जीपीयू की तुलना में सीपीयू के लिए बहुत अधिक पुस्तकालय हैं।


3
क्या आप थोड़ा और विस्तार में जा सकते हैं? आपने बिना किसी सूचना या स्पष्टीकरण के तीन कथन दिए हैं, जिनकी सत्यता की जानकारी दी गई है।

खैर, कुशल दोहरी सटीक गणनाओं की कमी सामान्य ज्ञान है: en.wikipedia.org/wiki/GPGPU
quant_dev

@ क्वेंट: आपकी जानकारी कम से कम 2 साल पुरानी है: 544 GigaFLOPS किसी भी मुख्यधारा सीपीयू की तुलना में बहुत तेज है।
बेन वोयगट

@ नहीं, मैं नहीं देखता कि आपके लिंक में डबल सटीक प्रदर्शन का उल्लेख है।
मात्रा_देव


2

सरल नियम यह है, यदि आप जो कर रहे हैं वह रैखिक बीजगणित से निर्माण के संदर्भ में किया जा सकता है और समय महत्वपूर्ण है, तो इसे GPU पर करें अन्यथा CPU का उपयोग करें।

जीपीयू बड़ी संख्या में सीपीयू की तरह नहीं हैं, उनके पास बेतहाशा अलग प्रदर्शन विशेषताएं हैं।


यदि यह "महत्वपूर्ण समय" है, तो संभवतः आपके पास कंप्‍यूटर शेडर के लिए GPU पुन: कॉन्फ़िगर करने और डेटा अपलोड करने का समय नहीं है। यह बड़ी समस्याएं हैं जो सबसे अधिक लाभ उठाती हैं।
बेन वोयगट

@, मुझे लगता है कि हमारे पास "समय महत्वपूर्ण" की अलग-अलग परिभाषाएं हैं, मेरा मतलब है कि गणना महत्वपूर्ण समय के लिए महत्वपूर्ण पथ पर है।
dan_waterworth

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.