मेरे अनुभव के आधार पर, मैं सीपीयू और जीपीयू में समांतर कार्यक्रमों के बीच प्रदर्शन के संदर्भ में महत्वपूर्ण मतभेदों का सारांश दूंगा। मेरा विश्वास करो, पीढ़ी से पीढ़ी तक एक तुलना बदल दी जा सकती है। तो मैं सिर्फ यह बताऊंगा कि क्या अच्छा है और सीपीयू और जीपीयू के लिए बुरा है। बेशक, यदि आप चरम पर एक कार्यक्रम करते हैं, यानी, केवल बुरे या अच्छे पक्ष होने के कारण, यह निश्चित रूप से एक मंच पर तेज़ी से चलाएगा। लेकिन उन लोगों के मिश्रण के लिए बहुत ही जटिल तर्क की आवश्यकता होती है।
होस्ट कार्यक्रम स्तर
एक मुख्य अंतर यह स्मृति हस्तांतरण लागत है। जीपीयू उपकरणों को कुछ मेमोरी ट्रांसफर की आवश्यकता होती है। कुछ मामलों में यह लागत गैर-तुच्छ है, उदाहरण के लिए जब आपको अक्सर कुछ बड़े सरणी स्थानांतरित करना पड़ता है। मेरे अनुभव में, इस लागत को कम किया जा सकता है लेकिन अधिकांश होस्ट कोड को डिवाइस कोड पर दबाया जा सकता है। एकमात्र ऐसे मामले आप ऐसा कर सकते हैं जब आपको प्रोग्राम में होस्ट ऑपरेटिंग सिस्टम के साथ बातचीत करना पड़ता है, जैसे निगरानी करने के लिए आउटपुट करना।
डिवाइस कार्यक्रम स्तर
अब हम एक जटिल तस्वीर है कि पूरी तरह से अभी तक खुलासा नहीं किया गया है को देखने के लिए आते हैं। मेरा मतलब है कि जीपीयू में कई रहस्यमय दृश्य हैं जिनका खुलासा नहीं किया गया है। लेकिन फिर भी, हमारे प्रदर्शन के संदर्भ में सीपीयू और जीपीयू (कर्नेल कोड) में बहुत अंतर है।
कुछ कारक हैं जिन्हें मैंने देखा है कि नाटकीय रूप से अंतर में योगदान देते हैं।
GPUs, जो कई निष्पादन इकाइयों से मिलकर बनता है, बड़े पैमाने पर समानांतर कार्यक्रमों को संभालने के लिए तैयार कर रहे हैं। यदि आपके पास बहुत कम काम है, तो कुछ अनुक्रमिक कार्य कहें, और इन कार्यों को एक GPU पर रखें, केवल कुछ निष्पादन इकाइयां व्यस्त हैं, इस प्रकार CPU की तुलना में धीमी हो जाएगी। चूंकि सीपीयू, दूसरी तरफ, छोटे और अनुक्रमिक कार्यों को संभालने के लिए बेहतर हैं। कारण सरल है, सीपीयू अधिक जटिल हैं और निर्देश स्तर समानांतरता का फायदा उठाने में सक्षम हैं, जबकि जीपीयू थ्रेड स्तर समांतरता का फायदा उठाते हैं। खैर, मैंने सुना है कि एनवीआईडीआईए जीएफ 104 Superscalar कर सकता है, लेकिन मुझे इसके साथ अनुभव करने का कोई मौका नहीं था।
यह ध्यान देने योग्य है कि, GPUs में, वर्कलोड को छोटे ब्लॉक (या ओपनसीएल में कार्यसमूह) में विभाजित किया जाता है, और खंडों में ब्लॉक व्यवस्थित होते हैं, जिनमें से प्रत्येक एक स्ट्रीमिंग प्रोसेसर में निष्पादित होता है (मैं एनवीआईडीआईए से शब्दावली का उपयोग कर रहा हूं) । लेकिन सीपीयू में, उन ब्लॉकों को अनुक्रमिक रूप से निष्पादित किया जाता है - मैं एक लूप से कुछ और नहीं सोच सकता।
इस प्रकार, उन कार्यक्रमों के लिए जिनके पास छोटी संख्या में ब्लॉक हैं, यह CPUs पर तेज़ी से चलाने के लिए होगा।
शाखाओं GPUs के लिए बुरी चीजें, हमेशा से रहे हैं। कृपया ध्यान रखें कि जीपीयू समान चीजों को पसंद करते हैं। समान ब्लॉक, एक ब्लॉक के भीतर बराबर धागे, और एक तार के भीतर बराबर धागे। लेकिन सबसे ज्यादा मायने रखता है?
***Branch divergences.***
कुडा/ओपनसीएल प्रोग्रामर शाखा विचलन से नफरत करते हैं। चूंकि सभी धागे किसी भी तरह 32 धागे के सेट में विभाजित होते हैं, जिन्हें एक वार्प कहा जाता है, और लॉकस्टेप में एक वार्प निष्पादन के भीतर सभी धागे, एक शाखा विचलन वार्प में कुछ धागे धारावाहिक होने का कारण बनता है। इस प्रकार, वार्प का निष्पादन समय तदनुसार गुणा किया जाएगा।
जीपीयू के विपरीत, सीपीयू में प्रत्येक कोर अपने पथ का पालन कर सकते हैं। इसके अलावा, शाखाओं को कुशलता से निष्पादित किया जा सकता है क्योंकि सीपीयू की शाखा भविष्यवाणी है।
इस प्रकार, जिन प्रोग्रामों में अधिक तीव्र विचलन होते हैं वे CPUs पर तेज़ी से चलाने के लिए हैं।
यह वास्तव में पर्याप्त तो यह संक्षिप्त बनाते हैं जटिल है।
याद रखें कि वैश्विक मेमोरी एक्सेस में बहुत अधिक विलंबता (400-800 चक्र) है। तो जीपीयू की पुरानी पीढ़ियों में, क्या मेमोरी एक्सेस को समेकित किया जाता है, यह एक महत्वपूर्ण मामला था। अब आपके जीटीएक्स 560 (फर्मि) में 2 स्तर के कैश हैं। तो कई मामलों में वैश्विक स्मृति पहुंच लागत को कम किया जा सकता है। हालांकि, सीपीयू और जीपीयू में कैश अलग हैं, इसलिए उनके प्रभाव भी अलग हैं।
मैं क्या कह सकता हूं कि यह वास्तव में वास्तव में आपके मेमोरी एक्सेस पैटर्न पर निर्भर करता है, आपके कर्नेल कोड पैटर्न (कैसे स्मृति एक्सेस गणना के साथ इंटरलीव किया जाता है, संचालन के प्रकार इत्यादि), यह बताते हैं कि कोई GPUs पर तेज़ी से चलता है या नहीं या सीपीयू।
लेकिन किसी भी तरह से आप उम्मीद कर सकते हैं कि बड़ी संख्या में कैश मिस (जीपीयू में) का GPUs पर बहुत बुरा प्रभाव पड़ता है (कितना बुरा? - यह आपके कोड पर निर्भर करता है)।
इसके अतिरिक्त, साझा स्मृति GPUs की एक महत्वपूर्ण विशेषता है। साझा स्मृति तक पहुंच GPU L1 कैश तक पहुंचने जितनी तेज़ी से है। तो साझा स्मृति का उपयोग करने वाले कर्नेल बहुत अधिक लाभ प्राप्त करेंगे।
कुछ अन्य कारक मैं वास्तव में उल्लेख नहीं किया है, लेकिन उन जैसे बैंक संघर्ष, स्मृति लेन-देन, GPU के अधिभोग के आकार के रूप में कई मामलों में प्रदर्शन पर बड़ा प्रभाव हो सकता ...
कृपया पढ़ें [इस ब्लॉग पोस्ट] (http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/) स्टैक ओवरफ्लो पर इस तरह के कोई और प्रश्न पूछने से पहले। – talonmies
@talonmies: मैं असहमत हूं: यह एक बहुत ही विशिष्ट प्रश्न के साथ एक बहुत ही विशिष्ट प्रश्न है। इसके खिलाफ एकमात्र बिंदु यह है कि यह * शायद * किसी अन्य प्रश्न का डुप्लिकेट है। –
[जीपीजीपीयू बनाम मल्टीकोर?] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5919172/gpgpu-vs-multicore) –