हमें कई कोर के लिए प्रोग्रामिंग में कितना प्रयास करना चाहिए?


12

प्रोसेसर इन दिनों अधिक से अधिक कोर हो रहे हैं, जो मुझे आश्चर्यचकित करता है ...

क्या हमें, प्रोग्रामर को, इस व्यवहार के अनुकूल होना चाहिए और कई कोर के लिए प्रोग्रामिंग पर अधिक प्रयास करना चाहिए?

हमें इसे किस सीमा तक और किस रूप में अनुकूलित करना चाहिए? थ्रेड? आत्मीयता? हार्डवेयर अनुकूलन? कुछ और?

जवाबों:


15

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

यदि आपको अपने एप्लिकेशन को बहु-थ्रेडेड करने की आवश्यकता है, तो आपके द्वारा आवश्यक थ्रेड्स बनाएं और कंपाइलर और ओएस को उनकी नौकरियों के साथ आने दें।

आपको इस बात से अवगत होने की आवश्यकता है कि उन धागों का प्रबंधन कैसे किया जाता है ताकि आप संसाधनों का सर्वोत्तम उपयोग कर सकें। बहुत सारे धागे नहीं बनाना एक ऐसी बात है जो एक उदाहरण के रूप में दिमाग में आती है।

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


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

@ लोरेंजो - उस मामले में आपको यह देखना होगा कि क्या आप थ्रेड को एक ही कोर में बाँध सकते हैं - जो शायद एक विशेष मामला है - लेकिन एक दिलचस्प है।
ChrisF

1
क्या यह ओएस के संदर्भ में एक सक्रिय धागे को एक कोर से दूसरे में स्विच करने के लिए एक बल्कि अजीब कदम नहीं होगा?
JBRWilkinson

मैं @JBRWilkinson से सहमत हूं, थ्रेड एफिनिटी मेरे लिए OS जॉब की तरह लगता है।
Collin

1
@JBRWilkinson अंडर लाइनक्स (और मुझे लगता है कि ज्यादातर OSes) धागे हर समय कोर के बीच कूदते हैं। पहला कारण यह है कि आपके पास कोर की तुलना में कई अधिक धागे हैं। और अगर कुछ धागे मर जाते हैं तो आपको संतुलन बनाने की जरूरत है। दूसरा कारण यह है कि कई धागे सो रहे हैं। और जब कुछ कर्नेल जागते हैं तो सोच सकते हैं कि एक कोर में दूसरों की तुलना में अधिक भार होता है और एक थ्रेड को स्थानांतरित करता है, अक्सर आपका सीपीयू हॉगिंग कंप्यूटिंग धागा होता है। फिर 2 सीपीयू हॉगिंग थ्रेड्स एक ही कोर पर चलते हैं जब तक कर्नेल एक वापस नहीं आता। यदि आप एक बड़े काम को बिल्कुल संख्या-कोर भागों में विभाजित कर रहे हैं, तो आप थ्रेड आत्मीयता सेट करना चाहते हैं।
गोसविन वॉन ब्रेडरलो

5

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

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

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


5

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

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

कई भाषाओं और रूपरेखाओं में समान अवधारणाएं हैं।


5

कठिन भाग निष्पादन के चांस के लिए आपके सीपीयू गहन एल्गोरिथ्म को विभाजित करने में है जो पिरोया जा सकता है।

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


3

अब हम (अक्टूबर 2010) अपार संक्रमण के समय में हैं।

हम आज 12 कोर डेस्कटॉप खरीद सकते हैं।
हम आज 448 कोर प्रोसेसिंग कार्ड (एनवीडिया टेस्ला के लिए खोज) खरीद सकते हैं ।

इस बात की सीमा है कि हम अपने समानांतर निकट भविष्य में काम कर रहे जबरदस्त समानांतर वातावरण की अनदेखी में कितना काम कर सकते हैं।

ऑपरेटिंग सिस्टम, रनटाइम वातावरण और प्रोग्रामिंग लाइब्रेरी केवल इतना ही कर सकते हैं।

भविष्य में, हमें अपने प्रसंस्करण को स्वतंत्र प्रसंस्करण के लिए असतत विखंडू में विभाजित करना होगा, नए .NET "फ्रेमवर्क फ्रेमवर्क" जैसे सार का उपयोग करना।

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


3

ठीक है, यह वास्तव में इस बात पर निर्भर करता है कि आप क्या विकसित कर रहे हैं। आप जो विकास कर रहे हैं, उसके आधार पर इसका जवाब, "यह बहुत महत्वहीन है" से लेकर "यह बिल्कुल महत्वपूर्ण है, और हम उम्मीद करते हैं कि टीम में सभी को अच्छी समझ और समानांतर कार्यान्वयन का उपयोग हो"।

ज्यादातर मामलों के लिए, एक ठोस समझ और ताले, धागे, और कार्यों और टास्क पूल का उपयोग एक अच्छी शुरुआत होगी जब समानता की आवश्यकता होती है। (lang / lib द्वारा भिन्न होता है)

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

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

आप इस तुच्छ समानांतर मॉडल का उपयोग करके जो सीखते हैं वह सभी जटिल समानांतर परिदृश्यों में आदर्श नहीं होगा; प्रभावी ढंग से जटिल समानांतर डिजाइनों को लागू करने के लिए बहुत अलग समझ और दृष्टिकोण की आवश्यकता होती है। इन सरल मॉडलों को अक्सर अलग किया जाता है या सिस्टम के अन्य घटकों के साथ तुच्छ बातचीत होती है। साथ ही, इन तुच्छ मॉडलों के कई कार्यान्वयन प्रभावी रूप से जटिल समानांतर प्रणालियों के लिए अच्छी तरह से पैमाने पर नहीं होते हैं - एक खराब जटिल समानांतर डिजाइन को सरल मॉडल के रूप में निष्पादित करने में लंबा समय लग सकता है। बीमार: यह एकल पिरोया मॉडल के रूप में दो बार तेजी से निष्पादित करता है, निष्पादन के दौरान 8 तार्किक कोर का उपयोग करते हुए। सबसे कॉमन उदाहरण कई थ्रेड्स और उच्च स्तर के सिंक्रनाइज़ेशन हस्तक्षेप का उपयोग / निर्माण कर रहे हैं। सामान्य तौर पर, इसे समानांतर मंदी कहा जाता है। यदि आप सभी समानांतर समस्याओं को सरल समस्याओं के रूप में देखते हैं, तो मुठभेड़ करना काफी आसान है।

तो, मान लें कि आपको वास्तव में अपने कार्यक्रमों में (आज की जलवायु में अल्पसंख्यक) कुशल मल्टीथ्रेडिंग का उपयोग करना चाहिए: आपको जटिल मॉडल को सीखने के लिए सरल मॉडल को प्रभावी ढंग से नियोजित करने की आवश्यकता होगी और फिर प्रोग्राम के प्रवाह और इंटरैक्शन के बारे में जानने के लिए relearn करना होगा। जटिल मॉडल वह जगह है जहां आपका कार्यक्रम अंततः होना चाहिए क्योंकि हार्डवेयर आज है, और जहां सबसे प्रमुख सुधार किए जाएंगे।

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

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

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


2

हम करते हैं, लेकिन हम गणना भारी सॉफ्टवेयर लिखते हैं जिससे हम कई कोर से सीधे लाभान्वित होते हैं।

कभी-कभी शेड्यूलर कोर के बीच थ्रेड को बहुत आगे बढ़ाता है। यदि यह स्वीकार्य नहीं है, तो आप कोर आत्मीयता के साथ खेल सकते हैं।


0

जैसा कि यह खड़ा है, प्रोसेसर की आवृत्ति निकट भविष्य में बढ़ने वाली नहीं है। हम 3 GHz मार्क (w / o ओवरक्लॉकिंग) के आसपास फंस गए हैं। निश्चित रूप से, कई अनुप्रयोगों के लिए बहुत मूल बहु-थ्रेडिंग से परे जाना आवश्यक नहीं हो सकता है। जाहिर है अगर आप एक यूजर इंटरफेस एप्लिकेशन का निर्माण कर रहे हैं, तो बैकग्राउंड थ्रेड पर कोई भी गहन प्रसंस्करण किया जाना चाहिए।

यदि आप एक ऐसे एप्लिकेशन का निर्माण कर रहे हैं जो बड़ी मात्रा में डेटा को संसाधित कर रहा है जो वास्तविक समय होना चाहिए, तो हाँ, आपको शायद बहु-थ्रेडिंग प्रोग्रामिंग में देखना चाहिए।

मल्टी-थ्रेडेड प्रोग्रामिंग के लिए आप पाएंगे कि आपको अपने प्रदर्शन पर कम रिटर्न मिलेगा; आप घंटे बिता सकते हैं और कार्यक्रम को 15% तक सुधार सकते हैं, और फिर एक और सप्ताह बिता सकते हैं और केवल इसे 5% बढ़ा सकते हैं।

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