Закрыть объявление

Майк Эш посвященный в его блоге практические последствия перехода на 64-битную архитектуру в iPhone 5S. Эта статья основана на его выводах.

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

«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, 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 также вносит серьезные изменения в набор команд. Набор команд — это набор атомарных операций, которые может выполнять процессор (например, «ДОБАВИТЬ регистр1 регистр2» складывает числа в двух регистрах). Функции, доступные для отдельных языков, состоят из этих инструкций. Более сложные функции должны выполнять больше инструкций, поэтому они могут работать медленнее.

Новым в 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 runtime способен существенно ускорить время выполнения, что отражается на скорости каждого приложения. По результатам тестирования это означает ускорение всех вызовов управления памятью примерно на 40-50%. Просто переключившись на 64-битные указатели и используя это новое пространство.

Вывод

Хотя конкуренты и попытаются распространить мысль о необходимости перехода на 64-битную архитектуру, вы уже будете знать, что это всего лишь весьма неосведомленное мнение. Действительно, простой переход на 64бит без адаптации под него языка или приложений на самом деле ничего не значит — он даже тормозит всю систему. Но в новом A7 используется современный ARM64 с новым набором инструкций, а Apple потрудилась модернизировать весь язык Objective-C и воспользоваться новыми возможностями — отсюда и обещанное ускорение.

Здесь мы упомянули большое количество причин, по которым 64-битная архитектура является правильным шагом вперед. Это очередная революция «под капотом», благодаря которой Apple постарается оставаться в авангарде не только с дизайном, пользовательским интерфейсом и богатой экосистемой, но, главным образом, с самыми современными технологиями на рынке.

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