arm x64 что такое
Война за чипы: сменят ли ARM процессоры x86 и почему все зависит от Apple
Содержание
Какими бывают процессоры: x86 и ARM
В мобильных устройствах (планшеты, смартфоны) и классических компьютерах (ноутбуки, настольные ПК, серверы) используются разные процессоры. Они по-разному взаимодействуют с операционными системами и программами — взаимной совместимости нет. Именно поэтому вы не сможете запустить привычные Word или Photoshop на своем iPhone или Android-смартфоне. Вам придется скачивать из AppStore или Google Play специальную версию софта для мобильных устройств. И она будет сильно отличаться от версии для настольного ПК: как визуально, так и по функциональности, не говоря уже о программном коде, который пользователь обычно не видит.
Процессоры для классических компьютеров строятся на архитектуре x86. Своим названием она обязана ранним чипам компании Intel c модельными индексами 8086, 80186 и так далее. Первым таким решением с полноценной реализацией x86 стал Intel 80386, выпущенный в 1985 году. Сегодня подавляющее большинство процессоров в мире с архитектурой x86 делают Intel и AMD. При этом у AMD, в отличие от Intel, нет собственного производства: с 2018 года им по заказу компании занимается тайваньская корпорация TSMC.
Когда Acer, Asus, Dell, HP, Lenovo и любые другие производители классических компьютеров используют процессоры Intel или AMD, то им приходится работать с тем, что есть. Они вынуждены закупать готовые решения без возможности гибко доработать чипы под свой конкретный продукт. А свои собственные процессоры на архитектуре x86 никто из производителей ПК делать не может. Дело не только в том, что это крайне сложно и дорого, но и в том, что лицензия на архитектуру принадлежит Intel, и компания не планирует ее ни с кем делить. AMD же воевала в американских судах за право создавать чипы на архитектуре x86 со своим главным конкурентом более десяти лет в 1980-х и 1990-х годах.
Процессоры для мобильных устройств строятся на базе архитектуры ARM. И это не какая-то быстро и внезапно взлетевшая вверх молодая компания. Корни истории современной британской ARM Limited уходят далеко в 1980-е. Только в отличие от своих доминирующих на рынке «больших» ПК-конкурентов ARM Limited процессоры не делает. Бизнес компании построен на том, что она продает лицензии на производство чипов по своей технологии всем желающим. Причем возможности для доработки у лицензиатов максимально широкие — отсюда популярность и многообразие решений. Именно на основе архитектуры ARM Huawei делает свои мобильные чипы Kirin, у Samsung это Exynos, у Apple — серия Ax. В этот же список входят Qualcomm, MediaTek, NVIDIA и другие компании. А еще свои процессоры на ARM делает Fujitsu. Японцы назвали их A64X, и именно они в количестве 158 976 штук используются в самом мощном на момент выхода этой статьи суперкомпьютере в мире — Fujitsu Fugaku.
Из открытого подхода ARM вытекает и главный недостаток: архитектура очень фрагментирована. Для x86 достаточно написать программу один раз, и она будет одинаково стабильно работать на всех устройствах. Для ARM приходится адаптировать софт под процессоры каждого производителя, что замедляет и удорожает разработку. Ну, а главный недостаток x86 вытекает из отсутствия конкуренции. В последние годы Intel, например, много упрекали за медленный или порой вовсе едва ощутимый прирост производительности от поколения к поколению. Также есть проблемы с высокими уровнями нагрева и энергопотребления.
Архитектура процессоров: CISC, RISC, и в чем разница
Ключевое отличие между x86 и ARM кроется в разной архитектуре набора инструкций. По-английски — ISA, Instruction Set Architecture. В основе x86 изначально лежала технология CISC. Это расшифровывается как Complex Instruction Set Command — вычислительная машина со сложным набором инструкций. «Сложность» здесь в том, что в одну инструкцию для процессора может быть заложено сразу несколько действий.
Полвека назад, когда первые процессоры только появились, программисты писали код вручную (сейчас для этого есть компиляторы). Одну сложную команду на старом низкоуровневом языке программирования Assembler написать было гораздо проще, чем множество простых, досконально разъясняющих весь процесс. А еще сложная команда занимала меньше места, потому что код для нее был короче, чем несколько отдельных простых команд. Это было важно, потому что объем памяти в те времена был крайне ограничен, стоила она дорого и работала медленно. Заказчики от этого тоже выигрывали — под любой их запрос можно было придумать специальную команду.
Но вот архитектура самого процессора страдала. По мере развития микроэлектроники в чипах с CISC копились команды, которые использовались редко, но все еще были нужны для совместимости со старыми программами. При этом под них резервировалось пространство на кристалле (место, где расположены физические блоки процессора). Это привело к появлению альтернативной технологии RISC, что расшифровывается как Reduced Instruction Set Command — вычислительная машина с сокращенным набором инструкций. Именно она легла в основу процессоров ARM и дала им название: Advanced RISC Machines.
Здесь ставку сделали на простые и наиболее востребованные команды. Да, код поначалу писать было сложнее, поскольку он занимал больше места, но с появлением компиляторов это перестало быть значимым недостатком. Результат — экономия места на кристалле и, как следствие, сокращение нагрева и потребления энергии. Плюс множество других преимуществ.
Почему о превосходстве ARM заговорили только недавно и при чем здесь Apple?
Если архитектура ARM так хороша, то почему же Intel и AMD не бросили все и не стали строить свои чипы на ней? На самом деле, они не оставили технологию без внимания, и к сегодняшнему дню CISC в чистом виде фактически уже не существует. Еще в середине 1990-х годов процессоры обеих компаний (начиная с Pentium Pro у Intel и K5 у AMD) обзавелись блоком преобразования инструкций. Сложные команды разбиваются на простые и затем выполняются именно там. Так что современные процессоры на архитектуре x86 в плане набора инструкций гораздо ближе к RISC, чем к CISC.
Кроме того, важно понимать, что противостояние x86 и ARM — это прежде всего противостояние Intel (потому что AMD гораздо меньше во всех отношениях: от капитализации до доли на рынках) и множества разрозненных производителей чипов для мобильных устройств. Долгое время два направления развивались как бы отдельно друг от друга. У Intel не получалось сделать достаточно мощное и энергоэффективное решение на x86 для мобильных устройств, а производители ARM-процессоров не стремились на рынок «больших» ПК. В нише мобильных устройств хватало места всем, и конкурировать там было проще, чем на фактически монополизированном Intel рынке процессоров для традиционных компьютеров.
Однако в последние годы доминирующее положение Intel пошатнулось. Прежде всего из-за того, что бизнес компании перестал соответствовать ее же собственной производственной стратегии. Согласно прогнозу одного из основателей Intel Гордона Мура, количество транзисторов в процессорах должно удваиваться каждые два года за счет перехода на более компактный технологический процесс производства (измеряется в нанометрах — нм). Как раз за счет этого повышается производительность. Впоследствии впервые озвученный в середине 1960-х годов «Закон Мура» корректировался, но сегодня стало ясно, что бесконечным этот рост быть не может. Технологии Intel дошли до «потолка возможностей» и пока уперлись в него. Переход на 14 нм, а потом и на 10 нм сильно затянулся, в то время как AMD в партнерстве с TSMC уже работает по техпроцессу 7 нм, а первым 5-нанометровым процессором в мире стал Apple M1 на архитектуре ARM.
Решая множество технологических проблем с процессорами для «больших» компьютеров, Intel полностью упустила из вида рынок мобильных чипов, и теперь здесь господствуют решения ARM. Проблемы, кстати, при этом никуда не делись — чипы Intel для настольных ПК последних лет активно и справедливо критикуют. Мощные процессоры компании страдают от высокого нагрева и сильного энергопотребления, а энергоэффективные, наоборот, сильно ограничены в плане производительности.
Большинство производителей ноутбуков и компьютеров продолжают с этим мириться, и не уходят на ARM — не позволяет огромный багаж популярного софта и массовость их техники. Как вы помните, одна и та же программа не сможет работать и на x86 и, на ARM — ее нужно обязательно программировать заново. Но в 2020 году после почти 15 лет выпуска компьютеров с процессорами Intel компания Apple объявила о переходе на процессоры ARM собственной разработки. Они, кстати, тоже производятся внешним подрядчиком: на заводах уже упомянутой TSMC.
И это крайне важное заявление, потому что на рынке только у Apple есть все возможности для того, чтобы сделать этот переход успешным. Во-первых, компания сама разрабатывает процессоры на базе ARM много лет. Настольные M1 «выросли»
из мобильных чипов серии Ax. У производителей ПК на других ОС такого опыта нет или он сильно ограничен. Во-вторых, у Apple огромный опыт разработки собственных операционных систем: как мобильной, так и настольной. Конкуренты в основном используют Windows или «надстройки» для Android.
Остается совместить две системы (OS X для компьютеров, iOS для смартфонов), «заточенные» под разную архитектуру вместе, унифицировав софт, и это самый сложный пункт программы. Но и тут у Apple есть целая россыпь козырей. Это и лояльная аудитория, не готовая смотреть на продукцию конкурентов, но готовая подождать пока программы адаптируют под ARM. И собственный язык программирования Swift, который давно унифицировал процесс разработки ПО для iOS и OS X. И пусть небольшая в количестве устройств, но зато очень заметная доля на рынке ПК в деньгах, чтобы процесс адаптации «настольного» софта для x86 под работу с «мобильным» ARM стал интересен крупным разработчикам ПО. За примерами далеко ходить не надо: в Adobe на зов откликнулись одними из первых.
Немаловажно и то, что переход с Intel на ARM для Apple — далеко не первый опыт смены процессоров в своих устройствах. На Intel корпорация из Купертино переходила с PowerPC в 2005 году. А чипы PowerPC пришли на замену Motorola 68K в начале 1990-х.
Процессор Apple M1: чем он так хорош?
Apple M1 интересен не столько тем, что построен на базе технологий ARM, сколько своей архитектурой. Здесь на одной подложке собраны сам процессор, в котором по 4 производительных и энергоэффективных ядра, восьмиядерная графическая подсистема, нейромодуль для машинного обучения, огромные (по меркам процессоров) объемы кэш-памяти плюс тут же распаяна оперативная память. Такое решение занимает совсем мало места в корпусе компьютера, потребляет мало энергии (аккумулятор ноутбука дольше не разрядится) и может работать без активного охлаждения (ноутбук будет тихим или вовсе бесшумным) при хорошем уровне производительности.
И совсем не просто так первым компьютером Apple с процессором M1 стал MacBook Air. С одной стороны, это лэптоп, главными преимуществами которого как раз и должно быть все, что дает новый процессор: компактность, автономность, тишина. С другой стороны, это компьютер для наименее требовательных пользователей, которым практически не нужен никакой специфический софт — достаточно того, что сама Apple предлагает «из коробки»: браузера, проигрывателя, офисного пакета. А для софта, который под ARM адаптировать пока не успели, Apple использует встроенный эмулятор Rosetta 2.
Следующими ПК Apple с M1 после MacBook Air стали 13-дюймовый MacBook Pro и Mac Mini. Также недавно был анонсирован новый iMac. Такие машины уже ориентированы на задачи посерьезнее, но все равно это еще далеко не профессиональный сегмент — на него в Купертино пока лишь намекают. И именно здесь к решению Apple на базе технологий ARM возникает основной вопрос: получится ли «отмасштабировать» M1 до уровня профессиональных решений, где компактность и энергоэффективность не так важны, а на первый план выходит именно производительность? Как реализовать связку М1 с мощными дискретными видеокартами, без которых о монтаже, рендеринге и других сложных вычислениях говорить не приходится? Или может быть Apple вообще готовится к выпуску собственной дискретной графики? Вопросов пока куда больше, чем ответов на них.
Уже готовые компактные устройства Apple с чипами M1 выглядят действительно интересно, правда выигрыш в производительности в них явно ощущается в основном только в уже адаптированных под ARM программах, но зато он очень заметный. Так что если Intel и AMD не смогут дать достойный ответ конкуренту в нише энергоэффективных ПК, то рост популярности решений Apple не заставит себя ждать даже несмотря на то, что еще какое-то время софта будет не хватать. Массовому пользователю ведь много не нужно.
ARM64 и Ты
Несколько запоздалый перевод заинтересовавшего меня блогпоста о том, что в действительности дает 64-битность процессора в iPhone без маркетинговой шелухи. Если текст покажется вам слишком очевидным, пропустите часть «Базовые преимущества и недостатки».
Как только был анонсирован iPhone 5S, технические медия были переполнены недостоверными статьями. К сожалению, написание хороших статей занимает время, а мир технической журналистики больше ценит скорость, чем достоверность. Сегодня, по просьбе нескольких своих читателей, я кратко изложу, что дает 64-bit ARM в iPhone 5S в плане производительности, возможностей и разработки.
64 бита
Давайте для начала рассмотрим что, собственно, 64-битность означает. С этим термином связанно много путаницы, в основном из-за того, что нет единого устоявшегося определения. Однако, существует общее понимание этого термина. «Битность» обычно означает либо размер числового регистра, или размер указателя. К счастью, для большинства современных процессоров, их размер совпадает. Таким образом, 64-битность означает что процессор обладает 64-битными числовыми регистрами и 64-битными указателями.
Базовые преимущества и недостатки
Если вы будете сравнивать идентичные процессоры 32 и 64 битные CPU, вы не найдете больших различий, так что значительность перехода Apple на 64-битные ARM несколько преувеличена. Это важный шаг, но важный, в основном, из-за особенностей ARM и особенностью использования процессора компанией Apple. Тем не менее, некоторые различия имеются. Самым очевидным является 64-битные числовые регистры более эффективно работают с 64-битными числами. Вы можете работать с 64-битными числами и на 32-битном процессоре, но это обычно приводит к работе с двумя 32-битными частями, что работает ощутимо медленнее. 64-битные процессоры, обычно, выполняют операции над 64-битными числами также быстро как и над 32-битными, так что код активно использующий вычисления с 64-битными числами будет работать значительно быстрее.
Не смотря на то, что 64-битность не связана напрямую с объемом адресуемой памяти, она значительно облегчает использование большого объема RAM в рамках одной программы. Программа, запущенная на 32-битном процессоре может адресовать не больше 4GB адресного пространства. Часть памяти выделена под операционную систему и стандартные библиотеки, что оставляет 1-3GB на саму программу. Если у 32-битной системы больше 4GB RAM, то использование всего этого адресного пространства для программы значительно усложняется. Вам придется заняться махинациями вроде последовательного отображение разных частей RAM на часть виртуального адресного пространства или разбивание одной программы на несколько процессов.
Подобные трюки крайне трудозатраны и могут сильно замедлить систему, так что мало кто из программистов реально их использует. На практике, на 32-битных процессорах каждая программа используют до 1-3GB RAM, а вся ценность в обладании большего объема физической оперативной памяти заключается в возможности больше запускать программ одновременно и возможность кеширования больше данных с диска.
Увеличение объема адресного пространства полезно и для систем с небольшим объемом оперативной памяти — memory-mapped файлы, размеры которых могут быть и больше доступной оперативной памяти, т.к. операционная система реально загружает только те части файла, к которым производились обращения и, кроме того, умеет «вытеснять» загруженные данные обратно в файл, освобождая оперативную память. На 32-битных системах нельзя отобразить файлы размером больше 1-3GB. На 64-битных системах, адресное пространство значительно больше, так что такой проблемы нет.
Увеличение размера указателя может быть и ощутимым минусом: таже программа будет использовать больше памяти (возможно, сильно больше) будучи запущенной на 64 битном процессоре. Увеличение используемой памяти также «забивает» кэш, что снижает производительность.
В двух словах: 64-битность может увеличить производительность некоторых частей кода и упрощает некоторые техники, вроде memory-mapped файлов. Однако, производительность может и пострадать из-за увеличения используемой памяти.
ARM64
64-битный процессор в iPhone 5S не просто ARM с увеличенным размером регистров, есть и существенные изменения.
Во-первых, отмечу название: официального название от ARM — «AArch64», однако это — глупое название, печатать которое меня раздражает. Apple называет архитектуру ARM64 и я буду называть также.
ARM64 увеличил вдвое число целочисленных регистров. 32-битный ARM предоставляет 16 целочисленных регистров, из которых один — счетчик команд (program counter), еще два используются для указателя на стэк и регистра связи (link register) и 13 регистров общего назначения. В ARM64 32 целочисленных регистра, с выделенным нулевым регистром, регистром связи и регистром указателя кадра (frame pointer register). Еще один регистр зарезервирован платформой, что оставляет 28 регистров общего назначения.
ARM64 также увеличивает число регистров для чисел с плавающей запятой. Регистры в 32-битных ARM несколько странные, так что сложно сравнивать. У 32-битного ARM 32 32-битных регистров с плавающей запятой, которые могут быть представлены как 16 перекрывающихся 64-битных регистров. Кроме того, есть еще 16 независимых 64-битных регистров. ARM64 упрощает это до 32 неперекрывающихся 128-битных регистров, которые могут быть использован для данных меньшего размера.
Число регистров может значительно влиять на производительность. Память значительно медленнее процессора, и чтение/запись памяти занимает значительно больше времени, чем выполнение инструкций процессора. Процессор пытается исправить это при помощи кэшей, но даже самый быстрый кэш значительно медленнее регистров процессора. Больше регистров — больше данных могут храниться внутри процессора. Насколько это влияет на производительность зависит от конкретного кода и эффективности компилятора, который оптимизирует использование регистров. Когда архитектура Intel перешла от 32 к 64 битам, число регистров увеличилось с 8 до 16, и это было значительное изменение производительности. У ARM уже было больше регистров чем у 32-битной архитектуры Intel, так что увеличение регистров хоть и меньше повлияет на производительность, но это изменение все еще будет заметно.
ARM64 также привнес существенные изменения помимо увеличения числа регистров.
Большинство 32-битных инструкций ARM могут выполняться/не выполняться в зависимости от состояние регистра-условия. Это позволяет транслировать условные выражения (if-statements) без использования ветвления. Предполагалось, что это увеличит производительность, однако, судя по тому, что в ARM64 от этой возможности отказались, она порождала больше проблем, чем давала пользы.
В ARM64 набор SIMD (одна-инструкция-много-данных) NEON полностью поддерживает стандарт IEEE754 для чисел с плавающей запятой с двойной точностью, в то время как 32-битная версия NEON поддерживала только одинарную точность и не в точности следовала стандарту для некоторых битов.
В ARM64 добавили специализированные инструкции для AES шифрования и SHA-1 & SHA-256 хешей. Не слишком полезное в общем, однако существенный бонус если вы занимаетесь именно этими вопросами.
В целом, самым важным отличаем является увеличение числа регистров общего назначения и полная поддержка IEEE754-совметимой арифметики на числах с двойной точностью в NEON. Это может дать ощутимый прирост в производительности в большом числе мест.
Совместимость с 32-битным приложениями
Важно отметить, что A7 включает в себя 32-битный режим совместимости, который позволяет запускать 32-битные приложения без каких либо изменений. Это означает, что iPhone 5S может исполнять любые старые приложения без какого-то влияния на производительность.
Изменения в системе периода исполнения
Apple использует преимущества новой архитектуры в своих библиотеках. Так как им нет надобности беспокоиться о бинарной обратной совместимости при таких изменениях, это отличное время чтобы внести изменения которые в противном случае «поломали» уже существующие приложения.
В Max OS X 10.7 Apple ввела меченные указатели (tagged pointers). Меченные указатели позволяют хранить некоторые классы с небольшим количеством данных в экземпляре напрямую в указателе. Это позволяет избежать выделений памяти в некоторых случаях, например NSNumber и может дать существенный прирост производительности. Меченные указатели поддерживаются только на 64-битной платформе, частично из-за вопроса производительности, а частично из-за того что в 32-битном указателе не так много остается места под «метки». Видимо по-этому, у iOS не было поддержки меченных указателей. Таким образом, в ARM64 в рантайме Objective-C включена поддержка меченных указателей, что дает те же преимущества, что в Mac.
Не смотря на то, что размер указателя составляет 64 бита, не все эти биты на самом деле используются. В Mac OS X на x86-64 используется только 47 битов. В iOS на ARM64 используется еще меньше — только 33 бита. Если маскировать эти биты каждый раз перед использованием то можно использовать остальные биты чтобы хранить дополнительные данные. Это позволило внести одно из самых значительных изменений в рантайм Objective-C за всю его историю.
Переосмысление указателя isa
Большая часть информации в этой секции почерпана из статьи Грега Паркера. Во первых, для освежения памяти: объекты в Objective-C представляют выделенные блоки памяти. Первый часть, размером с указатель, это isa. Обычно, isa это указатель на класс объекта. Чтобы узнать больше о том, как объекты хранятся в памяти, читайте мою другую статью.
Использовать весь размер указателя на указатель isa несколько расточительно, особенно на 64-битной платформе, которая не использует все 64-бита. ARM64 на iOS реально использует 33 бита, оставляя 31 бит для других вещей. Классы в памяти выровнены по границе 8 байт, так что последние 3 бита можно отбросить, что дает 34 бита из isa доступные для хранения дополнительной информации. И Apple-овский рантайм в ARM64 использует это для повышения производительности.
Наверно, самой важной оптимизацией стало встраивание (inline) счетчика ссылок. Практически все объекты в Objective-C обладают счетчиком ссылок (за исключение неизменяемых объектов, таких как литералы NSString) и операции retain/release, которые меняют этот счетчик случаются очень часто. Это особенно критично для ARC, который вставляет вызовы retain/release чаще, чем бы это делал программист. Таким образом, высокая производительность retain/release методов крайне важна.
Суммарно, это существенный выигрыш. Мои бенчмарки показали, что создание и удаление простого объекта занимает 380нс на 5S в 32-битном режиме, в то время как в 64-битном только 200нс. Если хоть один экземпляр когда-либо имел слабую ссылку на себя, то в 32-битном режим время удаления для всех увеличивалось до 480нс, в то время как в 64-битном режиме время осталось в районе 200нс для всех экземпляров, на которых слабых ссылок не было.
Короче говоря, улучшения в рантайме таковы, что в 64-битном режиме время аллокации занимают 40-50% от времени аллокации в 32-битном режиме. Если ваше приложение создает и удаляет много объектов, это может оказаться существенным.
Заключение
64-битность A7 не просто маркетинговая уловка, но это и не поражающий воображение прорыв который позволит создавать новый класс приложений. Истина, как всегда, лежит посередине.
Один только факт перехода на 64 бита дает немного. Это в некоторых случая ускоряет приложения, несколько увеличивает объем используемой памяти большинство программ. В общем, большой разницы нет.
Архитектура ARM изменилась не только в 64-битности. Увеличенное число регистров и пересмотренный, модернизированный набор инструкций дает неплохой прирост производительности по сравнению с 32-битным ARM.
Apple использовала переход на новую архитектуру для улучшения в рантайме. Основное изменение — встраиваемый (inlined) счетчик ссылок, который позволяет избежать дорогого поиска по хеш-таблице. Так операции retain/release очень часты в Objective-C, это существенный выигрыш. Удаление ресурсов в зависимости от флагов делает удаление объектов почти вдвое быстрее. Меченные (tagged) указатели также добавляют производительность и уменьшают потребление памяти.
ARM64 — приятное добавление от Apple. Мы все знали, что это рано или поздно случится, но мало кто ожидал что так скоро. Но оно есть, и это отлично.