tl; डॉ
छोटी पाइपलाइनों का अर्थ है तेज गति, लेकिन थ्रूपुट को कम कर सकती है। इसके अलावा, नीचे उत्तर # 2 और 3 देखें (वे छोटे हैं, मैं वादा करता हूं)।
लंबा संस्करण:
यहाँ पर विचार करने के लिए कुछ चीजें हैं:
- सभी निर्देश समान समय नहीं लेते हैं
- सभी निर्देश उस पर निर्भर नहीं करते हैं जो तुरंत किया गया था (या यहां तक कि दस या बीस) निर्देश वापस
एक बहुत ही सरलीकृत पाइपलाइन (आधुनिक इंटेल चिप्स में जो होता है वह जटिल से परे होता है) में कई चरण होते हैं:
Fetch -> Decode -> मेमोरी एक्सेस -> Execute -> Writeback -> प्रोग्राम काउंटर अपडेट
प्रत्येक पर -> एक समय लागत होती है जो खर्च होती है। इसके अतिरिक्त, प्रत्येक टिक (घड़ी चक्र), सब कुछ एक चरण से दूसरे चरण तक चलता है, इसलिए आपका सबसे धीमा चरण सभी चरणों के लिए गति बन जाता है (यह वास्तव में उनके लिए यथासंभव लंबाई का भुगतान करता है)।
मान लें कि आपके पास 5 निर्देश हैं, और आप उन्हें निष्पादित करना चाहते हैं (विकिपीडिया से ली गई तस्वीर, यहां पीसी अपडेट नहीं किया गया है)। यह इस तरह दिखेगा:
भले ही प्रत्येक निर्देश को पूरा करने के लिए 5 घड़ी चक्र लगते हैं, लेकिन हर चक्र में एक समाप्त निर्देश पाइपलाइन से बाहर आता है। यदि प्रत्येक चरण के लिए समय 40 ns है, और मध्यवर्ती बिट्स (ऊपर मेरे छह चरण पाइपलाइन का उपयोग करके) के लिए 15 ns है, तो पहला निर्देश प्राप्त करने के लिए 40 * 6 + 5 * 15 = 315 ns लगेगा।
इसके विपरीत, अगर मुझे पाइपलाइन को पूरी तरह से खत्म करना था (लेकिन बाकी सभी चीजों को समान रखें), तो पहला निर्देश प्राप्त करने के लिए केवल 240 ns का समय लगेगा। ("पहले" निर्देश को प्राप्त करने की गति के इस अंतर को विलंबता कहा जाता है। यह सामान्यतः थ्रूपुट की तुलना में कम महत्वपूर्ण है, जो प्रति सेकंड निर्देशों की संख्या है)।
असली अलग हालांकि यह है कि पाइपलाइज्ड उदाहरण में, मुझे हर 60 एनएस में एक नया इंस्ट्रक्शन (पहले एक के बाद) किया जाता है। गैर-पिपली वाले एक में, हर बार 240 लगते हैं। इससे पता चलता है कि पाइपलाइन थ्रूपुट में सुधार करने में अच्छे हैं।
इसे एक कदम आगे बढ़ाते हुए, ऐसा लगता है कि मेमोरी एक्सेस चरण में, मुझे एक अतिरिक्त इकाई (पता गणना करने के लिए) की आवश्यकता होगी। इसका मतलब है कि अगर कोई निर्देश है जो उस चक्र के मेम चरण का उपयोग नहीं करता है, तो मैं एक और जोड़ कर सकता हूं। मैं इस प्रकार एक एकल टिक में एक प्रोसेसर पर दो निष्पादन चरणों (मेमोरी एक्सेस स्टेज में एक के साथ) कर सकता हूं (शेड्यूलिंग एक बुरा सपना है, लेकिन चलो वहां नहीं जाएं। इसके अलावा, पीसी अपडेट चरण को भी एक अतिरिक्त इकाई की आवश्यकता होगी। कूदने का मामला, इसलिए मैं एक टिक में तीन अतिरिक्त निष्पादन राज्यों को कर सकता हूं)। पाइपलाइन होने से, इसे ऐसे डिज़ाइन किया जा सकता है कि दो (या अधिक) निर्देश मूल्यवान चरणों (या लीपफॉग चरणों, आदि) का उपयोग कर सकते हैं, जिससे मूल्यवान समय की बचत होती है।
ध्यान दें कि ऐसा करने के लिए, प्रोसेसर बहुत सारे "जादू" करते हैं ( ऑर्डर निष्पादन , शाखा भविष्यवाणी और बहुत कुछ से बाहर), लेकिन यह कई निर्देशों को पाइप लाइन के बिना तेजी से बाहर आने की अनुमति देता है (ध्यान दें कि पाइपलाइनें भी हैं लंबे समय का प्रबंधन करना बहुत कठिन है, और केवल चरणों के बीच इंतजार करके एक उच्च लागत को उठाना है)। दूसरा पहलू यह है कि यदि आप पाइपलाइन को बहुत लंबा बनाते हैं, तो आप एक पागल घड़ी की गति प्राप्त कर सकते हैं, लेकिन मूल लाभों में से बहुत कुछ खो देते हैं (एक ही प्रकार के तर्क रखने वाले कई स्थानों पर मौजूद हो सकते हैं, और एक ही समय में उपयोग किए जा सकते हैं। )।
उत्तर # 2:
SIMD (सिंगल इंस्ट्रक्शन मल्टीपल डेटा) प्रोसेसर (अधिकांश जीपीयू की तरह) सूचना के कई बिट्स पर बहुत काम करते हैं, लेकिन उन्हें ऐसा करने में अधिक समय लगता है। सभी मूल्यों में पढ़ने में अधिक समय लगता है (इसका मतलब है कि एक धीमी घड़ी, हालांकि यह कुछ हद तक बहुत व्यापक बस होने से ऑफसेट होती है) लेकिन आप एक समय में कई और निर्देश प्राप्त कर सकते हैं (प्रति चक्र अधिक प्रभावी निर्देश)।
उत्तर # 3:
क्योंकि आप चक्र गणना को कृत्रिम रूप से "धोखा" दे सकते हैं ताकि आप हर चक्र में दो निर्देश कर सकें (बस घड़ी की गति को आधा कर दें)। यह भी संभव है कि केवल हर दो टिक्स को एक के विपरीत किया जाए (एक 2x घड़ी की गति देते हुए, लेकिन निर्देशों को एक सेकंड में नहीं बदला जाए)।