Зачыніць аб'яву

Майк Эш прысвечаны ў сваім блогу практычныя наступствы пераходу на 64-бітную архітэктуру ў iPhone 5S. Гэты артыкул грунтуецца на яго высновах.

Прычына гэтага тэксту ў асноўным звязана з вялікай колькасцю дэзінфармацыі, якая распаўсюджваецца аб тым, што насамрэч азначае новы iPhone 5s з 64-разрадным працэсарам ARM для карыстальнікаў і рынку. Тут мы паспрабуем даць аб'ектыўную інфармацыю аб прадукцыйнасці, магчымасцях і наступствах гэтага пераходу для распрацоўшчыкаў.

"64 біт"

Ёсць дзве часткі працэсара, да якіх можа адносіцца пазнака "X-bit" - шырыня цэлых рэгістраў і шырыня паказальнікаў. На шчасце, у большасці сучасных працэсараў гэтыя шырыні аднолькавыя, так што ў выпадку з 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, 64-разрадны працэсар, на якім працуе новы iPhone 5s, - гэта не проста звычайны працэсар ARM з больш шырокімі рэгістрамі. ARM64 змяшчае сур'ёзныя паляпшэнні ў параўнанні са старой, 32-бітнай версіяй.

Працэсар Apple A7.

рэестр

ARM64 змяшчае ўдвая больш цэлых рэгістраў, чым 32-бітны ARM (будзьце асцярожныя, каб не пераблытаць колькасць і шырыню рэгістраў - мы гаварылі пра шырыню ў раздзеле "64-біт". Такім чынам, ARM64 мае ўдвая больш шырокія рэгістры і ўдвая больш рэестры). 32-разрадная ARM мае 16 цэлых рэгістраў: адзін праграмны лічыльнік (PC - змяшчае нумар бягучай інструкцыі), паказальнік стэка (паказальнік на выкананую функцыю), рэгістр спасылкі (паказальнік на вяртанне пасля заканчэння функцыі), а астатнія 13 прызначаны для выкарыстання праграмамі. Тым не менш, ARM64 мае 32 цэлыя рэгістры, у тым ліку адзін нулявы рэгістр, рэгістр спасылак, паказальнік фрэйма (падобны на паказальнік стэка) і адзін, зарэзерваваны на будучыню. Гэта пакідае нам 28 рэгістраў для выкарыстання прыкладанняў, што больш чым у два разы перавышае 32-бітны ARM. У той жа час ARM64 падвоіў колькасць рэгістраў лікаў з плаваючай кропкай (FPU) з 16 да 32 128-бітных рэгістраў.

Але чаму колькасць рэестраў такая важная? Памяць, як правіла, павольней, чым працэсар, і чытанне/запіс можа заняць вельмі шмат часу. Гэта прымусіла б хуткі працэсар працягваць чакаць памяці, і мы б дасягнулі натуральнага ліміту хуткасці сістэмы. Працэсары спрабуюць схаваць гэты недахоп з дапамогай слаёў буфераў, але нават самы хуткі (L1) па-ранейшаму павольней, чым разлікі працэсара. Аднак рэгістры - гэта вочкі памяці непасрэдна ў працэсары, і іх чытанне/запіс адбываецца досыць хутка, каб не запавольваць працэсар. Колькасць рэгістраў практычна азначае аб'ём самай хуткай памяці для вылічэнняў працэсара, што моцна ўплывае на хуткасць працы ўсёй сістэмы.

У той жа час гэтая хуткасць патрабуе добрай падтрымкі аптымізацыі з боку кампілятара, каб мова магла выкарыстоўваць гэтыя рэгістры і не захоўвала ўсё ў агульнай (павольнай) памяці прыкладанняў.

Набор інструкцый

ARM64 таксама ўносіць сур'ёзныя змены ў набор інструкцый. Набор інструкцый - гэта набор атамарных аперацый, якія можа выконваць працэсар (напрыклад, 'ADD register1 register2' дадае лікі ў двух рэгістрах). Функцыі, даступныя для асобных моў, складаюцца з гэтых інструкцый. Больш складаныя функцыі павінны выконваць больш інструкцый, таму яны могуць працаваць павольней.

Новым у ARM64 з'яўляюцца інструкцыі для шыфравання AES, хэш-функцый SHA-1 і SHA-256. Такім чынам, замест складанай рэалізацыі, толькі мова будзе выклікаць гэтую інструкцыю - што значна паскорыць вылічэнні такіх функцый і, спадзяюся, дадасць бяспеку ў праграмах. напрыклад новы Touch ID таксама выкарыстоўвае гэтыя інструкцыі ў шыфраванні, забяспечваючы рэальную хуткасць і бяспеку (тэарэтычна зламыснік павінен будзе змяніць сам працэсар, каб атрымаць доступ да дадзеных - гэта, мякка кажучы, непрактычна, улічваючы яго мініятурны памер).

Сумяшчальнасць з 32 bit

Важна адзначыць, што 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. Табліцу трэба было заблакіраваць з-за бяспекі патокаў, таму колькасць спасылак двух аб'ектаў у двух патоках не магла быць зменена адначасова. Аднак гэта значэнне па-новаму ўстаўляецца ў астатнюю частку т.зв ISA паказчыкі. Гэта яшчэ адна непрыкметная, але велізарная перавага і паскарэнне ў будучыні. Аднак гэта ніколі не магло быць дасягнута ў 32-бітнай архітэктуры.

Інфармацыя пра звязаныя аб'екты, ці ёсць на аб'ект слабыя спасылкі, ці неабходна згенераваць дэструктар для аб'екта і г. д., таксама зноў устаўляецца ў астатняе месца паказальнікаў на аб'екты.Дзякуючы гэтай інфармацыі, Objective-C runtime можа істотна паскорыць час выканання, што адлюстроўваецца на хуткасці кожнага прыкладання. Па выніках тэставання гэта азначае каля 40-50% паскарэння ўсіх выклікаў кіравання памяццю. Проста перайшоўшы на 64-бітныя паказальнікі і выкарыстоўваючы гэтую новую прастору.

záver

Хаця канкурэнты паспрабуюць распаўсюдзіць ідэю аб непатрэбнасці пераходу на 64-бітную архітэктуру, вы ўжо ведаеце, што гэта проста недасведчанае меркаванне. Гэта праўда, што пераход на 64-біт без адаптацыі вашай мовы або прыкладанняў насамрэч нічога не значыць - ён нават запавольвае ўсю сістэму. Але новы A7 выкарыстоўвае сучасны ARM64 з новым наборам інструкцый, і Apple паклапацілася аб тым, каб мадэрнізаваць усю мову Objective-C і скарыстацца новымі магчымасцямі - адсюль і абяцанае паскарэнне.

Тут мы згадалі вялікую колькасць прычын, чаму 64-разрадная архітэктура з'яўляецца правільным крокам наперад. Гэта чарговая рэвалюцыя «пад капотам», дзякуючы якой Apple паспрабуе заставацца ў авангардзе не толькі з дапамогай дызайну, карыстацкага інтэрфейсу і багатай экасістэмы, але галоўным чынам з дапамогай самых сучасных тэхналогій на рынку.

крыніца: mikeash.com
.