Динамическое кэширование попытка объяснить крупную функцию M3 | ENBLE

Динамическое кэширование попытка объяснить большую функцию M3 на примере ENBLE

Слайд с презентации Apple с надписью "Динамическое кэширование"
Изображение использовано с разрешения правообладателя

Во время мероприятия “Смертельно быстрый” от Apple одна функция привлекла мое внимание больше всего: Динамическое кэширование. Вероятно, как и большинство людей, смотрящих презентацию, у меня возникло одно вопрос: “Как увеличение выделения памяти может повысить производительность?”

Apple основала свое введение нового чипа M3 на “столпной” функции, которую они называют Динамическим кэшированием для GPU. Упрощенное объяснение от Apple не дает ясного представления о том, что именно делает Динамическое кэширование, не говоря уже о том, как оно улучшает производительность GPU на M3.

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

Что именно такое Динамическое кэширование?

Семейство чипов Apple M3.
Apple

Динамическое кэширование – это функция, которая позволяет чипам M3 использовать только ту точную память, которая необходима для выполнения определенной задачи. Вот как Apple описывает это в официальном пресс-релизе: “Динамическое кэширование, в отличие от традиционных GPU, выделяет использование локальной памяти в аппаратуре в режиме реального времени. С Динамическим кэшированием используется только точное количество памяти, необходимое для каждой задачи. Это первое в отрасли решение, незаметное для разработчиков, и является основой новой архитектуры GPU. Оно значительно увеличивает среднюю загрузку GPU, что значительно повышает производительность для самых требовательных профессиональных приложений и игр”.

В типичном стиле Apple, многие технические аспекты сознательно скрыты, чтобы сосредоточиться на результате. Там достаточно информации, чтобы понять суть, не раскрывая секретного соуса или сбивая аудиторию с толковыми техническими терминами. Но общая идея, кажется, заключается в том, что Динамическое кэширование позволяет более эффективно распределять память на GPU. Просто, не так ли? Но все еще не совсем ясно, как “увеличение выделения памяти” повышает “среднюю загрузку” или “значительно повышает производительность”.

Чтобы попытаться понять Динамическое кэширование, нам нужно вернуться назад и рассмотреть, как работают GPU. В отличие от ЦП, GPU отлично справляются с обработкой массовых нагрузок параллельно. Эти нагрузки называются шейдерами, которые являются программами, которые выполняет GPU. Чтобы эффективно использовать GPU, программам необходимо выполнять множество шейдеров одновременно. Вы хотите использовать как можно больше доступных ядер.

Это приводит к эффекту, который Nvidia называет “хвостом”. Несколько шейдеров выполняются одновременно, а затем происходит снижение использования, пока большее количество шейдеров не отправляется на выполнение в потоках (или точнее, блоках потоков на GPU). Этот эффект был заметен в презентации Apple, когда было объяснено Динамическое кэширование, поскольку использование GPU сначала резко увеличивалось, а затем падало.

Два графика, показывающих использование GPU рядом.
Изображение использовано с разрешения правообладателя

Как это связано с памятью? Функции на вашем GPU читают инструкции из памяти и записывают вывод функции в память. Многие функции также могут обращаться к памяти несколько раз во время выполнения. В отличие от ЦП, где латентность памяти через ОЗУ и кэш является крайне важным из-за низкого уровня параллельных функций, латентность памяти на GPU легче скрыть. Это высокопараллельные процессоры, поэтому если некоторые функции манипулируют памятью, другие могут быть выполнены.

Это работает, когда все шейдеры просты в выполнении, но требовательные рабочие нагрузки будут иметь очень сложные шейдеры. Когда эти шейдеры планируется выполнить, память, необходимая для их выполнения, будет выделена, даже если она не нужна. GPU выделяет много ресурсов для одной сложной задачи, даже если эти ресурсы будут просто тратиться. Кажется, “Динамический кэшинг” – это попытка Apple более эффективно использовать ресурсы, доступные GPU, чтобы эти сложные задачи получали только то, что им нужно.

Теоретически это должно увеличить средний уровень использования GPU, позволяя выполнять больше задач одновременно, а не позволяя меньшему набору требовательных задач использовать все доступные ресурсы GPU. Объяснение Apple фокусируется на памяти в первую очередь, создавая впечатление, что только выделение памяти повышает производительность. С моего понимания, кажется, что эффективное выделение позволяет выполнять больше шейдеров одновременно, что затем приводит к увеличению использования и производительности.

Используемый против выделенного

Одной из основных аспектов, важной для понимания моей попытки объяснения “Динамического кэширования”, является то, как ветвятся шейдеры. Программы, которые выполняет ваш GPU, не всегда статичны. Они могут меняться в зависимости от различных условий, что особенно верно для больших и сложных шейдеров, таких как те, которые требуются для трассировки лучей. Такие шейдеры с условным выполнением должны выделять ресурсы для наихудшего возможного сценария, что означает, что некоторые ресурсы могут быть потрачены впустую.

Вот как Unity объясняет использование шейдеров с динамическим ветвлением в своей документации: “Для любого вида динамического ветвления GPU должен выделить регистровое пространство для наихудшего случая. Если одна ветвь гораздо более затратна, чем другая, это означает, что GPU тратит регистровое пространство впустую. Это может привести к меньшему числу вызовов программы шейдера параллельно, что снижает производительность”.

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

Все еще чёрный ящик

Apple revealing new Macs at an event.
Apple

Конечно, я должен отметить, что все это только моё понимание, составленное на основе того, как традиционно функционируют GPU и официальных заявлений Apple. Apple может выпустить больше информации о том, как все это работает в конечном итоге, но, в конечном счете, технические детали “Динамического кэширования” не имеют значения, если Apple действительно способна улучшить использование GPU и производительность.

В конечном итоге, “Динамическое кэширование” – это маркетинговый термин для функции, которая лежит глубоко в архитектуре GPU. Попытка понять это, не будучи разработчиком GPU, неизбежно приведет к неправильным представлениям и упрощенным объяснениям. Теоретически Apple могла бы просто отказаться от брендинга и позволить архитектуре говорить самой за себя.

Если вы искали более глубокое понимание того, что “Динамическое кэширование” может делать в GPU M3, теперь у вас есть возможное объяснение. Однако важно, как продукт в конечном итоге будет работать, и нам не осталось ждать долго до того, как устройства M3 от Apple станут доступными широкой публике, чтобы мы все смогли это узнать. Однако, судя по обещаниям о производительности и демонстрациям, которые мы видели до сих пор, это очень обнадеживает.