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

Майк Аш посветен в своя блог практическите последици от преминаването към 64-битова архитектура в iPhone 5S. Тази статия се основава на неговите открития.

Причината за този текст се дължи основно на голямото количество дезинформация, която се разпространява за това какво всъщност означава новият iPhone 5s с 64-битов ARM процесор за потребителите и пазара. Тук ще се опитаме да предоставим обективна информация за производителността, възможностите и последиците от този преход за разработчиците.

"64 бита"

Има две части на процесора, за които етикетът "X-bit" може да се отнася - ширината на целочислените регистри и ширината на указателите. За щастие при повечето съвременни процесори тези ширини са еднакви, така че в случая на A7 това означава 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.

Сега стигаме до честото (всъщност неправилно) твърдение, че без повече от 4GB памет 64-битовата архитектура е безполезна. По-голямото адресно пространство е полезно дори в система с по-малко памет. Файловете с карта на паметта са удобен инструмент, при който част от съдържанието на файла е логически свързано с паметта на процеса, без целият файл да се зарежда в паметта. Така системата може например постепенно да обработва големи файлове, многократно по-големи от капацитета на RAM паметта. В 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 бита

Важно е да споменем, че 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, например, сега ги използва за съхраняване на т.нар. референтен брой (брой препратки). Преди това броят на препратките се съхраняваше на различно място в паметта, в подготвена за него хеш таблица, но това можеше да забави цялата система в случай на голям брой извиквания за разпределяне/деаллок/запазване/освобождаване. Таблицата трябваше да бъде заключена поради безопасността на нишката, така че броят на препратките на два обекта в две нишки не можеше да бъде променен едновременно. Тази стойност обаче е ново вмъкната в останалата част от т.нар Иса показатели. Това е още едно незабележимо, но огромно предимство и ускорение в бъдещето. Това обаче никога не може да бъде постигнато в 32-битова архитектура.

Информацията за свързаните обекти, дали обектът е слабо рефериран, дали е необходимо да се генерира деструктор за обекта и т.н., също се вмъква наново в оставащото място на указатели към обектите.Благодарение на тази информация, Objective-C runtime е в състояние фундаментално да ускори времето за изпълнение, което се отразява в скоростта на всяко приложение. От тестването това означава около 40-50% ускоряване на всички повиквания за управление на паметта. Просто като преминете към 64-битови указатели и използвате това ново пространство.

záver

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

Тук споменахме голям брой причини, поради които 64-битовата архитектура е правилната стъпка напред. Това е поредната революция "под капака", благодарение на която Apple ще се опита да остане в челните редици не само с дизайн, потребителски интерфейс и богата екосистема, но най-вече с най-модерните технологии на пазара.

Източник: mikeash.com
.