[Перевод] Сказ о M1 GPU

8805bf10fff67f0c339cd14831ba535f.png

Привет всем, в эфире Асахи Лина! ✨

marcan попросил меня написать статью о M1 GPU, и вот она готова ~! Это был долгий проект, растянувшийся на несколько месяцев, и было о чём поведать, так что, надеюсь, вам понравится!

Что такое GPU

Пожалуй, вы знаете, что такое GPU, но известно ли вам, как он работает под капотом? Давайте посмотрим! Почти у всех современных GPU одни и те же основные компоненты:

  • Набор шейдерных ядер, обрабатывающих треугольники (вершинные данные) и пиксели (фрагментные данные), выполняя программы, определяемые пользователем. Они используют разные кастомные наборы инструкций для каждого GPU!

  • Блоки растеризации,  семплеры текстур,   блоки вывода рендеринга, а также другие элементы, работающие вместе с шейдерами для перегона треугольников из приложения в пиксели на экране. Точный принцип работы этих механизмов отличается от GPU к GPU!

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

  • Блок управления памятью  (MMU), отвечающий за ограничение доступа к тем областям памяти, что принадлежат конкретному приложению, использующему GPU. Поэтому различные приложения не могут друг друга обвалить или вмешаться в работу друг друга.

(Это очень упрощённая картина, на самом деле в работе участвует ещё множество элементов, варьирующихся от GPU к GPU, но выше я перечислила самые важные компоненты!)

Чтобы при обращении со всеми этими «шестерёнками» соблюдалась разумная безопасность, драйверы современных GPU делятся на две группы: драйверы пользовательского пространства и драйверы ядра. В данном случае та часть, что относится к пользовательскому пространству, отвечает за компиляцию шейдерных программ и трансляцию вызовов API (как при работе с OpenGL или Vulkan) в списки конкретных команд, которые командный процессор будет применять при рендеринге сцены. Пространство ядра, в свою очередь, отвечает за управление блоками MMU и операции выделения/деаллокации памяти от разных приложений, а также решает, как и когда отправлять различные команды в процессор, их обрабатывающий. Таким образом работают все современные драйверы для GPU, во всех крупных операционных системах!

Между драйвером пользовательского пространства и драйвером ядра обычно расположен своего рода кастомный API, настраиваемый для каждого семейства GPU. Обычно эти API отличаются для каждого драйвера! В Linux такие интерфейсы называются UAPI, но в каждой ОС есть подобная сущность. Именно этот UAPI позволяет пользовательскому пространству запрашивать у ядра выделение/деаллокацию памяти и отправлять в GPU списки команд.

Таким образом, чтобы подружить M1 GPU с Asahi Linux, требуются две составляющие: драйвер ядра и драйвер пользовательского пространства!

© Habrahabr.ru