Жарнаманы жабу

Майк Эш блогында арнады iPhone 64S-де 5-биттік архитектураға ауысудың практикалық салдары. Бұл мақала оның қорытындыларына сүйенеді.

Бұл мәтіннің себебі негізінен 5 биттік ARM процессоры бар жаңа iPhone 64s пайдаланушылар мен нарық үшін нені білдіретіні туралы жалған ақпараттың көп таралуына байланысты. Мұнда біз әзірлеушілер үшін осы ауысудың өнімділігі, мүмкіндіктері және салдары туралы объективті ақпарат беруге тырысамыз.

"64 бит"

Процессордың «X-бит» белгісі сілтеме жасай алатын екі бөлігі бар - бүтін регистрлердің ені және көрсеткіштердің ені. Бақытымызға орай, қазіргі заманғы процессорлардың көпшілігінде бұл ені бірдей, сондықтан A7 жағдайында бұл 64 биттік бүтін регистрлер мен 64 биттік көрсеткіштерді білдіреді.

Дегенмен, «64 бит» нені білдірмейтінін көрсету маңызды: ЖЖҚ физикалық мекенжай өлшемі. ЖЖҚ-мен байланысу үшін биттердің саны (осылайша құрылғы қолдай алатын ЖЖҚ көлемі) процессор биттерінің санына байланысты емес. ARM процессорларының кез келген жерде 26 және 40 биттік мекенжайлары бар және оларды жүйенің қалған бөлігіне тәуелсіз өзгертуге болады.

  • Деректер шинасы өлшемі. ЖЖҚ немесе буферлік жадтан алынған деректердің көлемі де осы факторға тәуелді емес. Жеке процессор нұсқаулары деректердің әртүрлі көлемін сұрауы мүмкін, бірақ олар бөліктермен жіберіледі немесе жадтан қажетінен көбірек алынады. Бұл деректер квантының өлшеміне байланысты. iPhone 5 қазірдің өзінде жадтан деректерді 64 биттік кванттарда алады (және 32 биттік процессоры бар) және біз 192 битке дейінгі өлшемдерді кездестіре аламыз.
  • Жылжымалы нүктеге қатысты кез келген нәрсе. Мұндай регистрлердің өлшемі (FPU) процессордың ішкі жұмысына тағы да тәуелсіз. ARM 64-биттік FPU-ны ARM64-тен (64-биттік ARM процессоры) бұрыннан пайдаланып келеді.

Жалпы артықшылықтар мен кемшіліктер

Егер басқаша бірдей 32 биттік және 64 биттік архитектураларды салыстыратын болсақ, олар әдетте онша ерекшеленбейді. Бұл Apple компаниясының мобильді құрылғыларда да 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 ГБ-тан асатын жад бөліктерін оңай пайдалана алатынын қалаймыз.

Енді біз 4 ГБ-тан астам жады болмаса, 64 биттік архитектура пайдасыз деген жиі (шын мәнінде дұрыс емес) мәлімдемеге келдік. Үлкенірек мекенжай кеңістігі жады аз жүйеде де пайдалы. Жадпен салыстырылған файлдар - бұл файл мазмұнының бір бөлігі бүкіл файлды жадқа жүктемей-ақ процестің жадымен логикалық түрде байланыстырылатын ыңғайлы құрал. Осылайша, жүйе, мысалы, ЖЖҚ сыйымдылығынан бірнеше есе үлкен үлкен файлдарды біртіндеп өңдей алады. 32 биттік жүйеде мұндай үлкен файлдарды сенімді түрде жад картасына түсіру мүмкін емес, ал 64 биттік жүйеде бұл әлдеқайда үлкен мекенжай кеңістігінің арқасында торт бөлігі болып табылады.

Дегенмен, меңзерлердің үлкен өлшемі де бір үлкен кемшілік әкеледі: әйтпесе бірдей бағдарламалар 64 биттік процессорда көбірек жадты қажет етеді (бұл үлкенірек көрсеткіштер бір жерде сақталуы керек). Көрсеткіштер бағдарламалардың жиі бөлігі болғандықтан, бұл айырмашылық кэшті ауырлатуы мүмкін, бұл өз кезегінде бүкіл жүйенің баяу жұмыс істеуіне әкеледі. Сонымен, перспективада біз процессордың архитектурасын 64-битке өзгертсек, ол бүкіл жүйені баяулайтынын көреміз. Сондықтан бұл фактор басқа жерлерде көбірек оңтайландыру арқылы теңестірілуі керек.

ARM64

A7, жаңа iPhone 64s-ке қуат беретін 5 биттік процессор, кеңірек регистрлері бар қарапайым ARM процессоры ғана емес. ARM64 ескі, 32 биттік нұсқаға қарағанда негізгі жақсартуларды қамтиды.

Apple A7 процессоры.

Тіркеу

ARM64 32-биттік ARM-ге қарағанда екі есе көп бүтін регистрлерді сақтайды (регистрлердің саны мен енін шатастырмау үшін абай болыңыз - ені туралы біз «64-бит» бөлімінде айттық. Демек, ARM64-те екі есе кең регистрлер бар, әрі екі есе көп. регистрлер). 32-разрядты ARM-де 16 бүтін регистрлер бар: бір бағдарлама санауышы (ДК – ағымдағы нұсқаудың нөмірін қамтиды), стек көрсеткіші (орындалып жатқан функцияның көрсеткіші), сілтеме регистрі (соңғыдан кейінгі қайтару көрсеткіші). функцияның), ал қалған 13 қолданбаны пайдалануға арналған. Дегенмен, ARM64-те 32 бүтін регистр бар, оның ішінде бір нөлдік регистр, сілтеме регистрі, кадр көрсеткіші (стек көрсеткішіне ұқсас) және біреуі болашаққа сақталған. Бұл бізге қолданбаны пайдалану үшін 28 регистрді қалдырады, бұл 32-биттік ARM-тен екі есе көп. Сонымен қатар, ARM64 өзгермелі нүктелік нөмірлер (FPU) регистрлерінің санын 16-дан 32 128-биттік регистрлерге дейін екі есеге арттырды.

Бірақ тізілімдердің саны неге соншалықты маңызды? Жад әдетте CPU есептеулеріне қарағанда баяу және оқу/жазу өте ұзақ уақыт алуы мүмкін. Бұл жылдам процессорды жадты күтуге мәжбүр етеді және біз жүйенің табиғи жылдамдық шегіне жетеміз. Процессорлар бұл кемістікті буфер қабаттары арқылы жасыруға тырысады, бірақ тіпті ең жылдам (L1) процессордың есептеуінен баяуырақ. Дегенмен, регистрлер тікелей процессордағы жад ұяшықтары және олардың оқу/жазу процессорды баяулатпау үшін жеткілікті жылдам. Регистрлердің саны іс жүзінде процессорлық есептеулер үшін ең жылдам жад көлемін білдіреді, бұл бүкіл жүйенің жылдамдығына айтарлықтай әсер етеді.

Сонымен қатар, бұл жылдамдық компилятордан жақсы оңтайландыру қолдауын қажет етеді, осылайша тіл осы регистрлерді пайдалана алады және барлығын жалпы қолданбалы жадта (баяу) сақтаудың қажеті жоқ.

Нұсқаулар жинағы

ARM64 сонымен қатар нұсқаулар жинағына үлкен өзгерістер әкеледі. Нұсқаулар жинағы – процессор орындай алатын атомдық операциялардың жиынтығы (мысалы, 'ADD Registri1 register2' екі регистрдегі сандарды қосады). Жеке тілдер үшін қолжетімді функциялар осы нұсқаулардан тұрады. Күрделі функциялар көбірек нұсқауларды орындауы керек, сондықтан олар баяу болуы мүмкін.

ARM64-те жаңа AES шифрлау, SHA-1 және SHA-256 хэш функцияларына арналған нұсқаулар. Осылайша, күрделі іске асырудың орнына тек тіл бұл нұсқаулықты атайды - бұл мұндай функцияларды есептеудің үлкен жылдамдығына әкеледі және қолданбаларда қауіпсіздікті арттырады деп үміттенеміз. Мысалы, жаңа Touch ID осы нұсқауларды шифрлауда пайдаланады, бұл нақты жылдамдық пен қауіпсіздікті қамтамасыз етеді (теорияда шабуылдаушы деректерге қол жеткізу үшін процессордың өзін өзгертуі керек - оның миниатюралық өлшемін ескере отырып айту мүмкін емес).

32 битпен үйлесімділік

A7 эмуляцияны қажет етпестен 32 биттік режимде толығымен жұмыс істей алатынын атап өткен жөн. Бұл жаңа iPhone 5s 32-биттік ARM жүйесінде құрастырылған қолданбаларды ешқандай баяулаусыз іске қоса алатынын білдіреді. Дегенмен, ол жаңа ARM64 функцияларын пайдалана алмайды, сондықтан тек A7 үшін арнайы құрастыруды жасаған жөн, ол әлдеқайда жылдамырақ жұмыс істейді.

Орындалу уақыты өзгереді

Орындау уақыты - бағдарлама жұмыс істеп тұрған кезде аударма аяқталғанға дейін пайдалануға болатын бағдарламалау тіліне функцияларды қосатын код. Apple қолданбасының үйлесімділігін сақтауды қажет етпейтіндіктен (64 биттік екілік 32 битте жұмыс істейді), олар Objective-C тілін тағы бірнеше жақсартулар жасай алады.

Олардың бірі деп аталатындар белгіленген көрсеткіш (белгіленген көрсеткіш). Әдетте, объектілер мен сол объектілерге арналған көрсеткіштер жадтың бөлек бөліктерінде сақталады. Дегенмен, жаңа көрсеткіш түрлері аз деректері бар сыныптарға нысандарды тікелей көрсеткіште сақтауға мүмкіндік береді. Бұл қадам жадты объект үшін тікелей бөлу қажеттілігін жояды, жай ғана көрсеткіш пен оның ішіндегі нысанды жасаңыз. Белгіленген көрсеткіштерге тек 64 биттік архитектурада қолдау көрсетіледі, сонымен қатар жеткілікті пайдалы деректерді сақтау үшін 32 биттік көрсеткіште орын жеткіліксіз болғандықтан. Сондықтан iOS, OS X-тен айырмашылығы, бұл мүмкіндікті әлі қолдамады. Дегенмен, ARM64-тің келуімен бұл өзгеруде және iOS бұл жағынан да OS X-ті қуып жетті.

Көрсеткіштердің ұзындығы 64 бит болса да, ARM64-те көрсеткіштің жеке мекенжайы үшін тек 33 бит пайдаланылады. Ал егер біз қалған көрсеткіш биттерін сенімді түрде жасыра алсақ, біз бұл кеңістікті қосымша деректерді сақтау үшін пайдалана аламыз – аталған тегтелген көрсеткіштер жағдайындағыдай. Тұжырымдама бойынша, бұл Objective-C тарихындағы ең үлкен өзгерістердің бірі, бірақ ол нарықтық мүмкіндік емес - сондықтан пайдаланушылардың көпшілігі Apple компаниясының Objective-C-ті қалай алға жылжытатынын білмейді.

Мұндай тегтелген көрсеткіштің қалған кеңістігінде сақтауға болатын пайдалы деректерге келетін болсақ, Objective-C, мысалы, қазір оны деп аталатын деректерді сақтау үшін пайдаланады. сілтеме саны (анықтамалар саны). Бұрын анықтамалық санау жадтың басқа орнында, оған дайындалған хэш кестесінде сақталған, бірақ бұл alloc/dealloc/retain/release қоңырауларының көп саны болған жағдайда бүкіл жүйені баяулатуы мүмкін. Жіп қауіпсіздігіне байланысты кестені құлыптау керек болды, сондықтан екі ағындағы екі нысанның анықтамалық санын бір уақытта өзгерту мүмкін болмады. Дегенмен, бұл мән қалған деп аталатындарға жаңадан енгізілген Бұл көрсеткіштер. Бұл тағы бір көзге түспейтін, бірақ болашақта үлкен артықшылық пен жеделдету. Дегенмен, 32-биттік архитектурада бұған ешқашан қол жеткізу мүмкін емес.

Байланысты объектілер туралы ақпарат, объектінің әлсіз сілтемесі бар ма, объект үшін деструкторды генерациялау қажет пе және т.б., объектілерге көрсеткіштердің қалған орнына жаңадан енгізіледі.Осы ақпараттың арқасында Objective-C орындау уақыты әр қосымшаның жылдамдығынан көрінетін орындау уақытын түбегейлі жылдамдата алады. Тестілеуден бұл жадты басқарудың барлық қоңырауларының шамамен 40-50% жылдамдығын білдіреді. Тек 64 биттік көрсеткіштерге ауысу және осы жаңа кеңістікті пайдалану арқылы.

Қорытынды

Бәсекелестер 64-биттік архитектураға көшудің қажеті жоқ деген идеяны таратуға тырысса да, бұл жай ғана ақпаратсыз пікір екенін білесіз. Тілді немесе қолданбаларды оған бейімдемей, жай ғана 64 битке ауысу ештеңені білдірмейтіні рас - бұл тіпті бүкіл жүйені баяулатады. Бірақ жаңа A7 жаңа нұсқаулар жинағы бар заманауи ARM64 пайдаланады және Apple бүкіл Objective-C тілін модернизациялау және жаңа мүмкіндіктердің артықшылығын пайдалану мәселесін шешті - демек, уәде етілген жылдамдық.

Мұнда біз 64-биттік архитектураның алға қарай дұрыс қадам жасауының көптеген себептерін атап өттік. Бұл «қақпақтың астындағы» кезекті революция, соның арқасында Apple дизайнымен, пайдаланушы интерфейсімен және бай экожүйесімен ғана емес, негізінен нарықтағы ең заманауи технологиялармен де алдыңғы қатарда қалуға тырысады.

Дерек көзі: mikeash.com
.