सीपीयू आर्किटेक्चर एक झंडे रजिस्टर (फायदे) का उपयोग क्यों करते हैं? "


15

कुछ सीपीयू में एक झंडे का रजिस्टर (एआरएम, x86, ...) होता है, अन्य नहीं (एमआइपी, ...)। साइन, ओवरफ्लो आदि के लिए जाँच करने के लिए एक शून्य रजिस्टर और सशर्त शाखाओं का उपयोग करने के बजाय शाखा निर्देश के बाद झंडे के रजिस्टर को अपडेट करने के लिए एक सीएमपी निर्देश होने का क्या फायदा है?

जवाबों:


11

झंडे या नहीं झंडे के लिए कार्यान्वयन लागत का नाम बदलने के रजिस्टर के साथ आधुनिक माइक्रो-आर्किटेक्चर में काफी समान है। मुख्य अंतर जो मैं सोच सकता हूं, वह यह है कि कुछ झंडे एक मूल्य की विशेषताओं को इंगित करते हैं (क्या मूल्य नकारात्मक है? क्या मूल्य शून्य है? क्या मूल्य में सम या विषम समता है?), जबकि कुछ पिछले ऑपरेशन के दौरान हुई एक घटना का प्रतिनिधित्व करते हैं? (क्या ऐड इंस्ट्रक्शन में कैरी आउट या ओवरफ्लो था?) इससे MIPS पर कम से कम-आदर्श स्थिति पैदा हुई जब आप 32-बिट आर्किटेक्चर (या 128-बिट जोड़) पर 64-बिट जोड़ अनुकरण करना चाहते थे । 64-बिट वास्तुकला।) एक ले जाने वाले ध्वज के साथ अधिकांश आर्किटेक्चर पर एक विशेष हैadd-with-carryनिर्देश, जिसमें पिछले ऐड अनुदेश से कैरी झंडा भी शामिल है। यह झंडे रजिस्टरों के साथ कई आर्किटेक्चर पर अपेक्षाकृत सटीक अंकगणित को अपेक्षाकृत सस्ती बनाता है।

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

लेकिन MIPS यहाँ कुछ भी नहीं बचा है। वे समस्या को कहीं और ले गए। MIPS पर एक branch-on-equalनिर्देश है। इसका मतलब यह है कि शाखा निर्देश का वास्तव में एक ALU चरण होना चाहिए (जिसमें बिटवाइज़ xorऑपरेशन जैसी कोई चीज़ होती है, जिसके बाद norयह निर्धारित किया जाता है कि शाखा किस रास्ते पर जाती है, यह निर्धारित करने से पहले एकल बराबर / नहीं-बराबर बिट तक कम हो सकती है)।

डीईसी अल्फा आर्किटेक्चर ने एक ट्रिक का उपयोग करके अंतर को विभाजित करने की कोशिश की। DEC अल्फा में कोई झंडे रजिस्टर नहीं थे, लेकिन एक branch-on-equalनिर्देश भी नहीं था । शाखा निर्देशों के बजाय सभी एक ही सामान्य प्रयोजन रजिस्टर की स्थिति को देखते हैं। वहाँ है branch-on-zero, branch-on-not-zero, branch-on-less-than-zero, आदि चाल है कि आप हर सामान्य प्रयोजन रजिस्टर एक अतिरिक्त 65 वीं बिट, जिससे आप जान दे सकते हैं अन्य 64 बिट्स सब शून्य हैं या नहीं है। यह एक झंडे के रजिस्टर होने की तरह इसे और अधिक बनाता है: सभी शाखा निर्देश अपना फैसला करने के लिए एक ही बिट (जो पहले से ही गणना की गई है) को देखते हैं, लेकिन अब आप यह पता लगा रहे हैं कि सामान्य ALU के दौरान उस अतिरिक्त शून्य संकेतक बिट की गणना कैसे करें। चक्र। (और आप अभी भी बहु-सटीक अंकगणित नहीं कर सकते हैं पिछले ऑपरेशन से कैरी फ्लैग को देखकर।)


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

एक विवरण: सभी झंडों की गणना समान नहीं की गई है। कल्पना कीजिए कि आपके सीपीयू में पारंपरिक NZVC झंडे हैं। यदि सभी ALU निर्देशों को झंडे को अपडेट करने की अनुमति दी जाती है, तो आपको योजक / सबट्रेक्टर और कुछ muxes के बाद ध्वज निर्माण करना होगा। नकारात्मक ध्वज आसान है, यह सिर्फ एमएसबी है, जबकि शून्य झंडा महंगा है और हर बिट पर निर्भर करता है। अब, यदि आप झंडे को तुलना (और बिट परीक्षण) निर्देशों के लिए प्रतिबंधित करते हैं, तो जीरो झंडे की गणना स्रोत ऑपरेंड पर समानांतर XORs के साथ की जा सकती है, बिना घटाव के परिणाम की प्रतीक्षा किए। एक अतिरिक्त के बाद Z ध्वज की गणना करना लगभग बेकार है।
TEMLIB

7

1 आईएसए के नजरिए से

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

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

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

2 एक कार्यान्वयन के नजरिए से

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

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


2

32-बिट मशीन पर, बहु-परिशुद्धता जोड़ अनुक्रम के भाग के रूप में उपयोग किए जाने वाले "ऐड-ऑन-कैरी" निर्देश को 65 बिट्स ऑपरेंड को स्वीकार करने और 33 बिट्स योग की गणना करने की आवश्यकता होती है। स्रोत-रजिस्टर विनिर्देशों की पहचान होगी कि 64 ऑपरेंड बिट्स कहां से आने चाहिए, और गंतव्य-रजिस्टर विनिर्देश कहेंगे कि परिणाम के निचले 32 बिट्स कहां जाना चाहिए, लेकिन "अतिरिक्त" जोड़ने वाले ऑपरेंड या ऊपरी बिट के साथ क्या करना है परिणाम का? निर्देश के भाग के रूप में निर्दिष्ट करने की अनुमति दी जा रही है जहां अतिरिक्त ऑपरेंड से आना चाहिए और जहां अतिरिक्त परिणाम बिट जाना चाहिए, मध्यम उपयोगी होगा, लेकिन यह आमतौर पर इतना उपयोगी नहीं होगा जितना कि ओपोड में एक अतिरिक्त क्षेत्र को सही ठहराने के लिए। कैरी फ़्लैग को संभालने के लिए एक निश्चित "स्थान" होने से एक निर्देश-समय-निर्धारण के दृष्टिकोण से थोड़ा अजीब हो सकता है, लेकिन यह '

यदि कोई बहु-सटीक अंकगणित की अनुमति देने के लिए एक निर्देश सेट करने की कोशिश कर रहा था, लेकिन प्रत्येक निर्देश दो 32-बिट ऑपरेंड्स और एक 32-बिट गंतव्य ऑपरेटर तक सीमित था, तो चार निर्देशों में एक 64-बिट "ऐड" को लागू कर सकता है: "सेट" r5 + 1 यदि r0 + r2 अन्यथा ले या शून्य; कंप्यूट r4 = r1 + r3; कंप्यूट r5 = r4 + r5; गणना r4 = r0 + r2 ", लेकिन इससे आगे जाने पर प्रत्येक अतिरिक्त शब्द के लिए तीन निर्देशों की आवश्यकता होगी। पूरक स्रोत और गंतव्य के रूप में उपलब्ध कैरी फ़्लैग होने से प्रति शब्द एक निर्देश पर लागत कम हो जाती है।

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

ldr  r0,[r1]
add  r0,r0,r2
eors r4,r5,r6

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


1
"इंस्ट्रक्शन बिट कंट्रोल, इंस्ट्रक्शन फ्लैग रजिस्टर को अपडेट करता है या नहीं": उदाहरण के लिए पावरपीसी, स्पार्क में उपलब्ध है।
TEMLIB

MIPS में "r5 = r1 + r2; r6; r6 r1 से कम है; r7 = r3 + r4; r5 = R5 + R6;" का उपयोग किया जाता है। कुछ SIMD एक्सटेंशन तुलना का उपयोग कर सकते हैं जो कैरी को लागू करने के लिए कैरी और घटाव खोजने के लिए सभी बिट्स को शून्य या एक (यानी, शून्य या -1 ट्विस्ट पूरक पूर्णांक) सेट करते हैं।
पॉल ए। क्लेटन

@ PaulA.Clayton: मुझे लगता है कि आपका मतलब "अगर r5 r1 से कम है"। MIPS कैसे संभालती है गणित? क्या इसे प्रति शब्द तीन, तीन से अधिक या तीन निर्देशों से कम की आवश्यकता होगी?
सुपरकैट

@supercat हाँ, कि "r6 r5 से कम होने पर" सेट होना चाहिए था "!
पॉल ए। क्लेटन

@ PaulA.Clayton: कोई 32-बिट सिप पर दो 64-शब्द (2048-बिट) संख्याओं को जोड़ने के बारे में कैसे जाएगा? क्या बीच के चरणों में और बाहर ले जाने के लिए कोई कुशल तरीका है?
सुपरकैट

0

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


1
यह उत्तर विस्तार पर हल्का है। लंबे जवाब की आवश्यकता नहीं है, लेकिन कुछ और fleshed- बाहर एक अलग सुधार होगा।
डेविड रिचेर्बी

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