[Перевод] Заглянем внутрь GPU-чипа от Apple собственной разработки, используемого в iPhone
Для самых первых моделей продуктов Apple, iPhone и iPad, компания лицензировала и использовала для вывода графики чип PowerVR GPU от Imagination Technologies. Apple даже приобрела около 10% компании Imagination и является её крупнейшим клиентом, принося около 30% дохода. И так же, как Apple начинала с использования по лицензии ARM CPU, а теперь пользуется собственными разработками, она, судя по всему, перешла от использования PowerVR к разработке собственного GPU. Впервые он появился в процессоре A8, использующемся в iPhone 6, а его потомки находятся в A9 и A10 Fusion, используемых в iPhone 6S и 7.
Современный GPU, такой, какие находятся внутри iPhone и iPad, обладают тремя основными компонентами, от которых требуется слаженная работа для демонстрации картинки. Первый — железо, обеспечивающее графику с фиксированными функциями, отвечающее за обработку команд API, растеризацию треугольников и растровый вывод. Второй — шейдерное ядро, сердце GPU, выполняющее программные шейдеры (вертексы, геометрия, пиксели и вычисление шейдеров). Последний — программный; графический драйвер, работающий на CPU и объединяющий все функции, управляющий работой GPU. Драйвер преобразовывает графические приложения, написанные на Metal или OpenGL ES API в набор команд для железа с фиксированными функциями и в программируемые шейдеры, работающие в шейдерных ядрах. Один из важнейших компонентов драйвера — компилятор, создающий машинный код для работы на шейдерных ядрах.
В старых поколениях железо с фиксированными функциями, шейдерные ядра и драйвер Apple использовала по лицензии от Imagination Technologies. Но за последние 6–7 лет Apple агрессивно нанимала графических архитекторов и программистов компиляторов и драйверов из таких компаний, как AMD, Intel, Google и Nvidia для разработки собственного GPU. К примеру, Майк Вуэртеле [Mike Wuerthele] из Apple Insider писал, что в этом году порядка 25 человек перешли из Imagination Technologies в Apple. GPU от Apple, судя по всему, до сих пор ииспользует железо с фиксированными функциями от PowerVR. Но на основании различных доказательств, имеющихся в открытом доступе, понятно, что Apple заменила программируемые шейдерные ядра своими собственными, более эффективными и быстрыми. Для получения преимущества от их использования Apple также разработала свои драйвер и компилятор, выдающие код для своей архитектуры. Общим результатом этого стал уникальный собственный дизайн GPU, несмотря на некоторое наследие, оставшееся от PowerVR. Это дизайн мирового класса с впечатляющим быстродействием и энергетической эффективностью. У процессора A9 лучшие результаты по всем измерениям скорости, а A10 Fusion ещё на 40–50% быстрее.
Документация на архитектуру GPU от Apple никогда не попадала в общий доступ. Чтобы разработчики могли использовать преимущества GPU, им надо разобраться в том, как писать шейдерные программы для компиляторов Metal и OpenGL. На конференции WWDC 2016 инженеры Apple презентовали «Передовую оптимизацию шейдеров для Metal», содержащую самые подробные инструкции по подстройке и деталям архитектуры их GPU на сегодняшний день. Архитектура PowerVR Series 6 GPU также страдает отсутствием документации, но Imagination Technologies поделились несколькими простейшими инструкциями по оптимизации. Сравнивая доступную информацию по двум этим чипам, можно заключить, что они очень различаются. В частности, у Apple набор регистров и функции преобразования данных лучше предназначены для быстродействия и эффективного использования энергии, а компилировать их проще.
Apple улучшает быстродействие и энергетическую эффективность при помощи регистров меньшего размера
API мобильной графики OpenGL ES и Metal API поддерживают 16-битный формат половинной точности с плавающей запятой, используемый для подсчётов и хранения данных изображения, потребляющий меньше энергии, чем 32-битные расчёты одинарной точности. Расчёты с половинной точностью в некоторых случаях быстрее теряют точность, чем расчёты одинарной точности. Но для многих приложений, работающих с графикой, обработкой изображений и машинный обучением, половинной точности достаточно для выдачи правильных результатов — особенно в связи с тем, что у большинства дисплеев динамический диапазон одного пикселя составляет от 8 до 12 бит.
Набор регистров для GPU от Apple состоит из 16-битных регистров, идеально подходящих для полуточных данных, если судить по презентациям, доступным в открытом доступе [1]. Данные одинарной точности с плавающей запятой и другие 32-битные данные требуют двух регистров. В результате, набор регистров может хранить в два раза больше 16-битных переменных, чем 32-битных. Инженеры Apple подчёркивают, что использование полуточных расчётов приводит к серьёзному увеличению быстродействия и экономии энергии по сравнению с одинарной точностью, что говорит о том, что их архитектура сконцентрирована на использовании половинной точности как основной концепции в дизайне.
По контрасту, GPU PowerVR Series 6 и 7 используют 32-битные регистры и разработаны для расчётов одинарной точности, если судить по инструкциям от Imagination Technologies [2]. В Series 6 самые часто используемые инструкции, FMAD, FMUL и FADD, умеют работать с половинной точностью, но просто обнуляя несколько битов исходных и результирующих регистров. Некоторые инструкции могут работать с двумя 16-битными элементами SIMD внутри одного регистра (а Series 7 расширяют эти возможности на большее число инструкций), но исполнение SIMD сильно отличается от скалярного исполнения при помощи 16-битных регистров. Для PowerVR хранение данных в 16-битном формате — трата памяти регистров впустую, при этом максимальное количество хранимых переменных не удваивается автоматически. Поэтому использование 16-битных данных должно уменьшить объёмы проходящих через память данных и потребление энергии, но не обязательно увеличит быстродействие или эффективность энергозатрат, как это получается у GPU от Apple.
Простое преобразование даёт программистам доступ к половинной точности
Одна из распространённых проблем 16-битных данных в том, что хотя большинство расчётов не доставляют проблем с уменьшением точности, некоторым всё-таки требуется высокая точность. К примеру, шейдер, подсчитывающий цвет большого блока пикселей, а затем подсчитывающий среднее, может обойтись 16 битами для каждого отдельного пикселя, но может потребовать использовать 32 бита при суммировании данных для точного подсчёта. Если преобразование пиксельных данных из 16 в 32 бита будет слишком затратным, шейдер будет использовать 32 бита для выдачи точного результата.
GPU от Apple предлагает очень быстрое преобразование между типами данных, чем поощряет смешивание точности и создаёт больше возможностей для быстродействующих и мало потребляющих 16-битных расчётов. Согласно их презентации, преобразование типов данных «бесплатное» — видимо, где-то на пути данных сидит аппаратный преобразователь. С точки зрения «железа» этот подход дороже, но он, кроме прочего, серьёзно упрощает компилятор и делает работу программистов легче.
PowerVR Series 6 и 7 могут делать преобразования точности данных, но, конечно, не «бесплатно». В инструкции по оптимизации чётко написано, что каждое преобразование данных (с понижением или повышением точности) затратное, и рекомендует программистам писать шейдеры с минимальным количеством преобразований [3].
GPU от Apple: разница в технологиях
Разница между набором регистров и преобразованием данных в GPU от Apple и в GPU от Imagination огромна. Организация набора регистров — это основа ядра шейдера, она влияет на дизайн практически всего, от архитектуры набора инструкций шейдерных ядер до выполнения частей кода и логики диспетчеризации. Как пример, размер регистра определяет путь данных и схему практически всей работы шейдерного ядра. Преобразование данных влияет не так сильно, но разница весьма важна для компилятора и для разработчиков. PowerVR Series 7 GPU довольно похож на предыдущее 6-е поколение, и использует 32-битные регистры. На основе этой разницы можно заключить, что GPU от Apple использует собственные шейдерные ядра, разработанные в компании. А это значит, что Apple разработала и свой собственный компилятор шейдеров для OpenGL ES и Metal API, и, скорее всего, и свой графический драйвер.
Даже некоторые программы, измеряющие быстродействие, видят разницу. В результаты GFXBench как-то попала таблица, где GPU для iPhone 7 описан, как G9.
Но этот результат теста из публичной базы скоро потёрли, и все упоминания о G9 исчезли.
Есть много других отличий Apple GPU и PowerVR, которые можно обнаружить, запуская специальные тесты с шейдерами Metal и сравнивая результаты со схожими шейдерами OpenGL ES на PowerVR GPU. Не все различия будут относиться к железу. К примеру, Apple GPU поддерживает версии OpenGL ES до 3.0, а PowerVR GPU работает и с более поздними. Но такие различия могут проявляться из-за особенностей софта и драйверов.
Стратегические преимущества собственного дизайна
Вертикальная интеграция Apple уникальна для потребительской электроники. В случае iPhone и iPad компания контролирует почти всё — от дизайна базовых контуров процессора до ОС и сервисов для пользователей Maps, iMessage и Camera. Это позволяет играть на совместной работе железа и софта, что недостижимо для их конкурентов.
Общий тренд понятен — на каждом шагу Apple увеличивает контроль над платформой и экосистемой. Изначально Apple использовала стандартные ARM-процессоры, а большую часть работы отдавала на аутсорс Samsung, но в итоге разработала собственные CPU, совместимые с ARMv8, опережающие соперников. Схожим образом компания купила Anobit и использовала команду и технологию для создания собственного контроллера хранилища для флэш-памяти. Разработка собственного CPU — всего лишь следующий шаг по созданию стратегических преимуществ.
Самое очевидное из них — GPU от Apple лучше (быстрее и эффективнее), чем у соперников, включая GPU от ARM или Imagination, а также Qualcomm. Лидерство в быстродействии означает большую удовлетворённость пользователей и меньший разряд батареи как в случае с играми, так и в случае генерации изображений и машинного обучения.
Библиотека Metal Performance Shaders включает десятки хорошо оптимизированных шейдеров, работающих на GPU и предоставляющих богатый набор инструментов разработчикам [4]. Они включают нейросети для классификации, процедуры обработки изображений. Instagram использует GPU для эффекта tonemapping и улучшения контраста фотографий. Возможно даже, что камера apple использует GPU для разных эффектов. Для работы с изображениями и нейросетей половинная тчоность подходит идеально, и архитектура шейдеров Apple показывает лучшие результаты, чем у PowerVR.
Второе преимущество — Apple может создавать новые функции и исправлять ошибки в GPU, не принося этим пользы конкурентам.
Третье — время до выхода на рынок и планирование. Процессоры серии A выходят по агрессивному ежегодному циклу, задаваемому iPhone. Поскольку iPhone — премиальный продукт, Apple должна поразить пользователей быстродействием и показать хороший прогресс для стимуляции спроса. В результате Apple часто становится ведущим клиентом новых технологий (например, 10нм от TSMC), что подразумевает и большой риск. С собственным GPU компания может решить потратить на достижение цели столько времени и энергии, сколько нужно. У Imagination просто меньше денег и сотрудников.
Apple приходится аккуратно связывать вместе дизайн, проверки, производство и экосистему ПО для запуска миллионов телефонов и планшетов, попадающих в руки пользователей. Месяцы, предшествующие выходу, состоят из бешеных циклов поиска и исправления обшибок, обновления графического ПО и железа. Поскольку GPU тепер ь собственный, этот цикл находится под прямым контролем Apple с малым количеством внешних зависимостей, что помогает компании успевать с запуском вовремя.
Гипотетический пример — если инженеры Apple обнаружат серьёзную ошибку в ядре шейдера, они в тот же день смогут её исправить и проверить. Участие третьей стороны означает, что эта сторона для начала должна сама оценить приоритет ошибки, одобрить изменения или пути обхода, что может занять некоторое время из-за необходимости координации действий с другими клиентами. Exynos 5410 от Samsung — хрестоматийный пример опасности работы с интеллектуальной собственностью третьей стороны. Его разработали на основе Cortex A15 и A7 от ARM в конфигурации Big.Little для экономии энергопотребления, но из-за ошибки согласованности кэшей Samsung пришлось отключить функции экономии энергии. Собственные разработки сильно уменьшают такие риски, поскольку в этом случае отсутствует конфликт интересов, а передача информации внутри компании проходит гораздо легче, чем между компаниями.
Последнее преимущество собственной разработки GPU, это уменьшение зависимости от поставщиков, что даёт компании выгодные позиции при ведении переговоров и уменьшает риски бизнеса. Создание альтернатив для ключевых поставщиков, внутренних или внешних, это один из старинных принципов Apple. К примеру, Apple была зависима от Qualcomm и их LTE-модемов для iPhone. Когда Intel разработал конкурирующий модем, Apple приспособила его для большинства GSM-провайдеров. В перспективе это позволяет уменьшать расходы и рождает интересные возможности.
Собственный GPU создаёт скрытую альтернативу использования интеллектуальной собственности Imagination в будущем. Компания уже создала команду разработки GPU и команду драйвера, вместе разработавшие большую часть процессоров A8, A9 и A10. Если бы Imagination Technologies была куплена или отстала в технической части, Apple сможет просто разработать собственное железо для графики с фиксированными функциями на замену PowerVR.
Следующие шаги Apple
После многих лет найма графических архитектров, Apple разработала собственный GPU, который уже ставят в процессоры A8, A9 и A10, работающие в iPhone 6, 6S и 7. В GPU всё ещё остаётся железо от PowerVR, но ясно, что шейдерные ядра очень отличаются от тех, что используют Imagination Technologies. Это значит, что Apple сделала собственные компиляторы для Metal и OpenGL ES, и скорее всего, и собственный драйвер.
Судя по истории компании, нет ничего удивительного в разработке собственного GPU. Кроме очевидных преимуществ в быстродействии есть и менее очевидные — улучшенный контроль над экосистемой, меньшее время выхода на рынок, уменьшение количества ошибок.
Впереди у Apple есть три варианта. Status quo — лицензирование железа с фиксированными функциями у Imagination Technologies для дополнения своих компонентов. В этом случае Apple обновится до следующей версии PowerVR, но, наверняка параллельно договорившись на лучшие условия и отчисления. Второй вариант — купить Imagination Technologies. Но с этим придут ненужные побочные проекты (линейка MIPS), да и такую возможность в 2016 году Apple уже упустила. Но Apple может продолжить собственные разработки GPU, что в результате приведёт к преобладанию над Imagination Technologies. Компании придётся решать, справятся ли они лучше самостоятельно, но пока что у них прекрасно получалось достигать квалификации мирового класса в новых областях.
Ссылки
[1] Alex Kan and Fiona, Advanced Metal Shader Optimization. WWDC 2016. Раз и два
[2] PowerVR Series6 Compiler Instruction Set Reference. March 17, 2016
[3] PowerVR Performance Recommendations. March 17, 2016
[4] Metal Performance Shaders Framework