विज्ञापन बंद करें

माइक ऐश अपने ब्लॉग पर समर्पित iPhone 64S में 5-बिट आर्किटेक्चर पर स्विच करने के व्यावहारिक निहितार्थ। यह लेख उनके निष्कर्षों पर आधारित है।

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

"64 बिट"

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

हालाँकि, यह बताना भी उतना ही महत्वपूर्ण है कि "64 बिट" का क्या मतलब नहीं है: RAM भौतिक पता आकार. रैम के साथ संचार करने के लिए बिट्स की संख्या (इस प्रकार एक डिवाइस द्वारा समर्थित रैम की मात्रा) सीपीयू बिट्स की संख्या से संबंधित नहीं है। एआरएम प्रोसेसर में 26- और 40-बिट पते के बीच कहीं भी होता है और इसे बाकी सिस्टम से स्वतंत्र रूप से बदला जा सकता है।

  • डेटा बस का आकार. रैम या बफर मेमोरी से प्राप्त डेटा की मात्रा भी इस कारक से समान रूप से स्वतंत्र है। अलग-अलग प्रोसेसर निर्देश अलग-अलग मात्रा में डेटा का अनुरोध कर सकते हैं, लेकिन उन्हें या तो टुकड़ों में भेजा जाता है या मेमोरी से आवश्यकता से अधिक प्राप्त किया जाता है। यह डेटा क्वांटम के आकार पर निर्भर करता है। iPhone 5 पहले से ही मेमोरी से 64-बिट क्वांटा (और इसमें 32-बिट प्रोसेसर) में डेटा प्राप्त करता है, और हम 192 बिट तक के आकार का सामना कर सकते हैं।
  • फ़्लोटिंग पॉइंट से संबंधित कुछ भी. ऐसे रजिस्टरों (एफपीयू) का आकार फिर से प्रोसेसर की आंतरिक कार्यप्रणाली से स्वतंत्र होता है। ARM, ARM64 (64-बिट ARM प्रोसेसर) से पहले से 64-बिट FPU का उपयोग कर रहा है।

सामान्य फायदे और नुकसान

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

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

हालाँकि 64 बिट प्रोसेसर द्वारा उपयोग की जा सकने वाली रैम की कुल मात्रा को प्रभावित नहीं करता है, यह एक प्रोग्राम में रैम के बड़े हिस्से के साथ काम करना आसान बना सकता है। 32-बिट प्रोसेसर पर चलने वाले किसी भी एकल प्रोग्राम में केवल 4 जीबी एड्रेस स्पेस होता है। इस बात को ध्यान में रखते हुए कि ऑपरेटिंग सिस्टम और मानक लाइब्रेरीज़ कुछ न कुछ लेते हैं, इससे एप्लिकेशन के उपयोग के लिए प्रोग्राम के पास 1-3 जीबी के बीच की जगह बचती है। हालाँकि, यदि 32-बिट सिस्टम में 4 जीबी से अधिक रैम है, तो उस मेमोरी का उपयोग करना थोड़ा अधिक जटिल है। हमें अपने प्रोग्राम (मेमोरी वर्चुअलाइजेशन) के लिए मेमोरी के इन बड़े हिस्सों को मैप करने के लिए ऑपरेटिंग सिस्टम को मजबूर करने का सहारा लेना होगा, या हम प्रोग्राम को कई प्रक्रियाओं में विभाजित कर सकते हैं (जहां प्रत्येक प्रक्रिया में सैद्धांतिक रूप से सीधे एड्रेसिंग के लिए 4 जीबी मेमोरी उपलब्ध होती है)।

हालाँकि, ये "हैक" इतने कठिन और धीमे हैं कि कम से कम एप्लिकेशन इनका उपयोग करते हैं। व्यवहार में, 32-बिट प्रोसेसर पर, प्रत्येक प्रोग्राम केवल अपनी 1-3 जीबी मेमोरी का उपयोग करेगा, और अधिक उपलब्ध रैम का उपयोग एक ही समय में कई प्रोग्राम चलाने के लिए किया जा सकता है या इस मेमोरी को बफर (कैशिंग) के रूप में उपयोग किया जा सकता है। ये उपयोग व्यावहारिक हैं, लेकिन हम चाहेंगे कि कोई भी प्रोग्राम 4 जीबी से बड़ी मेमोरी का आसानी से उपयोग करने में सक्षम हो।

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

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

ARM64

A7, नए iPhone 64s को पावर देने वाला 5-बिट प्रोसेसर, व्यापक रजिस्टरों वाला एक नियमित ARM प्रोसेसर नहीं है। ARM64 में पुराने, 32-बिट संस्करण की तुलना में बड़े सुधार शामिल हैं।

एप्पल A7 प्रोसेसर.

रजिस्ट्री

ARM64 में 32-बिट ARM की तुलना में दोगुने पूर्णांक रजिस्टर हैं (सावधान रहें कि रजिस्टरों की संख्या और चौड़ाई को भ्रमित न करें - हमने "64-बिट" अनुभाग में चौड़ाई के बारे में बात की थी। इसलिए ARM64 में दोगुने चौड़े रजिस्टर और दोगुने रजिस्टर हैं रजिस्टर)। 32-बिट एआरएम में 16 पूर्णांक रजिस्टर हैं: एक प्रोग्राम काउंटर (पीसी - वर्तमान निर्देश की संख्या शामिल है), एक स्टैक पॉइंटर (प्रगति में चल रहे फ़ंक्शन के लिए एक पॉइंटर), एक लिंक रजिस्टर (फ़ंक्शन के बाद वापस लौटने के लिए एक पॉइंटर) समाप्त), और शेष 13 अनुप्रयोग उपयोग के लिए हैं। हालाँकि, ARM64 में 32 पूर्णांक रजिस्टर हैं, जिनमें एक शून्य रजिस्टर, एक लिंक रजिस्टर, एक फ्रेम पॉइंटर (स्टैक पॉइंटर के समान), और एक भविष्य के लिए आरक्षित है। इससे हमारे पास एप्लिकेशन उपयोग के लिए 28 रजिस्टर रह जाते हैं, जो 32-बिट एआरएम से दोगुने से भी अधिक है। उसी समय, ARM64 ने फ्लोटिंग-पॉइंट नंबर (FPU) रजिस्टरों की संख्या 16 से दोगुनी करके 32 128-बिट रजिस्टर कर दी।

लेकिन रजिस्टरों की संख्या इतनी महत्वपूर्ण क्यों है? मेमोरी आम तौर पर सीपीयू गणनाओं की तुलना में धीमी होती है और पढ़ने/लिखने में बहुत लंबा समय लग सकता है। इससे तेज प्रोसेसर को मेमोरी के लिए इंतजार करना पड़ेगा और हम सिस्टम की प्राकृतिक गति सीमा तक पहुंच जाएंगे। प्रोसेसर इस बाधा को बफ़र्स की परतों के साथ छिपाने की कोशिश करते हैं, लेकिन सबसे तेज़ (L1) भी प्रोसेसर की गणना से धीमा है। हालाँकि, रजिस्टर सीधे प्रोसेसर में मेमोरी सेल होते हैं और उनका पढ़ना/लिखना इतना तेज़ होता है कि प्रोसेसर धीमा नहीं होता है। व्यावहारिक रूप से रजिस्टरों की संख्या का मतलब प्रोसेसर गणना के लिए सबसे तेज़ मेमोरी की मात्रा है, जो पूरे सिस्टम की गति को बहुत प्रभावित करती है।

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

निर्देश समुच्चय

ARM64 निर्देश सेट में भी बड़े बदलाव लाता है। एक निर्देश सेट परमाणु संचालन का एक सेट है जिसे एक प्रोसेसर निष्पादित कर सकता है (उदाहरण के लिए 'ADD रजिस्टर1 रजिस्टर2' दो रजिस्टरों में संख्याएँ जोड़ता है)। अलग-अलग भाषाओं के लिए उपलब्ध फ़ंक्शन इन निर्देशों से बने होते हैं। अधिक जटिल कार्यों को अधिक निर्देशों को निष्पादित करना होगा, ताकि वे धीमे हो सकें।

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

32 बिट के साथ संगतता

यह उल्लेख करना महत्वपूर्ण है कि ए7 अनुकरण की आवश्यकता के बिना 32-बिट मोड में पूरी तरह से चल सकता है। इसका मतलब है कि नया iPhone 5s 32-बिट ARM पर संकलित एप्लिकेशन को बिना किसी मंदी के चला सकता है। हालाँकि, तब यह नए ARM64 फ़ंक्शंस का उपयोग नहीं कर सकता है, इसलिए केवल A7 के लिए एक विशेष बिल्ड बनाना हमेशा सार्थक होता है, जो बहुत तेज़ चलना चाहिए।

रनटाइम बदलता है

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

उनमें से एक तथाकथित है टैग किया गया सूचक (चिह्नित सूचक). आम तौर पर, ऑब्जेक्ट और उन ऑब्जेक्ट के पॉइंटर्स को मेमोरी के अलग-अलग हिस्सों में संग्रहीत किया जाता है। हालाँकि, नए पॉइंटर प्रकार कम डेटा वाली कक्षाओं को ऑब्जेक्ट को सीधे पॉइंटर में संग्रहीत करने की अनुमति देते हैं। यह चरण ऑब्जेक्ट के लिए सीधे मेमोरी आवंटित करने की आवश्यकता को समाप्त कर देता है, बस एक पॉइंटर और उसके अंदर ऑब्जेक्ट बनाएं। टैग किए गए पॉइंटर्स केवल 64-बिट आर्किटेक्चर में समर्थित हैं, इस तथ्य के कारण भी कि 32-बिट पॉइंटर में पर्याप्त उपयोगी डेटा संग्रहीत करने के लिए पर्याप्त जगह नहीं है। इसलिए, OS X के विपरीत, iOS ने अभी तक इस सुविधा का समर्थन नहीं किया है। हालाँकि, ARM64 के आगमन के साथ, यह बदल रहा है, और iOS ने इस संबंध में भी OS

हालाँकि पॉइंटर्स 64 बिट लंबे होते हैं, ARM64 पर पॉइंटर के अपने पते के लिए केवल 33 बिट्स का उपयोग किया जाता है। और यदि हम शेष पॉइंटर बिट्स को विश्वसनीय रूप से उजागर करने में सक्षम हैं, तो हम इस स्थान का उपयोग अतिरिक्त डेटा संग्रहीत करने के लिए कर सकते हैं - जैसा कि उल्लिखित टैग किए गए पॉइंटर्स के मामले में है। वैचारिक रूप से, यह ऑब्जेक्टिव-सी के इतिहास में सबसे बड़े बदलावों में से एक है, हालांकि यह एक विपणन योग्य विशेषता नहीं है - इसलिए अधिकांश उपयोगकर्ताओं को यह नहीं पता होगा कि ऐप्पल ऑब्जेक्टिव-सी को कैसे आगे बढ़ा रहा है।

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

संबंधित वस्तुओं के बारे में जानकारी, क्या वस्तु को कमजोर रूप से संदर्भित किया गया है, क्या वस्तु के लिए एक विध्वंसक उत्पन्न करना आवश्यक है, आदि को भी वस्तुओं के संकेतक के शेष स्थान में नई तरह से डाला जाता है। इस जानकारी के लिए धन्यवाद, ऑब्जेक्टिव-सी रनटाइम मूल रूप से रनटाइम को तेज़ करने में सक्षम है, जो प्रत्येक एप्लिकेशन की गति में परिलक्षित होता है। परीक्षण से, इसका मतलब है कि सभी मेमोरी प्रबंधन कॉलों की गति लगभग 40-50% है। बस 64-बिट पॉइंटर्स पर स्विच करके और इस नए स्थान का उपयोग करके।

záver

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

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

स्रोत: mikeash.com
.