Затвори ја рекламата

Мајк Еш посветен на неговиот блог практичните импликации на префрлувањето на 64-битна архитектура во iPhone 5S. Оваа статија се потпира на неговите наоди.

Причината за овој текст главно се должи на големиот број дезинформации што се шират за тоа што всушност значи за корисниците и пазарот новиот iPhone 5s со 64-битен ARM процесор. Овде ќе се обидеме да донесеме објективни информации за перформансите, можностите и импликациите на оваа транзиција за програмерите.

"64 битна"

Постојат два дела на процесорот на кои може да се однесува ознаката „X-bit“ - ширината на целобројните регистри и ширината на покажувачите. За среќа, кај повеќето модерни процесори овие широчини се исти, така што во случајот со А7 тоа значи 64-битни целобројни регистри и 64-битни покажувачи.

Сепак, подеднакво е важно да се истакне што НЕ значи „64bit“: Големина на физичка адреса на RAM меморијата. Бројот на битови за комуникација со RAM меморијата (со тоа и количината на RAM меморија што уредот може да ја поддржи) не е поврзан со бројот на битови на процесорот. ARM процесорите имаат некаде помеѓу 26 и 40-битни адреси и може да се менуваат независно од остатокот од системот.

  • Големина на магистралата за податоци. Количината на податоци добиени од RAM меморијата или баферската меморија е слично независна од овој фактор. Индивидуалните инструкции на процесорот може да бараат различни количини на податоци, но тие или се испраќаат на парчиња или се добиваат повеќе отколку што е потребно од меморијата. Тоа зависи од големината на податочниот квант. 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 бит не влијае на вкупната количина на RAM меморија што може да ја користи процесорот, може да ја олесни работата со големи делови од RAM меморија во една програма. Секоја програма која работи на 32-битен процесор има само околу 4 GB адресен простор. Имајќи предвид дека оперативниот систем и стандардните библиотеки зафаќаат нешто, ова ја остава програмата со некаде помеѓу 1-3 GB за употреба во апликации. Меѓутоа, ако 32-битен систем има повеќе од 4 GB RAM, користењето на таа меморија е малку покомплицирано. Мора да прибегнеме кон принудување на оперативниот систем да ги мапира овие поголеми делови од меморијата за нашата програма (виртуелизација на меморијата), или можеме да ја поделиме програмата на повеќе процеси (каде што секој процес повторно теоретски има 4 GB меморија достапна за директно адресирање).

Сепак, овие „хакови“ се толку тешки и бавни што минимум апликации ги користат. Во пракса, на 32-битен процесор, секоја програма ќе ги користи само своите 1-3 GB меморија, а повеќе достапна RAM меморија може да се користи за да се извршуваат повеќе програми истовремено или да се користи оваа меморија како бафер (кеширање). Овие употреби се практични, но ние би сакале која било програма да може лесно да користи делови од меморијата поголеми од 4 GB.

Сега доаѓаме до честото (всушност неточно) тврдење дека без повеќе од 4 GB меморија, 64-битна архитектура е бескорисна. Поголемиот адресен простор е корисен дури и на систем со помала меморија. Датотеките мапирани со меморија се практична алатка каде дел од содржината на датотеката е логично поврзан со меморијата на процесот без да мора целата датотека да се вчита во меморијата. Така, системот може, на пример, постепено да обработува големи датотеки многу пати поголеми од капацитетот на RAM меморијата. На 32-битен систем, таквите големи датотеки не можат со сигурност да се мапираат со меморија, додека на 64-битен систем, тоа е само парче торта, благодарение на многу поголемиот адресен простор.

Меѓутоа, поголемата големина на покажувачите носи и еден голем недостаток: инаку на идентичните програми им треба повеќе меморија на 64-битен процесор (овие поголеми покажувачи мора да се складираат некаде). Бидејќи покажувачите се чест дел од програмите, оваа разлика може да го оптоварува кешот, што пак предизвикува целиот систем да работи побавно. Така, во перспектива, можеме да видиме дека ако само ја смениме архитектурата на процесорот на 64-битна, тоа всушност ќе го забави целиот систем. Значи, овој фактор треба да се избалансира со повеќе оптимизации на други места.

ARM64

А7, 64-битниот процесор кој го напојува новиот iPhone 5s, не е само обичен ARM процесор со пошироки регистри. ARM64 содржи големи подобрувања во однос на постарата, 32-битна верзија.

Apple A7 процесор.

Регистар

ARM64 има двојно повеќе целобројни регистри од 32-битните ARM (внимавајте да не ги помешате бројот и ширината на регистрите - зборувавме за ширината во делот „64-bit“. Значи, ARM64 има и двојно пошироки регистри и двојно повеќе регистри). 32-битниот ARM има 16 целобројни регистри: еден програмски бројач (компјутер - го содржи бројот на тековната инструкција), покажувач на стек (покажувач на функција во тек), регистар за врски (покажувач за враќање по завршувањето од функцијата), а преостанатите 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 битни

Важно е да се спомене дека А7 може целосно да работи во 32-битен режим без потреба од емулација. Тоа значи дека новиот iPhone 5s може да работи со апликации составени на 32-битна ARM без никакво забавување. Меѓутоа, тогаш не може да ги користи новите функции на ARM64, па секогаш е вредно да се направи специјална конструкција само за А7, која би требало да работи многу побрзо.

Времето на траење се менува

Runtime е кодот кој додава функции на програмскиот јазик, кои може да ги користи додека апликацијата работи, сè до преводот. Бидејќи 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 траењето е во состојба суштински да го забрза траењето, што се рефлектира во брзината на секоја апликација. Од тестирање, ова значи околу 40-50% забрзување на сите повици за управување со меморијата. Само со префрлување на 64-битни покажувачи и користење на овој нов простор.

Заклучок

Иако конкурентите ќе се обидат да ја шират идејата дека преместувањето во 64-битна архитектура е непотребно, веќе ќе знаете дека ова е само многу неинформирано мислење. Вистина е дека едноставното префрлување на 64 битни без приспособување на јазикот или апликациите на него не значи ништо - дури и го успорува целиот систем. Но, новиот A7 користи модерен ARM64 со нов сет на инструкции, а Apple се потруди да го модернизира целиот јазик Objective-C и да ги искористи новите можности - оттука и ветеното забрзување.

Овде споменавме голем број причини зошто 64-битната архитектура е вистинскиот чекор напред. Тоа е уште една револуција „под хаубата“, благодарение на која Apple ќе се обиде да остане во првите редови не само со дизајнот, корисничкиот интерфејс и богатиот екосистем, туку главно со најсовремените технологии на пазарот.

Извор: mikeash.com
.