Heterogeneous System Architecture или о встрече CPU и GPU

Долгое время развитие микроэлектроники проходило под девизом «меньше и быстрее». Уменьшался техпроцесс, вводились новые элементы архитектуры x86 (наборы расширений инструкций), увеличивалась тактовая частота вычислительного ядра. Когда рост «грубой» производительности упёрся в экономические и физические факторы, популярными стали различные способы параллелизации вычислений. В то же время развивались не только CPU, показывавшие хорошую производительность в однопоточных и сложных вычислениях, но и GPU, способные быстро выполнять большое количество однотипных и простых задач, которые с трудом поддавались обычным процессорам.

3e81f31acc0c4f98ac3a98e00d542bf6.png

Сегодня мы вступаем в новую эпоху развития чипов, отвечающих за проведение вычислений в сердцах десктопов, серверов, мобильных девайсов и носимой электроники. Объединив подходы к обработке информации на CPU и GPU мы разработали новую, открытую архитектуру, без которой дальнейшее исполнение того же закона Мура представляется трудновыполнимым. Встречайте HSA — Гетерогенную Системную Архитектуру.

Минутка истории


Для того, чтобы полностью осознать, насколько HSA, с одной стороны, близка, а с другой стороны — превосходит архитектуру современных решений, давайте обратимся к истории. Даже если отбросить десятилетия ламповой техники, и начать с 1950-х, с момента появления в микроэлектронике транзисторов, история получится такая, что отдельную статью можно написать. Пройдёмся очень коротко по основным «вехам» процессоростроения, и совсем чуть-чуть по истории видеокарт.

На заре компьютеростроения CPU были достаточно просты. По сути, все операции сводились к сложению чисел в двоичной системе. Когда требовалось вычитать — применялись т.н. «обратные коды»: они были просты и легко укладывались «в железо», не требуя сложнейших архитектурных изысков, реализовывающих «честное» вычитание чисел. Под каждую модель компьютера программы писались отдельно, пока не настал 1964 год.

bde69281b95b41179c246554b02c2982.jpg
IBM System/360

В 1964 году компания IBM выпустила System/360, компьютер, который изменил подход к созданию процессоров. Скорее всего, именно ему принадлежит честь внедрения такого понятия, как системная архитектура. Просто потому, что до него никакой «системы» не было. Дело в том, что до System/360 все компьютеры 50-х и 60-х годов работали только с тем программным кодом, что был написан именно для них. IBM же разработали первый набор инструкций, который поддерживался в различных по конфигурации (и производительности), но одинаковых по архитектуре System/360. К слову, в этом же компьютере байт впервые стал 8-битным. До этого почти во всех популярных компьютерах он состоял из шести бит.

Вторым крупным нововведением в 60-х была разработка компании DEC. В своём компьютере PDP-8 они применили крайне простую для того времени архитектуру, содержащую всего четыре регистра по 12 бит каждый и чуть больше 500 блоков CPU. Тех самых «транзисторов», которые в 1970-х уже измерялись тысячами, а в 2000-х — миллиардами. Эта простота и создание компанией IBM такого понятия, как «набор инструкций» и определили дальнейшее направление развития вычислительной техники.

В 70-х начался бум микроэлектроники. Всё началось с производства первых однокристалльных процессоров: многие компании тогда производили чипы по лицензии, а затем совершенствовали их, добавляя новые инструкции и расширяя возможности.

С середины 70-х рынок 8-битных процессоров был переполнен и ближе к концу десятилетия в компьютерах появились доступные 16-битные решения, принёсшие с собой архитектуру х86, которая (пусть и со значительными улучшениями) жива и здорова до сих пор. Основным бичом, останавливающим развитие 16-битных процессоров в то время была «заточенность» производителей на производстве т.н. микросхем поддержки под 8-битные архитектуры. Вместе они составляли то, что в последствии называлось «северным» и «южным» мостами.

В начале 80-х, устав бороться с инертностью рынка, многие производители перенесли часть управляющих «микросхем поддержки» внутрь самого процессора. В последствии что-то из процессора уйдёт в чипсеты материнской платы и затем вернётся обратно, но уже тогда подобная архитектура была чем-то похожа на современные SoC«и.

Середина и конец 80-х годов прошли под знамёнами перехода на 32-битную адресацию памяти и 32-разрядные процессорные ядра. Закон Мура работал как и раньше: число транзисторов росло, росла тактовая частота и «грубая» производительность процессоров.

В 1991 году свет увидели процессоры AMD Am386DX и Am386SX, производительность которых была сравнима со следующим поколением систем (486). Именно Am386SX многие считают первой самостоятельной разработкой компании и отправной точкой для почти 15-и летнего доминирования на рынке высокопроизводительных домашних ПК и рабочих станций. Да, архитектурно он был клоном чипа i368SX, но обладал меньшим техпроцессом, на 35% лучшей энергоэффективностью и при этом работал на более высокой тактовой частоте, чем его прародитель, а стоил дешевле.

4d4e06a23c6847499361f8d6ce765b99.jpg


Сами девяностые были достаточно богаты как на события в области микроэлектроники, так и на бурный рост рынка. Именно в 90-е годы компанию AMD начали рассматривать как одного из серьёзных игроков на рынке, так как наши процессоры по соотношению цены и производительности часто оставляли не у дел своих конкурентов в лице Intel Pentium, особенно в домашнем сегменте. Расширенные набор инструкций (MMX / 3DNow!), появление кэш-памяти второго уровня, агрессивное уменьшение техпроцесса, рост тактовых частот… и вот уже на дворе новое тысячелетие.

В 2000-м году процессоры AMD впервые в мире перешагнули рубеж в 1 ГГц, а чуть позже всё та же архитектура К7 взяла и новую высоту — 1.4 ГГц.

В конце 2003 года мы выпустили новые процессоры на архитектуре К8, которая содержала три важных нововведения: 64-битная адрессация памяти, встроенный контроллер памяти, и шину HyperTransport, которая обеспечивала потрясающую на тот момент пропускную способность (до 3.2 Гбайт/с.).

В 2005 году появились первые двухъядерные процессоры (у Intel — два отдельных кристалла-ядра на одной подложке, у AMD — два ядра внутри одного кристалла, но с раздельной кеш-памятью).

Через пару лет естественного развития архитектура K8 сменилась новой (K10). Количество ядер на одном кристалле в максимальной конфигурации выросло до шести, появилась общая кэш-память третьего уровня. А дальнейшее развитие было скорее количественным и качественным, чем революционным. Больше мегагерц, больше ядер, лучше оптимизация, ниже энергопотребление, тоньше техпроцесс, доработанные внутренние блоки вроде предсказателя ветвлений, контроллера памяти и декодера инструкций.

То, что нас интересует в эволюции GPU (в рамках статьи о HSA) можно описать совсем коротко. С распространением компьютеров в качестве универсальных домашних решений для работы и развлечений популярность компьютерных игр росла. Вместе с ней росли и возможности 3D-графики, требуя всё новые и новые «вливания» мускулов в лице видеоускорителей. Применения специальных микропрограмм, шейдеров, позволило реализовать в 3D-графике реалистичное освещение относительно малой кровью. Первоначально шейдерные процессоры делились на вершинные и пиксельные (первые отвечали за работу с геометрией, вторые — с текстурами), позже появилась унифицированная шейдерная архитектура и, соотвественно, универсальные шейдерные процессоры, которые могли выполнять код как вершинных, так и пиксельных шейдеров.

Реализовывать GPGPU, вычисления общего назначения на графическом ускорителе, можно было с использованием открытого стадарта и OpenCL, или несколько упрощенного диалекта языка С.

С тех про из ключевых нововведений в GPU можно упомянуть только появление низкоуровневого API Mantle, позволяющего обращаться к видеокартам AMD примерно на том же уровне, на каком осуществляется доступ к графическим ускорителям внутри консолей PS4 и Xbox One) и взрывной рост объёмов памяти у GPU в последние два года.

image

На этом с историей покончено, настало время переходить к самому интересному: HSA.

Что такое HSA?


Начать хочется с того, что HSA, в первую очередь, является открытой платформой, на основе которой производители микроэлектроники могут построить свои продукты (независимо от используемого набора инструкций), соответствующие определённым принципам и общим правилам.

В то же время, HSA — это процессорная архитектура, объединяющая скалярные вычисления на классических CPU-ядрах, массовые параллельные вычисления на GPU и работу с обработкой сигналов на DSP-модулях, и связывающая их с помощью когерентного доступа к оперативной памяти. То есть вся история процессоро- и видеокартостроения в HSA сходится в одну точку: почти 50 лет прогресса в области микроэлектроники привели к созданию того, что логичным образом сочетает лучшие стороны систем различного назначения.

Развитие архитектуры х86 и процессоров позволили создать высокоэффективные процессорные модули, которые обеспечивают выполнение общих задач и низкое энергопотребление.

Унификация шейдерных процессоров внутри GPU-ядра и общее упрощение программирования под систему с огромным количеством параллельных исполняющих модулей дали путь GPGPU и применению вычислительной мощности видеокарт в тех областях, где раньше использовались отдельные аппаратные ускорители, так и не завоевавшие сколько-нибудь ощутимую долю рынка, чтобы остаться на плаву.

34ddc23f83b74c1a93bac4fffdecb84c.png

Интегрированный контроллер памяти, шины PCIe и системы ввода-вывода обеспечил прозрачный доступ к памяти для различных модулей HSA.

Наконец, встроенный DSP позволяет снять нагрузку с CPU и GPU при работе с видео- и аудиоконтентом, так как аппаратно заточен на работу по кодированию и декодированию соответствующих сигналов.

Все эти модули вместе покрывают весь спектр современных задач, а HSA позволяет прозрачно и легко научить программы работать со всем многообразием имеющихся аппратных возможностей используя такие классические инструменты, как языки как Java и C++.

Причины создания HSA


Современные реалии (распространение носимой и мобильной электроники, вопросы экономики и экологии) создали определённые тренды в развитии микроэлектроники: снижение энергопотребления всех устройств, будь то смартфоны или серверы, увеличение производительности, улучшение работы с распознаванием образов.

Первое, в принципе, понятно. Всем хочется, чтобы гаджет работал дольше, корпус при этом не был толщиной с БигМак, и не грелся, как сковородка на плите. Владельцам же дата-центров хватает хлопот по отведению тепла и обеспечению бесперебойного питания, нагружать их лишними ваттами теплопакета означает увеличивать стоимость их услуг. Дороже хостинг — больше рекламы на ваших любимых ресурсах, больше нагрузка на CPU устройств, выше энергопотребление, меньше автономной работы.

Увеличение производительности сегодня просто воспринимается как данность. Люди привыкли к тому, что с 70-х годов каждый год процессоры бьют рекорды по производительности, игры становятся красивее, системы и софт сложнее (и при этом не теряют в визуальной скорости работы), а современые инструменты программиста содержат всё больше слоёв абстракции от железа, каждый из которых забирает частичку реальной производительности.

Ну, а современные разработки в области интеллектуальных помощников, виртуальных ассистентов и перспективы развития искусственного интеллекта просто таки требуют нормального распознавания человеческой речи, мимики, жестов, что, в свою очередь, требует увеличения как прямой производительности, так и оптимизации выполняемых операций по декодированию аудио- и видео-потока.

Все эти проблемы позволила бы решить универсальная аппаратная архитектура, реализованная в виде SoC, и соединяющая в себе прелести классических CPU и GPU, грамотно распределяющая последовательные и параллельные операции между теми модулями, которые способны выполнять соответствующие задачи наиболее эффективно.

Но как научить софт работать со всем этим великолепием вычислительных возможностей?

Ключевые особенности гетерогенной системы


У программистов не должно быть проблем с доступом к вычислительным возможностям такой системы. Для этого HSA имеет ряд ключевых особенностей, упрощающих работу разработчиков ПО с ней и приближающих HSA к классическим системам с точки зрения разработки:

  • Унифицированная адресация для всех процессоров;
  • Полная когерентность памяти;
  • Операции в страничной системе памяти;
  • Пользовательский режим отправки;
  • Управление рабочими очередями на уровне архитектуры;
  • Высокоуровневая языковая поддержка для вычислительных процессоров — GPU;
  • Смена контекста и вытесняющая многозадачность.


Разработчику приложения не требуется разбираться в низкоуровневых языках программирования: стандартные компоненты, простой промежуточный язык, интерфейсы взаимодействия и железо доступны разработчику, а когерентная память и то, как задачи будут распределены между вычислительными модулями легко прячется «под капотом».

Роль унифицированной адресации памяти так и вовсе сложно переоценить. Формально, без неё никакой HSA не было бы. Не важно где в памяти находятся данные, сколько у вас ядер, модулей, вычислительных блоков. Вы переносите указатель и производите вычисления, а не занимаетесь «переливанием» байт с одного исполнительного устройства на другое. Снижается нагрузка на кэш-память, упрощается управление самим процессором. Абстракция памяти на уровне платформы позволит использовать один и тот же код для разных платформ, упрощая жизнь разработчикам ПО.

Сложности OpenCL и C++ AMP


Программирование под параллельные системы — задача не из лёгких. Для облегчения разработчикам жизни мы разработали библиотеку Bolt, которая предоставляет эффективные паттерны для наиболее часто используемых шаблонов сортировки, сокращения, сканирования и преобразования данных с использованием параллельных вычислений.

Для ускорения Java-кода без переписывания его на OpenCL применяется специальная библиотека AparApi (с открытым исходным кодом), которая позволяет конвертировать байт-код Java в OpenCL с поддержкой параллельных вычислений на CPU и GPU-ядрах.

В последствии планируется доработать Aparapi, сначала связав его с HSAIL, затем добавив специальный оптимизатор. В конце концов HSA должна работать с гетерогенным ускорением напрямую через Java-машину, прозрачно для пользователя и программиста.

Открытый стандарт и аппаратная независимость


Мы уже говорили о том, что HSA — это открытая платформа. API и спецификации предоставляются разработчиком бесплатно, а сама HSA не зависит от набора инструкций CPU или GPU.

Для обеспечения совместимости аппаратных решений различных вендоров был создан свой набор ISA: HSAIL (HSA Intermediate Layer), обеспечивающий работу ПО вне зависимости от того, что находится внутри HSA-решения. Сам же Intermediate Layer поддерживает работу с исключениями, виртуальными функциями, моделями памяти современных языков, так что никаких проблем с поддержкой C++, Java и .Net не предвидится, при этом разработчики могут как обращаться к «железу» напрямую, так и задействовать готовые библиотеки оптимизации HSA, которые будут самостоятельно распределять задачи и упорядочивать общение с железом, упрощая работу программиста.

4276e9a50f70410eb80bf474e0d4c97b.png

Аппаратная составляющая


Не AMD единым жив HSA. Разработчикам важно, чтобы написанный единожды код одинаково хорошо работал на разных устройствах. Кто-то применяет для этого языки программирования высокого уровня, вроде C++ или Java, мы же предлагаем работать на более низком уровне. С одной стороны, классические приложения смогут работать на HSA-устройствах так, словно ничего не менялось. Операционные системы будут предоставлять старым приложениям понятный и простой доступ к процессору, памяти, видеоядру. С другой стороны, HSAIL позволяет извлечь всю мощь из новых SoC, и разработчики могут создавать высокопроизводительные и экономно относящиеся к ресурсам приложения так же просто, как и для классических связок ОС и «железа».

Сейчас HSA Foundation насчитывает семь компаний, которые являются основателями данной организации: AMD, ARM, Imagination Technologies, MediaTek, Texas Instruments, Samsung Electronics and Qualcomm®.

Стандартизация в области распределения задач по вычислительным ядрам, передачи данных и указателей памяти, работы основных элементов платформы с помощью HSAIL позволяет вендорам использовать их наработки в области железа, а разработчикам не заботиться о том, что находится под капотом. Приложения, заточенные под HSAIL будут работать на любой платформе.

Плюсы и минусы аппаратных решений на базе HSA


Гетерогенная архитектура позволяет соединить возможности CPU и GPU, и в этом заключается её основной плюс. В то же время HSA бережно относится к потребляемой электроэнергии, не нагружая процессор вычислениями, которые куда эффективней запускать на GPU.

2537456daf454e448178639f241ba2a7.jpg Симуляция физики твёрдых тел сегодня используется повсеместно: начиная с компьютерных игр и 3D-пакетов, заканчивая САПР, тренажёрами для медиков, военных и спортсменов. Работа на CPU подобной системы зачастую неоптимальна, т.к. требует многочисленных, но простых вычислений. А когда количество взаимодействующих объектов превышает сотни или даже тысячи, классические CPU просто не способны обеспечить соотвествующее количество вычислений. Зато архитектура GPU подходит для таких расчётов как нельзя лучше. А унифицированная адресация, страничная память, и полная когерентность позволяют перенести расчёты на соотвествующее железо с минимальными затратами ресурсов и сил разработчика.

Производительность HSA на задачах общего плана зачастую выше, чем у классических CPU и выше, чем у связки CPU + GPU за счёт того, что какими бы идеальными не были драйвера, от копирования данных из общей памяти в память GPU и отправка результатов вычислений назад может занимать больше времени, чем сами вычисления.

HSA уже сейчас быстрее классических систем, но может работать ещё лучше. Собственно, единственный текущий минус системы в том, что она новая. Популярность только начинает расти, новые модели железа в не самых благоприятных экономических условиях выходят на рынок медленнее, и популярность HSA растёт не такими темпами, как всем нам хотелось бы. Как только разработчики войдут во вкус, поймут преимущества HSA и простоту разработки под новую систему и начнут нативно поддерживать возможности гетерогенной архитектуры в своих приложениях нас ждёт расцвет новых, высокопроизводительных приложений для серверов, классических компьютеров и мобильных устройств.

© Geektimes