कई कारण हैं जो आपके पास बहुत बड़ी संख्या में रजिस्टर नहीं हैं:
- वे अधिकांश पाइपलाइन चरणों से जुड़े हुए हैं। शुरुआत के लिए, आपको उनके जीवनकाल को ट्रैक करने की जरूरत है, और आगे के परिणामों को पिछले चरणों में वापस करना होगा। जटिलता बहुत जल्दी से अचूक हो जाती है, और इसमें शामिल तारों की संख्या (शाब्दिक) एक ही दर से बढ़ती है। यह क्षेत्र पर महंगा है, जिसका अर्थ है कि यह एक निश्चित बिंदु के बाद बिजली, कीमत और प्रदर्शन पर महंगा है।
- यह निर्देश एन्कोडिंग स्थान लेता है। 16 रजिस्टर स्रोत और गंतव्य के लिए 4 बिट्स लेते हैं, और एक और 4 यदि आपके पास 3-ऑपरेंड निर्देश (जैसे एआरएम) हैं। यह एक बहुत बड़ा निर्देश सेट एन्कोडिंग स्थान है जो केवल रजिस्टर को निर्दिष्ट करने के लिए लिया गया है। यह अंततः डिकोडिंग, कोड आकार और फिर से जटिलता को प्रभावित करता है।
- एक ही परिणाम प्राप्त करने के लिए बेहतर तरीके हैं ...
इन दिनों हमारे पास बहुत सारे रजिस्टर हैं - वे केवल स्पष्ट रूप से क्रमादेशित नहीं हैं। हमारे पास "रजिस्टर नामकरण" है। जब आप केवल एक छोटे से सेट (8-32 रजिस्टर) का उपयोग करते हैं, तो वे वास्तव में बहुत बड़े सेट (जैसे 64-256) द्वारा समर्थित होते हैं। सीपीयू तब प्रत्येक रजिस्टर की दृश्यता को ट्रैक करता है, और उन्हें नामांकित सेट के लिए आवंटित करता है। उदाहरण के लिए, आप लोड कर सकते हैं, संशोधित कर सकते हैं, फिर एक पंक्ति में कई बार रजिस्टर में स्टोर कर सकते हैं, और इनमें से प्रत्येक ऑपरेशन वास्तव में एआरएम में कैश मिस आदि के आधार पर स्वतंत्र रूप से किया जाता है:
ldr r0, [r4]
add r0, r0, #1
str r0, [r4]
ldr r0, [r5]
add r0, r0, #1
str r0, [r5]
कॉर्टेक्स ए 9 कोर का नाम बदलकर रजिस्टर होता है, इसलिए "r0" का पहला लोड वास्तव में एक नामांकित वर्चुअल रजिस्टर पर जाता है - चलो इसे "v0" कहते हैं। लोड, इंक्रीमेंट और स्टोर "v0" पर होता है। इस बीच, हम r0 को फिर से लोड / संशोधित / स्टोर करते हैं, लेकिन इसका नाम बदलकर "v1" हो जाएगा क्योंकि यह r0 का उपयोग करके एक पूरी तरह से स्वतंत्र अनुक्रम है। मान लें कि "r4" में पॉइंटर से लोड कैश मिस के कारण रुका हुआ है। यह ठीक है - हमें तैयार होने के लिए "r0" की प्रतीक्षा करने की आवश्यकता नहीं है। क्योंकि इसका नाम बदल दिया गया है, इसलिए हम अगले अनुक्रम को "v1" (आरएपी के लिए मैप किया गया) के साथ चला सकते हैं - और शायद यह एक कैश हिट है और हमारे पास सिर्फ एक बड़ी प्रदर्शन जीत थी।
ldr v0, [v2]
add v0, v0, #1
str v0, [v2]
ldr v1, [v3]
add v1, v1, #1
str v1, [v3]
मुझे लगता है कि x86 इन दिनों नामांकित रजिस्टरों की एक विशाल संख्या तक है (बॉलपार्क 256)। इसका मतलब यह होगा कि हर निर्देश के लिए 8 बिट्स 2 है, केवल यह कहने के लिए कि स्रोत और गंतव्य क्या है। यह बड़े पैमाने पर कोर और उसके आकार के लिए आवश्यक तारों की संख्या में वृद्धि करेगा। तो लगभग 16-32 रजिस्टरों का एक मीठा स्थान है जो अधिकांश डिजाइनरों ने सीपीयू डिजाइन के लिए और आउट-ऑफ-ऑर्डर ऑर्डर के लिए तय किया है, रजिस्टर का नामकरण इसे कम करने का तरीका है।
संपादित करें : इस पर आउट-ऑफ-ऑर्डर निष्पादन और पंजीकरण का महत्व। एक बार जब आपके पास OOO होता है, तो रजिस्टरों की संख्या इतनी अधिक नहीं होती है, क्योंकि वे सिर्फ "अस्थायी टैग" होते हैं और बहुत बड़े वर्चुअल रजिस्टर सेट का नाम बदल जाते हैं। आप नहीं चाहते कि संख्या बहुत कम हो, क्योंकि छोटे कोड अनुक्रम लिखना मुश्किल हो जाता है। यह x86-32 के लिए एक समस्या है, क्योंकि सीमित 8 रजिस्टरों का अर्थ है ढेर सारी अस्थायीियां स्टैक के माध्यम से जा रही हैं, और कोर को पढ़ने के लिए अतिरिक्त तर्क की आवश्यकता होती है / मेमोरी में लिखते हैं। यदि आपके पास OOO नहीं है, तो आप आमतौर पर एक छोटे कोर के बारे में बात कर रहे हैं, जिस स्थिति में एक बड़ा रजिस्टर सेट खराब लागत / प्रदर्शन लाभ है।
तो रजिस्टर बैंक के आकार के लिए एक प्राकृतिक मीठा स्थान है जो सीपीयू के अधिकांश वर्गों के लिए लगभग 32 वास्तुकला वाले रजिस्टरों में अधिकतम होता है। x86-32 में 8 रजिस्टर हैं और यह निश्चित रूप से बहुत छोटा है। एआरएम 16 रजिस्टरों के साथ गया और यह एक अच्छा समझौता है। 32 रजिस्टरों से बहुत अधिक है अगर कुछ भी - आप अंतिम 10 या तो की जरूरत नहीं है।
इसमें से कोई भी आपको एसएसई और अन्य वेक्टर फ़्लोटिंग पॉइंट कोप्रोसेसर्स के लिए प्राप्त अतिरिक्त रजिस्टरों पर नहीं छूता है। वे अतिरिक्त सेट के रूप में समझ में आते हैं क्योंकि वे पूर्णांक कोर के स्वतंत्र रूप से चलते हैं, और सीपीयू की जटिलता को तेजी से नहीं बढ़ाते हैं।