जाहिरात बंद करा

माईक ऍश त्याच्या ब्लॉगवर समर्पित iPhone 64S मध्ये 5-बिट आर्किटेक्चरवर स्विच करण्याचे व्यावहारिक परिणाम. हा लेख त्याच्या निष्कर्षांवर आधारित आहे.

या मजकुराचे कारण म्हणजे 5-बिट ARM प्रोसेसर असलेल्या नवीन iPhone 64s चा वापरकर्ते आणि बाजारासाठी नेमका अर्थ काय आहे याबद्दल मोठ्या प्रमाणात चुकीची माहिती पसरवली जात आहे. येथे आम्ही विकासकांसाठी या संक्रमणाची कार्यक्षमता, क्षमता आणि परिणाम याबद्दल वस्तुनिष्ठ माहिती आणण्याचा प्रयत्न करू.

"64 बिट"

प्रोसेसरचे दोन भाग आहेत ज्याचा संदर्भ "X-bit" लेबल करू शकतो - पूर्णांक नोंदणीची रुंदी आणि पॉइंटरची रुंदी. सुदैवाने, बऱ्याच आधुनिक प्रोसेसरवर ही रुंदी समान आहे, म्हणून A7 च्या बाबतीत याचा अर्थ 64-बिट पूर्णांक नोंदणी आणि 64-बिट पॉइंटर.

तथापि, "64bit" चा अर्थ काय नाही हे दर्शवणे तितकेच महत्वाचे आहे: रॅम भौतिक पत्त्याचा आकार. RAM सह संप्रेषण करण्यासाठी बिट्सची संख्या (अशा प्रकारे डिव्हाइस समर्थन करू शकणारी RAM चे प्रमाण) CPU बिट्सच्या संख्येशी संबंधित नाही. एआरएम प्रोसेसरमध्ये 26- आणि 40-बिट पत्ते असतात आणि ते उर्वरित सिस्टमपेक्षा स्वतंत्रपणे बदलले जाऊ शकतात.

  • डेटा बस आकार. RAM किंवा बफर मेमरी मधून प्राप्त झालेल्या डेटाचे प्रमाण या घटकापासून स्वतंत्र आहे. वैयक्तिक प्रोसेसर सूचना वेगवेगळ्या प्रमाणात डेटाची विनंती करू शकतात, परंतु ते एकतर भागांमध्ये पाठवले जातात किंवा मेमरीमधून आवश्यकतेपेक्षा जास्त प्राप्त केले जातात. हे डेटा क्वांटमच्या आकारावर अवलंबून असते. आयफोन 5 आधीपासून 64-बिट क्वांटामध्ये मेमरीमधून डेटा प्राप्त करतो (आणि त्यात 32-बिट प्रोसेसर आहे), आणि आम्ही 192 बिट्स पर्यंत आकारांचा सामना करू शकतो.
  • फ्लोटिंग पॉइंटशी संबंधित काहीही. अशा रजिस्टर्सचा आकार (FPU) पुन्हा प्रोसेसरच्या अंतर्गत कामकाजापेक्षा स्वतंत्र असतो. एआरएम ६४ (६४-बिट एआरएम प्रोसेसर) पूर्वीपासून ६४-बिट एफपीयू वापरत आहे.

सामान्य फायदे आणि तोटे

आम्ही अन्यथा समान 32 बिट आणि 64 बिट आर्किटेक्चरची तुलना केल्यास, ते सामान्यतः भिन्न नसतात. ऍपल मोबाईल डिव्हाइसेसमध्ये 64 बिटकडे का जात आहे याचे कारण शोधत असलेल्या लोकांच्या सामान्य गोंधळाचे हे एक कारण आहे. तथापि, हे सर्व A7 (ARM64) प्रोसेसरच्या विशिष्ट पॅरामीटर्सवरून येते आणि Apple ते कसे वापरते, केवळ प्रोसेसरमध्ये 64-बिट आर्किटेक्चर आहे यावरूनच नाही.

तथापि, आपण अद्याप या दोन आर्किटेक्चरमधील फरक पाहिल्यास, आपल्याला अनेक फरक आढळतील. स्पष्ट आहे की 64-बिट पूर्णांक नोंदणी 64-बिट पूर्णांक अधिक कार्यक्षमतेने हाताळू शकतात. याआधीही, 32-बिट प्रोसेसरवर त्यांच्याबरोबर काम करणे शक्य होते, परंतु याचा अर्थ सहसा त्यांना 32-बिट लांब तुकड्यांमध्ये विभागणे होते, ज्यामुळे गणना हळू होते. त्यामुळे 64-बिट प्रोसेसर साधारणपणे 64-बिटच्या प्रमाणेच 32-बिट प्रकारांची गणना करू शकतो. याचा अर्थ असा की जे अनुप्रयोग साधारणपणे 64-बिट प्रकार वापरतात ते 64-बिट प्रोसेसरवर खूप जलद चालतात.

प्रोसेसर वापरत असलेल्या एकूण RAM वर 64bit चा परिणाम होत नसला तरी, एका प्रोग्राममध्ये RAM च्या मोठ्या भागांसह कार्य करणे सोपे करते. 32-बिट प्रोसेसरवर चालणाऱ्या कोणत्याही एका प्रोग्राममध्ये फक्त 4 GB ॲड्रेस स्पेस असते. ऑपरेटिंग सिस्टम आणि मानक लायब्ररी काहीतरी घेतात हे लक्षात घेऊन, हे अनुप्रयोग वापरण्यासाठी 1-3 GB च्या दरम्यान प्रोग्राम सोडते. तथापि, 32-बिट सिस्टममध्ये 4 GB पेक्षा जास्त RAM असल्यास, ती मेमरी वापरणे थोडे अधिक क्लिष्ट आहे. आमच्या प्रोग्रामसाठी (मेमरी व्हर्च्युअलायझेशन) मेमरीचे हे मोठे भाग मॅप करण्यासाठी आम्हाला ऑपरेटिंग सिस्टमला सक्तीचा अवलंब करावा लागेल किंवा आम्ही प्रोग्रामला अनेक प्रक्रियांमध्ये विभाजित करू शकतो (जेथे प्रत्येक प्रक्रियेमध्ये पुन्हा थेट ॲड्रेसिंगसाठी 4GB मेमरी उपलब्ध आहे).

तथापि, हे "हॅक" इतके अवघड आणि हळू आहेत की कमीतकमी अनुप्रयोग त्यांचा वापर करतात. सराव मध्ये, 32-बिट प्रोसेसरवर, प्रत्येक प्रोग्राम फक्त त्याची 1-3 GB मेमरी वापरतो आणि अधिक उपलब्ध RAM एकाच वेळी अनेक प्रोग्राम्स चालविण्यासाठी किंवा ही मेमरी बफर (कॅशिंग) म्हणून वापरण्यासाठी वापरली जाऊ शकते. हे वापर व्यावहारिक आहेत, परंतु आम्ही कोणत्याही प्रोग्रामला 4GB पेक्षा मोठ्या मेमरी सहज वापरण्यास सक्षम होऊ इच्छितो.

आता आम्ही वारंवार (वास्तविक चुकीच्या) दाव्याकडे येतो की 4GB पेक्षा जास्त मेमरीशिवाय, 64-बिट आर्किटेक्चर निरुपयोगी आहे. कमी मेमरी असलेल्या सिस्टीमवरही मोठी ॲड्रेस स्पेस उपयुक्त आहे. मेमरी-मॅप केलेल्या फायली हे एक सुलभ साधन आहे जेथे फाइलच्या सामग्रीचा भाग तार्किकरित्या प्रक्रियेच्या मेमरीशी जोडला जातो, संपूर्ण फाइल मेमरीमध्ये लोड न करता. अशा प्रकारे, सिस्टम, उदाहरणार्थ, RAM क्षमतेपेक्षा कितीतरी पटीने मोठ्या फाइल्सवर हळूहळू प्रक्रिया करू शकते. 32-बिट सिस्टमवर, अशा मोठ्या फायली विश्वसनीयरित्या मेमरी-मॅप केल्या जाऊ शकत नाहीत, तर 64-बिट सिस्टमवर, ते केकचा तुकडा आहे, अधिक मोठ्या ॲड्रेस स्पेसमुळे धन्यवाद.

तथापि, पॉइंटर्सचा मोठा आकार देखील एक मोठा तोटा आणतो: अन्यथा समान प्रोग्राम्सना 64-बिट प्रोसेसरवर अधिक मेमरी आवश्यक असते (हे मोठे पॉइंटर्स कुठेतरी संग्रहित केले पाहिजेत). पॉइंटर्स हा प्रोग्राम्सचा वारंवार भाग असल्याने, हा फरक कॅशेवर भार टाकू शकतो, ज्यामुळे संपूर्ण सिस्टम हळू चालते. म्हणून दृष्टीकोनातून, आपण पाहू शकतो की जर आपण प्रोसेसर आर्किटेक्चरला 64-बिटमध्ये बदलले तर ते प्रत्यक्षात संपूर्ण सिस्टमला मंद करेल. त्यामुळे हा घटक इतर ठिकाणी अधिक ऑप्टिमायझेशनद्वारे संतुलित केला पाहिजे.

एआरएमएक्सएनयूएमएक्स

A7, नवीन iPhone 64s ला उर्जा देणारा 5-बिट प्रोसेसर, केवळ विस्तीर्ण नोंदणीसह एक नियमित ARM प्रोसेसर नाही. ARM64 मध्ये जुन्या, 32-बिट आवृत्तीपेक्षा मोठ्या सुधारणा आहेत.

Apple A7 प्रोसेसर.

नोंदणी

ARM64 मध्ये 32-बिट ARM पेक्षा दुप्पट पूर्णांक नोंदणी आहेत (रजिस्टरची संख्या आणि रुंदी गोंधळात टाकणार नाही याची काळजी घ्या - आम्ही "64-बिट" विभागात रुंदीबद्दल बोललो. त्यामुळे ARM64 मध्ये दुप्पट रुंद आणि दुप्पट दोन्ही आहेत नोंदणी). 32-बिट एआरएममध्ये 16 पूर्णांक नोंदणी आहेत: एक प्रोग्राम काउंटर (पीसी - वर्तमान निर्देशांची संख्या समाविष्टीत आहे), एक स्टॅक पॉइंटर (प्रगतीमध्ये असलेल्या कार्यासाठी एक पॉइंटर), एक लिंक रजिस्टर (समाप्तीनंतर परत येण्यासाठी पॉइंटर फंक्शनचे) आणि उर्वरित 13 अनुप्रयोग वापरासाठी आहेत. तथापि, ARM64 मध्ये 32 पूर्णांक नोंदी आहेत, ज्यामध्ये एक शून्य रजिस्टर, एक लिंक रजिस्टर, एक फ्रेम पॉइंटर (स्टॅक पॉइंटर प्रमाणे), आणि एक भविष्यासाठी राखीव आहे. यामुळे आम्हाला 28-बिट एआरएमच्या दुप्पट, ॲप्लिकेशन वापरासाठी 32 रजिस्टर्स मिळतात. त्याच वेळी, ARM64 ने फ्लोटिंग पॉइंट नंबर (FPU) रजिस्टर्सची संख्या 16 वरून 32 128-बिट रजिस्टर्सवर दुप्पट केली.

पण रजिस्टर्सची संख्या इतकी महत्त्वाची का आहे? मेमरी साधारणपणे CPU गणनेपेक्षा धीमी असते आणि वाचन/लेखनास बराच वेळ लागू शकतो. यामुळे वेगवान प्रोसेसरला मेमरीची वाट पहावी लागेल आणि आम्ही सिस्टमच्या नैसर्गिक वेग मर्यादा गाठू. प्रोसेसर हे अपंगत्व बफरच्या थरांनी लपविण्याचा प्रयत्न करतात, परंतु सर्वात वेगवान (L1) अजूनही प्रोसेसरच्या गणनेपेक्षा कमी आहे. तथापि, रजिस्टर्स हे प्रोसेसरमध्ये थेट मेमरी सेल असतात आणि त्यांचे वाचन/लेखन प्रोसेसरचा वेग कमी करू नये म्हणून जलद असते. रजिस्टर्सची संख्या म्हणजे प्रोसेसरच्या गणनेसाठी सर्वात वेगवान मेमरीची रक्कम, जी संपूर्ण सिस्टमच्या गतीवर मोठ्या प्रमाणात परिणाम करते.

त्याच वेळी, या गतीला कंपायलरकडून उत्तम ऑप्टिमायझेशन समर्थन आवश्यक आहे, जेणेकरून भाषा या रजिस्टर्सचा वापर करू शकेल आणि सामान्य ऍप्लिकेशन (स्लो) मेमरीमध्ये सर्वकाही संग्रहित करण्याची गरज नाही.

सूचना सेट

ARM64 सुचना संचामध्ये मोठे बदल देखील आणते. इंस्ट्रक्शन सेट हा अणु ऑपरेशन्सचा एक संच असतो जो प्रोसेसर करू शकतो (उदा. 'ADD register1 register2' दोन रजिस्टरमध्ये संख्या जोडतो). वैयक्तिक भाषांसाठी उपलब्ध कार्ये या सूचनांनी बनलेली आहेत. अधिक जटिल फंक्शन्सने अधिक सूचना कार्यान्वित केल्या पाहिजेत, जेणेकरून ते हळू असू शकतात.

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

32 बिट सह सुसंगतता

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

रनटाइम बदलतो

रनटाइम हा कोड आहे जो प्रोग्रामिंग भाषेमध्ये फंक्शन्स जोडतो, जो अनुप्रयोग चालू असताना, भाषांतरानंतर वापरण्यास सक्षम असतो. ऍपलला ऍप्लिकेशन सुसंगतता राखण्याची आवश्यकता नसल्यामुळे (64-बिट बायनरी 32-बिटवर चालते), ते ऑब्जेक्टिव्ह-सी भाषेमध्ये आणखी काही सुधारणा करू शकतात.

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

पॉइंटर 64 बिट लांब असले तरी, ARM64 वर पॉइंटरच्या स्वतःच्या पत्त्यासाठी फक्त 33 बिट वापरले जातात. आणि जर आम्ही उर्वरित पॉइंटर बिट्स विश्वासार्हपणे अनमास्क करू शकलो, तर आम्ही या जागेचा वापर अतिरिक्त डेटा साठवण्यासाठी करू शकतो - जसे उल्लेख केलेल्या टॅग केलेल्या पॉइंटरच्या बाबतीत. वैचारिकदृष्ट्या, हे ऑब्जेक्टिव्ह-सीच्या इतिहासातील सर्वात मोठे बदल आहे, जरी ते विक्रीयोग्य वैशिष्ट्य नसले तरी - त्यामुळे बहुतेक वापरकर्त्यांना हे कळणार नाही की Apple कशा प्रकारे ऑब्जेक्टिव्ह-सी पुढे जात आहे.

अशा टॅग केलेल्या पॉइंटरच्या उरलेल्या जागेत साठवता येणाऱ्या उपयुक्त डेटाबद्दल, उदाहरणार्थ, ऑब्जेक्टिव्ह-सी आता तथाकथित संग्रहित करण्यासाठी वापरत आहे. संदर्भ संख्या (संदर्भांची संख्या). पूर्वी, संदर्भ संख्या मेमरीमध्ये वेगळ्या ठिकाणी, त्याच्यासाठी तयार केलेल्या हॅश टेबलमध्ये संग्रहित केली गेली होती, परंतु मोठ्या संख्येने alloc/dealloc/retain/release कॉल्सच्या बाबतीत यामुळे संपूर्ण प्रणालीची गती कमी होऊ शकते. थ्रेड सुरक्षिततेमुळे टेबल लॉक करावे लागले, त्यामुळे दोन थ्रेडमधील दोन वस्तूंची संदर्भ संख्या एकाच वेळी बदलता आली नाही. तथापि, हे मूल्य नव्याने तथाकथित उर्वरित मध्ये समाविष्ट केले आहे आहे एक निर्देशक हा आणखी एक अस्पष्ट, परंतु भविष्यात मोठा फायदा आणि प्रवेग आहे. तथापि, 32-बिट आर्किटेक्चरमध्ये हे कधीही साध्य होऊ शकत नाही.

संबंधित वस्तूंबद्दलची माहिती, ऑब्जेक्ट कमकुवतपणे संदर्भित आहे की नाही, ऑब्जेक्टसाठी डिस्ट्रक्टर जनरेट करणे आवश्यक आहे का, इत्यादी, ऑब्जेक्ट्सच्या पॉइंटर्सच्या उर्वरित ठिकाणी नव्याने समाविष्ट केले आहे. या माहितीबद्दल धन्यवाद, ऑब्जेक्टिव्ह-सी रनटाइम मूलभूतपणे रनटाइमला गती देण्यास सक्षम आहे, जे प्रत्येक अनुप्रयोगाच्या गतीमध्ये प्रतिबिंबित होते. चाचणीपासून, याचा अर्थ सर्व मेमरी व्यवस्थापन कॉलचा सुमारे 40-50% वेग वाढतो. फक्त 64-बिट पॉइंटर्सवर स्विच करून आणि ही नवीन जागा वापरून.

निष्कर्ष

जरी स्पर्धक 64-बिट आर्किटेक्चरकडे जाणे अनावश्यक आहे ही कल्पना पसरवण्याचा प्रयत्न करतील, तरीही तुम्हाला हे आधीच माहित असेल की हे फक्त एक अत्यंत माहिती नसलेले मत आहे. हे खरे आहे की तुमची भाषा किंवा ॲप्लिकेशन्सशी जुळवून न घेता 64-बिटवर स्विच केल्याने खरोखर काहीही अर्थ नाही - यामुळे संपूर्ण सिस्टम धीमा होते. परंतु नवीन A7 नवीन सूचना संचासह आधुनिक ARM64 वापरते आणि Apple ने संपूर्ण ऑब्जेक्टिव्ह-सी भाषेचे आधुनिकीकरण करण्यासाठी आणि नवीन क्षमतांचा लाभ घेण्याचा त्रास घेतला आहे - म्हणून वचन दिलेला वेग.

येथे आम्ही 64-बिट आर्किटेक्चर हे योग्य पाऊल का आहे याची अनेक कारणे नमूद केली आहेत. ही आणखी एक "अंडर द हूड" क्रांती आहे, ज्यासाठी Apple केवळ डिझाइन, वापरकर्ता इंटरफेस आणि समृद्ध इकोसिस्टमसह आघाडीवर राहण्याचा प्रयत्न करेल, परंतु मुख्यतः बाजारातील सर्वात आधुनिक तंत्रज्ञानासह.

स्त्रोत: mikeash.com
.