निर्देश पाइपलाइन

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

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

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

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

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

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

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

पाइपलाइनयुक्त कंप्यूटर का अधिकांश डिज़ाइन चरणों के बीच हस्तक्षेप को रोकता है और रुकावटों को कम करता है।

चरणों की संख्या
निर्भर चरणों की संख्या मशीन वास्तुकला के साथ भिन्न होती है। उदाहरण के लिए:
 * 1956-61 के आईबीएम खिंचाव  प्रोजेक्ट ने फ़ेच, डिकोड और एक्ज़िक्यूट जैसे शब्दों का प्रस्ताव रखा जो आम हो गए हैं।
 * क्लासिक आरआईएससी पाइपलाइन में शामिल हैं:
 * निर्देश प्राप्त करें
 * अनुदेश डिकोड और रजिस्टर फ़ेच
 * अमल में लाना
 * मेमोरी एक्सेस
 * रजिस्टर वापस लिखें
 * Atmel AVR और पीआईसी माइक्रोकंट्रोलर प्रत्येक में दो चरण वाली पाइपलाइन होती है।
 * कई डिज़ाइनों में 7, 10 और यहां तक ​​कि 20 चरणों तक लंबी पाइपलाइन शामिल हैं (जैसा कि इंटेल पेंटियम 4 में है)।
 * इंटेल के बाद के प्रेस्कॉट और सीडर मिल नेटबर्स्ट कोर, जो पिछले पेंटियम 4 मॉडल और उनके पेंटियम डी और ज़ीऑन डेरिवेटिव में उपयोग किए गए थे, में एक लंबी 31-स्टेज पाइपलाइन है।
 * ज़ेलेरेटेड X10q नेटवर्क प्रोसेसर में एक हजार से अधिक चरण लंबी पाइपलाइन होती है, हालांकि इस मामले में इनमें से 200 चरण व्यक्तिगत रूप से प्रोग्राम किए गए निर्देशों के साथ स्वतंत्र सीपीयू का प्रतिनिधित्व करते हैं। शेष चरणों का उपयोग मेमोरी और ऑन-चिप फ़ंक्शन इकाइयों तक पहुंच को समन्वयित करने के लिए किया जाता है।

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

इतिहास
पाइपलाइनिंग का मौलिक उपयोग ILLIAC II प्रोजेक्ट और IBM स्ट्रेच प्रोजेक्ट में किया गया था, हालांकि एक सरल संस्करण का उपयोग पहले 1939 में Z1 (कंप्यूटर) और 1941 में Z3 (कंप्यूटर) में किया गया था।

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

पाइपलाइनिंग सुपर कंप्यूटर तक ही सीमित नहीं थी। 1976 में, अमदहल कॉर्पोरेशन की 470 श्रृंखला के सामान्य प्रयोजन मेनफ्रेम में 7-चरणीय पाइपलाइन और एक पेटेंट शाखा भविष्यवाणी सर्किट था।

खतरे
अनुक्रमिक निष्पादन का मॉडल मानता है कि प्रत्येक निर्देश अगले शुरू होने से पहले पूरा हो जाता है; यह धारणा पाइपलाइनयुक्त प्रोसेसर पर सत्य नहीं है। ऐसी स्थिति जहां अपेक्षित परिणाम समस्याग्रस्त हो, उसे हैज़र्ड (कंप्यूटर आर्किटेक्चर) के रूप में जाना जाता है। एक काल्पनिक प्रोसेसर के लिए निम्नलिखित दो रजिस्टर निर्देशों की कल्पना करें: 1: R5 में 1 जोड़ें 2: R5 को R6 में कॉपी करें यदि प्रोसेसर में प्रारंभिक चित्रण (लेख की शुरुआत में 'बेसिक फाइव-स्टेज पाइपलाइन') में सूचीबद्ध 5 चरण हैं, तो निर्देश 1 समय पर प्राप्त किया जाएगा।1 और इसका निष्पादन टी पर पूरा होगा5. निर्देश 2 टी पर प्राप्त किया जाएगा2और टी पर पूरा होगा6. पहला निर्देश टी पर अपने पांचवें चरण (रजिस्टर राइट बैक) के रूप में बढ़ी हुई संख्या को आर5 में जमा कर सकता है5. लेकिन दूसरे निर्देश को अपने दूसरे चरण (निर्देश डिकोड और रजिस्टर फ़ेच) में समय t पर R5 (R6 पर कॉपी करने के लिए) से नंबर मिल सकता है3. ऐसा लगता है कि पहले निर्देश ने तब तक मूल्य में वृद्धि नहीं की होगी। उपरोक्त कोड खतरे का आह्वान करता है।

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

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

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

शाखाएँ
सामान्य निर्देश अनुक्रम से बाहर की शाखा में अक्सर खतरा शामिल होता है। जब तक प्रोसेसर एक ही समय चक्र में शाखा को प्रभाव नहीं दे सकता, तब तक पाइपलाइन क्रमिक रूप से निर्देश प्राप्त करती रहेगी। ऐसे निर्देशों को प्रभावी होने की अनुमति नहीं दी जा सकती क्योंकि प्रोग्रामर ने नियंत्रण को प्रोग्राम के दूसरे भाग में स्थानांतरित कर दिया है।

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

शाखा भविष्यवाणी के कार्यान्वयन वाला एक प्रोसेसर जो आमतौर पर सही भविष्यवाणियां करता है, शाखा से प्रदर्शन दंड को कम कर सकता है। हालाँकि, यदि शाखाओं की भविष्यवाणी खराब होती है, तो यह प्रोसेसर के लिए अधिक काम पैदा कर सकता है, जैसे पाइपलाइन फ्लश कोड पथ को फ्लश करता है जिसने सही स्थान पर निष्पादन फिर से शुरू करने से पहले निष्पादन शुरू कर दिया है।

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

विशेष परिस्थितियाँ

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


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

डिज़ाइन संबंधी विचार

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


 * एक पाइपलाइन प्रोसेसर को अपने सभी कार्यों को मॉड्यूलर चरणों में व्यवस्थित करने की आवश्यकता के लिए रजिस्टरों के दोहराव की आवश्यकता हो सकती है, जिससे कुछ निर्देशों की विलंबता बढ़ जाती है।


 * अर्थव्यवस्था
 * प्रत्येक आश्रित चरण को सरल बनाकर, पाइपलाइनिंग जटिल सर्किटरी को जोड़ने की तुलना में जटिल संचालन को अधिक आर्थिक रूप से सक्षम कर सकती है, जैसे संख्यात्मक गणना के लिए। हालाँकि, एक प्रोसेसर जो पाइपलाइनिंग के साथ बढ़ी हुई गति को अपनाने से इनकार करता है, निर्माण के लिए सरल और सस्ता हो सकता है।


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

सचित्र उदाहरण
दाईं ओर चार चरणों वाली एक सामान्य पाइपलाइन है: लाना, डिकोड करना, निष्पादित करना और वापस लिखना। शीर्ष ग्रे बॉक्स निष्पादित होने की प्रतीक्षा कर रहे निर्देशों की सूची है, निचला ग्रे बॉक्स उन निर्देशों की सूची है जिनका निष्पादन पूरा हो चुका है, और मध्य सफेद बॉक्स पाइपलाइन है।

निष्पादन इस प्रकार है:

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

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

बुलबुले (चित्रण में नीले अंडाकार) के कारण, प्रोसेसर की डिकोड सर्किटरी चक्र 3 के दौरान निष्क्रिय है। इसकी निष्पादन सर्किटरी चक्र 4 के दौरान निष्क्रिय है और इसकी राइट-बैक सर्किटरी चक्र 5 के दौरान निष्क्रिय है।

जब बुलबुला पाइपलाइन से बाहर चला जाता है (चक्र 6 पर), तो सामान्य निष्पादन फिर से शुरू हो जाता है। परन्तु अभी सब एक कल्प लेट है। रंगों में दिखाए गए चार निर्देशों को पूरी तरह से निष्पादित करने में 7 के बजाय 8 चक्र (चक्र 1 से 8) लगेंगे।

यह भी देखें

 * प्रतीक्षा स्थिति
 * क्लासिक आरआईएससी पाइपलाइन

बाहरी संबंध

 * Branch Prediction in the Pentium Family (Archive.org copy)
 * ArsTechnica article on pipelining
 * Counterflow Pipeline Processor Architecture