एक ही धागा कई कोर पर कैसे चलता है?


61

मैं यह समझने की कोशिश कर रहा हूं कि उच्च-स्तर पर, एकल धागे कई कोर में कैसे चलते हैं। नीचे मेरी सबसे अच्छी समझ है। मुझे विश्वास नहीं है कि यह सही है।

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

इसलिए यदि केवल एक ही धागा है, तो ओएस कोई अनुकूलन नहीं करेगा। हालांकि, सीपीयू का फ्रंट-एंड प्रत्येक कोर के बीच स्वतंत्र अनुदेश सेट वितरित करेगा।

Https://stackoverflow.com/a/15936270 के अनुसार , एक विशिष्ट प्रोग्रामिंग भाषा कम या ज्यादा थ्रेड्स बना सकती है, लेकिन यह निर्धारित करने के लिए अप्रासंगिक है कि उन थ्रेड्स के साथ क्या किया जाए। ओएस और सीपीयू इसे संभालते हैं, इसलिए उपयोग की गई प्रोग्रामिंग भाषा की परवाह किए बिना ऐसा होता है।

यहाँ छवि विवरण दर्ज करें

बस स्पष्ट करने के लिए, मैं एक कोर पर कई थ्रेड चलाने के बारे में पूछ रहा हूं, न कि एक कोर पर कई थ्रेड चलाने के बारे में।

मेरे सारांश में क्या गलत है? एक धागे के निर्देशों को कई कोर के बीच कहाँ और कैसे विभाजित किया जाता है? क्या प्रोग्रामिंग भाषा मायने रखती है? मुझे पता है कि यह एक व्यापक विषय है; मैं इसकी उच्चस्तरीय समझ की उम्मीद कर रहा हूं।


6
एक सॉफ्टवेयर थ्रेड के लिए निर्देशों का एक सेट कई कोर पर चल सकता है, लेकिन एक बार में नहीं।
क्रॉल्टन

1
आप सॉफ़्टवेयर थ्रेड्स (जिसमें OS शेड्यूलर शामिल हैं) और हार्डवेयर थ्रेड्स या हाइपरथ्रेडिंग (एक CPU सुविधा जो एक कोर को दो की तरह व्यवहार करता है) को मिला रहे हैं।
बदसूरत

2
मेरे पास 20 ड्राइवर और 4 ट्रक हैं। यह कैसे संभव है कि एक चालक दो ट्रकों के साथ पैकेज दे सकता है? यह कैसे संभव है कि एक ट्रक में कई ड्राइवर हो सकते हैं? दोनों प्रश्नों का उत्तर समान है। बारी बारी से।
एरिक लिपिपर्ट

जवाबों:


84

ऑपरेटिंग सिस्टम CPU के थ्रेड स्लाइस को थ्रेड्स के लिए समय प्रदान करता है जो चलाने के योग्य हैं।

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

चलाने की पात्रता निष्पक्षता और प्राथमिकता और तत्परता पर भिन्नताएं होती हैं, और इस विधि से विभिन्न थ्रेड्स समय स्लाइस, दूसरों के लिए कुछ और मिलते हैं।

यदि कई कोर, एन हैं, तो ऑपरेटिंग सिस्टम कोर पर चलने के लिए सबसे योग्य एन थ्रेड्स को शेड्यूल करता है।

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

हालांकि, ऑपरेटिंग सिस्टम विभिन्न सीपीयू पर एक थ्रेड टाइम-स्लाइस की पेशकश करने के लिए स्वतंत्र है, और यह अलग-अलग समय स्लाइस पर सभी सीपीयू के माध्यम से घूम सकता है। हालांकि, जैसा कि @ gnasher729 कहते हैं , एक साथ कई सीपीयू पर एक धागा चला सकते हैं।

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

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


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


3
"इस प्रकार, कई बार स्लाइस पर एक ही प्रोसेसर पर एक ही धागा चलाना एक दक्षता लाभ है।" यह होना जरूरी नहीं होगा सन्निहित समय स्लाइस? अन्यथा, अन्य धागे से कैश मिटा दिया जाएगा, नहीं? एक अच्छी व्याख्या के लिए +1।
jpmc26

2
@ लालन: एचटी अक्सर अच्छा होता है, लेकिन स्थिति इतनी सरल नहीं होती जितनी आप बताते हैं। फ्रंट-एंड इश्यू बैंडविड्थ (इंटेल पर प्रति घड़ी 4 उफ़, राइज़ेन पर 6) समान रूप से थ्रेड्स के बीच साझा किया जाता है (जब तक कि एक को रोक नहीं दिया जाता है)। अगर वह अड़चन है, तो जैसे मैंने कहा कि एचटी बिल्कुल भी मदद नहीं करेगा। स्काईलेक के लिए यह अच्छी बात नहीं है कि वह एक अच्छी तरह से तैयार किए गए लूप के करीब आए, अगर भार, ALU और दुकानों का मिश्रण है ... ट्रांजिस्टर सस्ते हैं (और सभी एक बार में बदल नहीं सकते हैं या सीपीयू पिघल जाएगा), इसलिए आधुनिक x86 सीपीयू में फ्रंट-एंड फीड की तुलना में अधिक निष्पादन पोर्ट हैं (कई निष्पादन इकाइयों को दोहराया जा सकता है ...
पीटर कॉर्ड्स

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

2
@Luaan: इसके अलावा, इंटेल सीपीयू में पूर्णांक और एफपी / वेक्टर निष्पादन इकाइयां एक ही निष्पादन बंदरगाहों को साझा करते हैं । उदाहरण के लिए, FP FMA / mul / add यूनिट पोर्ट 0/1 पर हैं। लेकिन पूर्णांक गुणक port1 पर भी है, और सरल पूर्णांक ops 4 निष्पादन पोर्ट (मेरे उत्तर में आरेख) में से किसी पर भी चल सकता है। इश्यू बैंडविड्थ का उपयोग करने वाला एक दूसरा धागा उन दोनों को धीमा कर देगा, भले ही वे निष्पादन इकाइयों के लिए प्रतिस्पर्धा न करें, लेकिन अक्सर अगर वे कैश के लिए बहुत बुरी तरह से प्रतिस्पर्धा नहीं करते हैं तो शुद्ध लाभ होता है। यहां तक ​​कि अच्छी तरह से ट्यून किए गए उच्च-थ्रूपुट कोड जैसे x264 / x265 (वीडियो एनकोडर) एचटी से स्काइलेक पर लगभग 15% लाभान्वित होते हैं।
पीटर कॉर्डेस

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

24

एक साथ कई कोर पर एक ही धागा चलने जैसी कोई बात नहीं है।

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

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

संबंधित विकिपीडिया प्रविष्टियाँ: निर्देश पाइपलाइनिंग , आउट-ऑफ-ऑर्डर निष्पादन


3
वे एक साथ नहीं चल सकते हैं, लेकिन वे समानांतर में चल सकते हैं? क्या ये एक ही चीज नहीं हैं?
Evorlor

10
@Everlor यहां मुख्य बात एक कोर और एक निष्पादन इकाई के बीच अंतर है। एक एकल धागा केवल एक कोर पर चल सकता है, लेकिन एक प्रोसेसर गतिशील विश्लेषण का उपयोग कर सकता है ताकि यह पता लगाया जा सके कि कोर द्वारा निष्पादित किए जाने वाले निर्देश एक-दूसरे पर निर्भर नहीं होते हैं और अलग-अलग निष्पादन इकाइयों पर एक साथ निष्पादित होते हैं। एक कोर में कई निष्पादन इकाइयाँ हो सकती हैं।
user1937198

3
@ इन्वर्टर: एक आउट-ऑफ-ऑर्डर सीपीयू एक थ्रेड के इंस्ट्रक्शन स्ट्रीम के भीतर इंस्ट्रक्शन-लेवल समानता का पता लगा सकता है और उसका फायदा उठा सकता है । उदाहरण के लिए अक्सर एक लूप काउंटर को अपडेट करने वाले निर्देश कुछ अन्य कार्यों से स्वतंत्र होते हैं जो एक लूप करता है। या एक a[i] = b[i] + c[i]लूप में, प्रत्येक पुनरावृत्ति स्वतंत्र है, इसलिए विभिन्न पुनरावृत्तियों से लोड, जोड़ता है, और स्टोर एक बार में उड़ान में हो सकते हैं। यह भ्रम को संरक्षित करना है कि प्रोग्राम ऑर्डर में निष्पादित किए गए निर्देश, लेकिन उदाहरण के लिए एक स्टोर जो कैश में याद करता है, थ्रेड में देरी नहीं करता है (जब तक कि यह स्टोर बफर में अंतरिक्ष से बाहर नहीं निकलता है)।
पीटर कॉर्डेस

3
@ user1937198: "गतिशील विश्लेषण" वाक्यांश एक जेआईटी संकलक के लिए बेहतर होगा। आउट-ऑफ-ऑर्डर सीपीयू वास्तव में विश्लेषण नहीं करते हैं ; यह एक लालची एल्गोरिथ्म की तरह है जो निर्देश को डिकोड और जारी किया गया है और उनके इनपुट तैयार हैं। (आउट-ऑफ-ऑर्डर राउटरिंग विंडो कुछ माइक्रोआर्किटेक्चुरल संसाधनों द्वारा सीमित है, उदाहरण के लिए इंटेल सैंडब्रिज में 168 उफ़र का एक रेफर बफ़र है। प्रयोगात्मक रूप से आरओबी आकार को भी देखें )। सभी को हार्डवेयर राज्य-मशीनों के साथ लागू किया गया है, जो प्रति घड़ी 4 यूपीएस को संभालता है।
पीटर कॉर्डेस

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

22

सारांश: एकल-थ्रेडेड प्रोग्राम में निर्देश (निर्देश-स्तर) समानता का पता लगाना और उसका दोहन करना पूरी तरह से हार्डवेयर में किया जाता है, सीपीयू कोर द्वारा यह चल रहा है। और केवल कुछ सौ निर्देशों की एक खिड़की पर, बड़े पैमाने पर पुन: व्यवस्थित नहीं।

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


ओएस सभी थ्रेड्स के निर्देशों को इस तरह से व्यवस्थित करता है कि वे एक दूसरे पर इंतजार नहीं कर रहे हैं।

OS थ्रेड्स के इंस्ट्रक्शन स्ट्रीम में नहीं दिखता है। यह केवल कोर को थ्रेड शेड्यूल करता है।

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

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

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

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

हाइपरथ्रेडिंग या अन्य एसएमटी डिजाइनों के साथ, एक भौतिक सीपीयू कोर कई "तार्किक" कोर की तरह काम करता है। क्वाड-कोर-हाइपरथ्रेडिंग (4c8t) सीपीयू और एक सादे 8-कोर मशीन (8c8t) के बीच एक ओएस परिप्रेक्ष्य से एकमात्र अंतर यह है कि एक एचटी-अवेयर ओएस, शारीरिक कोर को अलग करने के लिए थ्रेड शेड्यूल करने की कोशिश करेगा जो वे 'डॉन' करते हैं। टी एक दूसरे के साथ प्रतिस्पर्धा करते हैं। एक ओएस जिसे हाइपरथ्रेडिंग के बारे में नहीं पता था, वह सिर्फ 8 कोर को देखेगा (जब तक कि आप BIOS में एचटी को अक्षम नहीं करते हैं, तब यह केवल 4 का पता लगाएगा)।


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

कोर के आउट-ऑफ-ऑर्डर भाग के अंदर, निर्देश (या uops) निष्पादन बंदरगाहों को भेजे जाते हैं जब उनके इनपुट ऑपरेंड तैयार होते हैं और एक निशुल्क निष्पादन पोर्ट होता है। यह कार्यक्रम क्रम में नहीं होता है, इसलिए यह है कि एक OOO CPU एक थ्रेड के भीतर निर्देश-स्तर समानता का शोषण कैसे कर सकता है

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

आउट-ऑफ-ऑर्डर निष्पादन केवल स्थानीय स्तर पर ही ILP को खोज सकता है, केवल एक दो सौ निर्देशों तक, दो स्वतंत्र छोरों के बीच नहीं (जब तक कि वे कम न हों)।


उदाहरण के लिए, इस के बराबर

int i=0,j=0;
do {
    i++;
    j++;
} while(42);

एक ही लूप के रूप में उपवास के बारे में चलाने के लिए केवल इंटेल Haswell पर एक काउंटर बढ़ाना होगा। i++केवल पिछले मूल्य पर निर्भर करता है i, जबकि j++केवल पिछले मूल्य पर निर्भर करता है j, इसलिए दो निर्भरता श्रृंखला कार्यक्रम क्रम में निष्पादित होने वाली सभी चीजों के भ्रम को तोड़ने के बिना समानांतर में चल सकते हैं।

X86 पर, लूप कुछ इस तरह दिखाई देगा:

top_of_loop:
    inc eax
    inc edx
    jmp .loop

हैसवेल में 4 पूर्णांक निष्पादन पोर्ट हैं, और उन सभी में योजक इकाइयाँ हैं, इसलिए incयदि वे सभी स्वतंत्र हैं, तो प्रति घड़ी 4 निर्देशों तक का थ्रूपुट बनाए रख सकते हैं। (विलंबता = 1 के साथ, इसलिए आपको incउड़ान में 4 निर्देशों को ध्यान में रखते हुए थ्रूपुट को अधिकतम करने के लिए केवल 4 रजिस्टरों की आवश्यकता होती है । वेक्टर-एफपी एमयूएल या एफएमए के साथ इसका विरोध करें: विलंबता = 5 थ्रूपुट = 0.5 उड़ान में 10 एनएमए रखने के लिए 10 वेक्टर संचयकों की आवश्यकता होती है। थ्रूपुट को अधिकतम करने के लिए। और प्रत्येक वेक्टर 256 बी हो सकता है, 8 एकल-सटीक फ्लोट पकड़े हुए)।

ली गई शाखा भी एक अड़चन है: एक लूप हमेशा प्रति पुनरावृत्ति में कम से कम एक पूरी घड़ी लेता है, क्योंकि लिया-शाखा प्रवाह 1 प्रति घड़ी तक सीमित है। मैं प्रदर्शन को कम करने के बिना लूप के अंदर एक और निर्देश डाल सकता था, जब तक कि यह भी नहीं पढ़ता / लिखता है eaxया edxकिस मामले में यह निर्भरता श्रृंखला को लंबा कर देगा। लूप में 2 और निर्देश डालना (या एक जटिल मल्टी-यूओपी निर्देश) फ्रंट-एंड पर एक अड़चन पैदा करेगा, क्योंकि यह केवल आउट-ऑफ-ऑर्डर कोर में प्रति घड़ी 4 यूओपी जारी कर सकता है। ( लूप-बफ़र और यूओपी कैश के 4 चीज़ों के लिए लूप्स के लिए क्या होता है, इसके बारे में कुछ विवरणों के लिए यह एसओ क्यूएंडए देखें : लूप-बफर और यूओपी कैश चीजों को दिलचस्प बनाते हैं।)


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

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

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

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

यह एक सिंगल सीपीयू कोर का ब्लॉक डायग्राम है । क्वाड-कोर सीपीयू में इनमें से 4 चिप पर हैं, प्रत्येक में अपने स्वयं के एल 1 / एल 2 कैश (एल 3 कैश, मेमोरी कंट्रोलर और सिस्टम डिवाइसों के लिए पीसीआई कनेक्शन) साझा करते हैं।

हसवेल पूरी पाइपलाइन

मुझे पता है कि यह बहुत जटिल है। उदाहरण के लिए, कैंटर का लेख निष्पादन इकाइयों या कैश से अलग-अलग दृश्य के बारे में बात करने के लिए इसके कुछ हिस्सों को भी दिखाता है।


2
"एकल-थ्रेडेड प्रोग्राम में समानता (निर्देश-स्तर) समानता का पता लगाना और उसका दोहन करना पूरी तरह से हार्डवेयर में किया जाता है" ध्यान दें कि यह केवल पारंपरिक ISAs पर लागू होता है, न कि VLIWs जिसमें ILP कंपाइलर या प्रोग्रामर द्वारा या हार्डवेयर के बीच सहकारी रूप से निर्धारित किया जाता है। और सॉफ्टवेयर।
हादी ब्रिस

1
@ user7813604: हाँ। हाइपरथ्रेडिंग एक सूत्र को समानांतर नहीं कर सकता है। यह रिवर्स करता है: यह एक-एक कोर पर कई थ्रेड चलाता है, प्रति-थ्रेड प्रदर्शन को कम करता है, लेकिन समग्र थ्रूपुट को बढ़ाता है।
पीटर कॉर्ड्स

1
@ user7813604: ILP के पूरे बिंदु को यह पता चल रहा है कि किन निर्देशों को समानांतर में चलाया जा सकता है जबकि अभी भी यह भ्रम बरकरार है कि प्रत्येक निर्देश क्रम में चलता रहे, प्रत्येक अगले एक के शुरू होने से पहले खत्म हो जाए। एक स्केलर pipelined सीपीयू निर्भरता के लिए कभी-कभी स्टाल करने की आवश्यकता हो सकती है यदि विलंबता 1 से अधिक है। लेकिन यह सुपरस्क्लेयर सीपीयू के लिए एक बड़ा सौदा है।
पीटर कॉर्ड्स

1
@ user7813604: हां, मेरा जवाब सचमुच एक उदाहरण के रूप में उपयोग करता है। उदाहरण के लिए Haswell incएक ही घड़ी चक्र में 4 निर्देशों को निष्पादित कर सकता है, इसकी 4 पूर्णांक ALU निष्पादन इकाइयों को।
पीटर कॉर्ड्स

1
@ user7813604: हां, ILP को समानांतर में कितना अंजाम दिया जा सकता है। एक वास्तविक सीपीयू में आईएलपी को खोजने और उसका शोषण करने की एक सीमित क्षमता होगी, जो वास्तव में इसे एक ही कोर के समानांतर में चला रहा है, जैसे कि इंटेल में 4-वाइड सुपरसेलकर तक। यह उत्तर यह समझाने की कोशिश करता है कि उदाहरणों के साथ।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.