मल्टीकोर प्रोसेसर पर थ्रेड आवंटन कैसे प्रोग्राम करें?


13

मैं एक मल्टी-कोर प्रोसेसर पर थ्रेड्स के साथ प्रयोग करना चाहूंगा, उदाहरण के लिए एक ऐसा प्रोग्राम बनाना जो दो अलग-अलग थ्रेड्स का उपयोग करता है जो दो अलग-अलग प्रोसेसर कोर द्वारा निष्पादित होते हैं।

हालांकि, यह मेरे लिए स्पष्ट नहीं है कि किस स्तर पर धागे अलग-अलग कोर को आवंटित किए जाते हैं। मैं निम्नलिखित परिदृश्यों की कल्पना कर सकता हूं (ऑपरेटिंग सिस्टम और प्रोग्रामिंग भाषा कार्यान्वयन के आधार पर):

  1. थ्रेड आवंटन को ऑपरेटिंग सिस्टम द्वारा प्रबंधित किया जाता है। ओएस सिस्टम कॉल का उपयोग करके थ्रेड्स बनाए जाते हैं और, यदि प्रक्रिया मल्टी-कोर प्रोसेसर पर चलने के लिए होती है, तो ओएस स्वचालित रूप से विभिन्न कोर पर अलग-अलग थ्रेड आवंटित / शेड्यूल करने का प्रयास करता है।
  2. थ्रेड आवंटन को प्रोग्रामिंग भाषा कार्यान्वयन द्वारा प्रबंधित किया जाता है। विभिन्न कोर को थ्रेड आवंटित करने के लिए विशेष सिस्टम कॉल की आवश्यकता होती है, लेकिन जब मैं उस भाषा के लिए मानक थ्रेड कार्यान्वयन का उपयोग करता हूं, तो प्रोग्रामिंग भाषा मानक थ्रेड लाइब्रेरी स्वचालित रूप से इसे संभालती है।
  3. थ्रेड आवंटन को स्पष्ट रूप से प्रोग्राम किया जाना चाहिए। मेरे कार्यक्रम में मुझे यह पता लगाने के लिए स्पष्ट कोड लिखना है कि कितने कोर उपलब्ध हैं और विभिन्न थ्रेड्स को अलग-अलग कोर का उपयोग करके आवंटित करना है, जैसे, लाइब्रेरी फ़ंक्शन।

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

जवाबों:


11

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

सरल उत्तर: हां, यह आमतौर पर ऑपरेटिंग सिस्टम या थ्रेडिंग लाइब्रेरी द्वारा प्रबंधित किया जाएगा।

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

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

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

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


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

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

एक सरणी के दो हिस्सों को स्वतंत्र रूप से सॉर्ट किया जा सकता है क्योंकि कोई डेटा साझा नहीं किया जाता है। केवल पहले विभाजन और अंतिम मर्ज को एक थ्रेड द्वारा पूरे सरणी या सूची से जोड़कर प्रदर्शन करना होगा जिसमें डेटा होगा। इसका अर्थ है कि डेटा के एक पूर्ण स्कैन को समानांतर में निष्पादित नहीं किया जा सकता है; शेष सभी स्कैन कर सकते हैं।
जियोर्जियो

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

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

-1

मैं एक बार एक बड़ा SGI IRIX वातावरण था। बस इसके लिए, मैंने एक छोटा सा बहु-थ्रेडेड जावा प्रोग्राम लिखा (जिसमें सिर्फ सीपीयू साइकिल का उपभोग करने के अलावा कुछ नहीं किया) और इसमें 12 सूत्र बनाए। एनयूएमए आर्किटेक्चर में 12 सीपीयू में नौकरी की संभावना है। हो सकता है मैं इस कार्यक्रम को देखूंगा और इसे डेल R910s पर चलाऊंगा और जांच करूंगा।


3
यह उत्तर वास्तव में मौजूदा उत्तर में बहुत कुछ नहीं जोड़ता है। शायद अगर आपने इस बात पर विस्तार से बताया कि एसजीवी प्रणाली पर जेवीएम ने कोर को क्यों आवंटित किया ...
जे एलस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.