Глава 4: Проектирование системы памяти GPU
Графические процессорные устройства (GPU) эволюционировали в высокопараллельные, программируемые ускорители, способные достигать высокой производительности и энергоэффективности на широком спектре приложений. Система памяти является критически важным компонентом современных архитектур GPU, поскольку она должна обеспечивать огромное количество одновременных потоков быстрым доступом к данным. В этой главе мы исследуем ключевые элементы проектирования системы памяти GPU, включая структуры памяти первого уровня, межсоединительную сеть на кристалле, блоки разделения памяти и направления исследований для будущих систем памяти GPU.
Структуры памяти первого уровня
Структуры памяти первого уровня в GPU отвечают за обеспечение быстрого доступа к часто используемым данным и снижение количества обращений к нижним уровням иерархии памяти. Эти структуры, как правило, включают в себя скрэтчпад-память, кэш данных L1 и текстурный кэш L1.
Скрэтчпад-память и кэш данных L1
Скрэтчпад-память, также известная как разделяемая память в модели программирования CUDA от NVIDIA или локальная память в OpenCL, представляет собой пространство памяти с низкой задержкой, управляемое программным обеспечением, которое разделяется всеми потоками внутри кооперативного массива потоков (CTA) или рабочей группы. Скрэтчпад-память, как правило, реализуется с использованием структуры SRAM с разделением на банки, чтобы обеспечить параллельный доступ нескольких потоков.
Рисунок 4.1 иллюстрирует объединенную организацию кэша данных L1 и скрэтчпад-памяти, аналогичную конструкции, используемой в архитектурах Fermi и Kepler от NVIDIA [Minkin et al., 2012].
Перекрестный адресный коммутатор
|
v
Массив данных (Настраиваемый как скрэтчпад или кэш)
|
v
Перекрестный коммутатор данных
|
v
Блок загрузки/сохранения
```Рисунок 4.1: Организация объединенного кэша L1 данных и памяти скрэтчпада.
Ключевые компоненты этого дизайна:
1. **Массив данных**: Высоко-банковая структура SRAM, которая может быть настроена либо как память скрэтчпада, либо как кэш L1 данных. Каждый банк имеет ширину 32 бита и свой собственный декодер для независимого доступа.
2. **Адресный кроссбар**: Распределяет адреса памяти от блока загрузки/сохранения в соответствующие банки массива данных.
3. **Кроссбар данных**: Маршрутизирует данные от банков к блоку загрузки/сохранения, который затем записывает данные в регистровый файл.
4. **Блок загрузки/сохранения**: Вычисляет адреса памяти, применяет правила объединения и разбивает доступы к памяти на отдельные объединенные доступы.
Доступы к памяти скрэтчпада обходят этап поиска в теге, так как память напрямую отображена. Конфликты банков обрабатываются путем разделения конфликтующих доступов на несколько циклов, при этом конфликтующие части повторяются в последующих циклах.
Кэш L1 данных используется для хранения подмножества глобального адресного пространства памяти. Доступы к кэшу L1 данных включают поиск в теге, чтобы определить, присутствуют ли запрошенные данные. Размер блока кэша обычно составляет 128 байт, который может быть дополнительно разделен на секторы по 32 байта, чтобы соответствовать минимальному размеру данных, который можно прочитать из графической DRAM (например, GDDR5) за один доступ.
### Кэш L1 текстур
Текстурная память - это память только для чтения, оптимизированная для пространственной локальности и часто используемая в графических рабочих нагрузках. Кэш L1 текстур разработан для использования 2D-пространственной локальности, присутствующей в доступах к текстурам.
На рисунке 4.2 показана типичная организация кэша L1 текстур.Фильтрация текстур
|
v
Отфильтрованные текселы
Рисунок 4.2: Организация кэша текстур L1.
Основные компоненты кэша текстур L1:
-
Отображение адресов: Преобразует текстурные координаты в адреса кэша.
-
Массив тегов: Хранит теги для каждой строки кэша, чтобы определить, присутствуют ли запрошенные данные.
-
Массив данных: Хранит фактические текстурные данные.
-
Фильтрация текстур: Выполняет интерполяцию и фильтрацию извлеченных текстурных данных для генерации окончательных отфильтрованных текселов.
Кэш текстур L1, как правило, использует организацию на основе плиток, чтобы использовать пространственную локальность. Кэш разделен на меньшие плитки (например, 4x4 или 8x8 текселов), и каждая плитка хранится непрерывно, чтобы минимизировать количество строк кэша, доступных для данной выборки текстуры.
Объединенный кэш текстур и данных
Недавние архитектуры GPU, такие как NVIDIA Maxwell и Pascal, представили объединенный кэш текстур и данных для улучшения использования кэша и уменьшения общего размера кэша [Heinrich et al., 2017]. В этом дизайне кэш данных L1 и кэш текстур L1 объединены в один физический кэш с возможностью динамического распределения емкости между ними в зависимости от требований рабочей нагрузки.
На рисунке 4.3 показана организация объединенного кэша текстур и данных.
Запросы памяти
|
v
Контроллер кэша
/ \
/ \
/ \
v v
Секция кэша данных Секция кэша текстур
|
```Вот перевод на русский язык:
Рисунок 4.3: Организация объединенного кэша текстур и данных.
Основные компоненты объединенной конструкции кэша:
-
Контроллер кэша: Получает запросы памяти и определяет, должны ли они обслуживаться разделом кэша данных или разделом кэша текстур.
-
Раздел кэша данных: Обрабатывает доступы к глобальному пространству памяти, аналогично автономному кэшу данных L1.
-
Раздел кэша текстур: Обрабатывает доступы к текстурной памяти, аналогично автономному кэшу текстур L1.
-
Массив данных: Общий массив данных, который хранит как глобальные данные памяти, так и данные текстур.
Объединенная конструкция кэша позволяет лучше использовать доступную емкость кэша, поскольку размеры разделов можно регулировать в зависимости от моделей доступа рабочей нагрузки. Эта гибкость может привести к улучшению производительности и энергоэффективности по сравнению с фиксированными по размеру, отдельными кэшами L1.
Сеть межсоединений на кристалле
Сеть межсоединений на кристалле отвечает за соединение ядер GPU (также называемых многопроцессорными потоками или вычислительными блоками) с блоками разделения памяти. Межсоединение должно обеспечивать высокую пропускную способность и низкую задержку, чтобы поддерживать массовый параллелизм в рабочих нагрузках GPU.
Современные GPU, как правило, используют кроссбар или топологию сетки для межсоединения на кристалле. Кроссбар обеспечивает полную связность между всеми ядрами и блоками памяти, что позволяет достичь высокой пропускной способности связи, но за счет увеличения площади и потребления энергии. Топология сетки, с другой стороны, предлагает более масштабируемое решение, соединяя каждое ядро с соседними ядрами и блоками памяти, образуя сетчатую структуру.
На рисунке 4.4 показан пример сетевого межсоединения в GPU.
Ядро Ядро Ядро Ядро
| | | |
—— —— —— ——
| | | |
Ядро Ядро Ядро Ядро
| | | |
—— —— —— ——
| | | |
Память Память Память Память
Часть Часть Часть Часть
Рисунок 4.4: Сетевая топология межсоединений в GPU.
Сетевая топология межсоединений позволяет эффективно передавать данные между ядрами и разделами памяти, при этом минимизируя площадь и энергопотребление. Используются продвинутые алгоритмы маршрутизации и механизмы управления потоками для обеспечения высокой производительности и предотвращения перегрузок.
## Блок разделов памяти
Блок разделов памяти отвечает за обработку запросов к памяти от ядер GPU и управление внешней DRAM-памятью. Каждый раздел памяти, как правило, включает в себя кэш L2, поддержку атомарных операций и планировщик доступа к памяти.
### Кэш L2
Кэш L2 является общим кэшем, расположенным между ядрами GPU и внешней DRAM-памятью. Его основная цель - снизить количество обращений к высокозатратной по времени и энергии DRAM-памяти, кэшируя часто используемые данные.
Кэши L2 в GPU, как правило, проектируются как кэши с ассоциативностью по множеству наборов и обратной записью с большой емкостью (например, 2-4 МБ) и высокой пропускной способностью. Кэш L2 разделен между несколькими разделами памяти, чтобы обеспечить параллельный доступ и повысить пропускную способность.
На рисунке 4.5 показана организация кэша L2 в разделе памяти GPU.
Запросы к памяти | v Контроллер кэша L2 | v Массив тегов | v Массив данных | v Планировщик памятиВот перевод на русский язык с сохранением оригинального кода:
DRAM
Рисунок 4.5: Организация кэша L2 в разделе памяти GPU.
Контроллер кэша L2 получает запросы на доступ к памяти от ядер GPU и проверяет массив тегов, чтобы определить, присутствуют ли запрашиваемые данные в кэше. При попадании в кэш данные извлекаются из массива данных и отправляются обратно запрашивающему ядру. При промахе в кэше запрос передается в планировщик памяти, который затем извлекает данные из DRAM.
### Атомарные операции
Атомарные операции являются важными для синхронизации и обмена данными между потоками в параллельных вычислениях. GPU поддерживают различные атомарные операции, такие как атомарное сложение, минимум, максимум и сравнение-и-обмен, которые гарантируют атомарность при одновременном доступе нескольких потоков к одному и тому же местоположению в памяти.
Атомарные операции, как правило, реализуются в блоках разделов памяти для обеспечения низкой задержки и высокой пропускной способности. Для эффективной обработки атомарных запросов используются специализированные аппаратные блоки, такие как блоки атомарных операций (AOU).
На рисунке 4.6 показан пример блока атомарных операций в разделе памяти GPU.
Атомарные запросы | v Блок атомарных операций | v Кэш L2/DRAM
Рисунок 4.6: Блок атомарных операций в разделе памяти GPU.
AOU получает атомарные запросы от ядер GPU и выполняет запрошенную операцию над целевым местоположением в памяти. Если местоположение в памяти присутствует в кэше L2, AOU непосредственно обновляет данные в кэше. Если местоположение в памяти не закэшировано, AOU извлекает данные из DRAM, выполняет атомарную операцию и затем записывает результат обратно в DRAM.
### Планировщик доступа к памяти
Планировщик доступа к памяти отвечает за управление потокомВот перевод на русский язык:
Запросы памяти к внешней DRAM-памяти. Его основная цель - максимизировать использование пропускной способности DRAM, одновременно минимизируя задержку доступа к памяти.
Диспетчеры памяти GPU используют различные алгоритмы планирования и оптимизации для достижения высокой производительности. Некоторые распространенные методы включают:
1. **Внепорядковое планирование**: Переупорядочивание запросов памяти для максимизации попаданий в буфер строк и минимизации накладных расходов на предварительную зарядку и активацию DRAM.
2. **Параллелизм на уровне банков**: Использование параллелизма, доступного в нескольких банках DRAM, для обеспечения одновременного доступа к различным областям памяти.
3. **Оптимизация переключения между записью и чтением**: Минимизация штрафа за задержку при переключении между операциями записи и чтения в DRAM.
4. **Чередование адресов**: Распределение доступа к памяти по различным каналам, рангам и банкам для максимизации параллелизма и избежания конфликтов.
Рисунок 4.7 иллюстрирует общий вид планировщика доступа к памяти в разделе памяти GPU.
Запросы памяти
|
v
Планировщик памяти
|
v
Канал Канал Канал Канал
| | | |
v v v v
Ранг Ранг Ранг Ранг
| | | |
v v v v
Банк Банк Банк Банк
Рисунок 4.7: Планировщик доступа к памяти в разделе памяти GPU.
Планировщик памяти получает запросы памяти из кэша L2 и блоков атомарных операций и решает, когда и в каком порядке выдавать эти запросы в DRAM. Тщательное планирование доступа к памяти может значительно улучшить использование пропускной способности DRAM и снизить среднюю задержку доступа к памяти.
## ИсследованиеНаправления для систем памяти GPU
Поскольку архитектуры GPU продолжают развиваться, а потребности параллельных рабочих нагрузок растут, существует несколько направлений исследований, направленных на повышение производительности и эффективности систем памяти GPU. Некоторые ключевые области исследований включают:
### Планирование доступа к памяти и проектирование сети межсоединений
Поскольку количество ядер и разделов памяти в GPU продолжает увеличиваться, проектирование планировщика доступа к памяти и сети межсоединений становится crucial для достижения высокой производительности. Исследования в этой области сосредоточены на разработке новых алгоритмов планирования и топологий межсоединений, которые могут эффективно справляться с массовым параллелизмом и сложными моделями доступа к памяти рабочих нагрузок GPU.
Например, Jia et al. [2012] предлагают алгоритм планирования памяти, называемый "Staged Memory Scheduling" (SMS), который направлен на повышение параллелизма на уровне банков DRAM и снижение задержки доступа к памяти. SMS разделяет очередь запросов памяти на две стадии: формирование пакетов и планирование пакетов. На стадии формирования пакетов запросы группируются в пакеты на основе их адресов банков и строк, чтобы использовать локальность строк. На стадии планирования пакетов пакеты приоритизируются по их возрасту и критичности, чтобы обеспечить справедливость и снизить задержки.
Другим примером является работа Kim et al. [2012], которая предлагает архитектуру высокоскоростной памяти (HBM) для GPU. HBM укладывает несколько кристаллов DRAM друг на друга и соединяет их с помощью сквозных кремниевых переходов (TSV), что обеспечивает гораздо большую пропускную способность и меньшую задержку по сравнению с традиционной памятью GDDR. Авторы также предлагают новый дизайн контроллера памяти, который может эффективно управлять увеличенным параллелизмом и сложностью HBM.
### Эффективность кэширования
GPU используют различные механизмы кэширования, чтобы уменьшить количество обращений к внешней памяти и повысить производительность. Однако эффективность этих кэшей может значительно различаться в зависимости от характеристик рабочей нагрузки и дизайна кэша.Исследования в этой области направлены на повышение эффективности кэшей GPU с помощью таких методик, как обход кэша, сжатие кэша и адаптивное управление кэшем.
Например, Huangfu и Xie [2016] предлагают динамическую схему обхода кэша для GPU, которая использует простую, но эффективную эвристику для определения того, следует ли кэшировать запрос памяти или обойти его, основываясь на расстоянии повторного использования. Схема адаптируется к поведению приложения во время выполнения и может значительно снизить загрязнение кэша и улучшить производительность.
Другим примером является работа Vijaykumar et al. [2015], в которой предлагается архитектура сжатого кэша для GPU. Авторы наблюдают, что многие приложения GPU демонстрируют значительную избыточность данных, которую можно использовать для увеличения эффективной емкости кэшей. Они предлагают новую схему сжатия, которая может достичь высоких коэффициентов сжатия при минимальных накладных расходах на задержку.
### Приоритезация запросов памяти и обход кэша
В GPU запросы памяти от различных варпов и потоков могут иметь разные уровни критичности и влияния на общую производительность. Приоритезация критических запросов и обход некритических может помочь снизить задержку памяти и улучшить использование ресурсов.
Исследования в этой области изучают методы для определения и приоритезации критических запросов памяти, а также механизмы для избирательного обхода кэшей.
Например, Jog et al. [2013] предлагают схему приоритезации запросов памяти, называемую "Critical-Aware Warp Acceleration" (CAWA). CAWA определяет критические варпы, которые, вероятно, вызовут простой конвейера, и приоритизирует их запросы памяти над запросами некритических варпов. Схема использует комбинацию статической и динамической информации, такой как количество зависимых инструкций и возраст варпа, для определения критичности.
Lee et al. [2015] предлагают схему обхода кэша для GPU, которая направлена на снижение загрязнения кэша и улучшение своевременности доступа к памяти. Схема использует основанный на PC подход дляВот перевод на русский язык с сохранением оригинального кода:
Механизм предсказания, позволяющий определять запросы памяти, которые вряд ли получат пользу от кэширования, и обходить их напрямую к нижнему уровню иерархии памяти. Авторы показывают, что их схема может значительно улучшить производительность и энергоэффективность по сравнению с базовым GPU без обхода.
### Использование гетерогенности между варпами
GPU выполняют большое количество варпов одновременно, чтобы скрыть задержку памяти и достичь высокой пропускной способности. Однако различные варпы могут проявлять значительную гетерогенность с точки зрения их потребностей в ресурсах, моделей доступа к памяти и характеристик производительности.
Исследования в этой области направлены на использование этой гетерогенности между варпами для улучшения распределения ресурсов, планирования и управления памятью в GPU.
Например, Kayıran et al. [2014] предлагают схему управления кэшем, основанную на расхождении варпов, которая динамически адаптирует политики выделения и замещения кэша в зависимости от характеристик расхождения каждого варпа. Варпам с высоким расхождением выделяется больше ресурсов кэша, чтобы уменьшить расхождение памяти, в то время как варпам с низким расхождением выделяется меньше ресурсов для улучшения использования кэша.
Другим примером является работа Sethia et al. [2015], которая предлагает конструкцию контроллера памяти, использующую гетерогенность между варпами для улучшения параллелизма на уровне банков DRAM. Авторы наблюдают, что различные варпы могут иметь разную степень параллелизма на уровне банков, и предлагают алгоритм планирования памяти, ориентированный на варпы, который отдает приоритет варпам с высоким параллелизмом на уровне банков, чтобы уменьшить конкуренцию за память и повысить пропускную способность системы.
### Согласованный обход кэша
Обход кэша - это техника, которая позволяет запросам памяти пропускать кэш и напрямую обращаться к нижнему уровню иерархии памяти. Хотя обход может помочь уменьшить загрязнение кэша и улучшить своевременность доступа к памяти, несогласованные решения об обходе между различными ядрами и разделами памяти могут привести к субоптимальной производительности.
Исследования в этой области изучают техникВот перевод на русский язык с сохранением оригинального кода:
Использование координации решений об обходе кэша между GPU для улучшения общей производительности системы и использования ресурсов.
Например, Ли и др. [2015] предлагают согласованную схему обхода кэша для GPU, которая использует централизованный контроллер обхода для принятия глобальных решений об обходе. Контроллер собирает информацию о работе в реальном времени от каждого ядра, такую как частота промахов в кэше и модели доступа к памяти, и использует эту информацию для определения оптимальной стратегии обхода для каждого ядра. Авторы показывают, что их схема может значительно улучшить производительность и энергоэффективность по сравнению с несогласованным обходом.
### Адаптивное управление кэшем
Оптимальная конфигурация кэша для приложения GPU может значительно различаться в зависимости от его моделей доступа к памяти, размера рабочего набора и требований к ресурсам. Статические политики управления кэшем, которые фиксируются на этапе проектирования, могут не адаптироваться к разнообразному и динамическому поведению различных приложений.
Исследования в этой области изучают методы динамической адаптации конфигурации кэша и политик управления в зависимости от поведения приложения в реальном времени.
Например, Ван и др. [2016] предлагают схему адаптивного управления кэшем для GPU, которая динамически регулирует размеры разделов кэша и политики замещения в зависимости от моделей доступа к памяти приложения. Схема использует комбинацию аппаратных и программных методов для мониторинга поведения кэша и динамической настройки для улучшения использования кэша и производительности.
Другим примером является работа Дай и др. [2018], которая предлагает подход на основе машинного обучения для адаптивного управления кэшем в GPU. Авторы используют обучение с подкреплением для автоматического изучения оптимальной конфигурации кэша для каждого приложения на основе его поведения в реальном времени. Изученные политики затем реализуются с использованием масштабируемой архитектуры кэша, которая может адаптироваться к конкретным потребностям каждого приложения.
### Приоритизация кэша
В GPU различные типыВот перевод на русский язык:
Запросы к памяти, такие как загрузка, сохранение и текстурные запросы, могут иметь различные требования к латентности и пропускной способности. Расстановка приоритетов для определенных типов запросов по сравнению с другими может помочь улучшить общую производительность системы и использование ресурсов.
Исследования в этой области изучают методы расстановки приоритетов для различных типов запросов к памяти в иерархии кэша GPU.
Например, Zhao et al. [2018] предлагают схему расстановки приоритетов в кэше для GPU, которая назначает различные приоритеты разным типам запросов к памяти на основе их критичности и чувствительности к латентности. Схема использует комбинацию статической и динамической информации, такой как тип инструкции и количество зависимых инструкций, для определения приоритета каждого запроса. Авторы показывают, что их схема может значительно улучшить производительность и энергоэффективность по сравнению с базовым GPU без расстановки приоритетов.
### Размещение страниц виртуальной памяти
Традиционно GPU полагались на ручное управление памятью, где программист отвечает за явное выделение и освобождение памяти. Однако в последнее время GPU начали поддерживать виртуальную память, что позволяет операционной системе автоматически управлять выделением и размещением памяти.
Исследования в этой области изучают методы оптимизации размещения страниц виртуальной памяти в GPU для улучшения локальности доступа к памяти и снижения накладных расходов на перевод адресов.
Например, Zheng et al. [2016] предлагают схему размещения страниц для GPU, которая направлена на улучшение локальности доступа к памяти путем размещения страниц, часто используемых вместе, в одном канале или банке памяти. Схема использует комбинацию аппаратных и программных методов для мониторинга моделей доступа к памяти приложения и принятия динамических решений о размещении страниц.
Другим примером является работа Ganguly et al. [2019], которая предлагает схему управления виртуальной памятью для GPU, направленную на снижение накладных расходов на перевод адресов. Схема использует комбинацию аппаратных и программных методов.Вот перевод на русский язык:
, такие как буферизация трансляции адресов (TLB) и сжатие таблицы страниц, для снижения задержки и перегрузки полосы пропускания при трансляции адресов.
### Размещение данных
Размещение данных в иерархии памяти GPU может оказывать значительное влияние на локальность доступа к памяти и производительность. Оптимизация размещения данных может помочь снизить задержку доступа к памяти, улучшить использование кэша и увеличить использование пропускной способности памяти.
Исследования в этой области изучают методы оптимизации размещения данных в GPU на основе моделей доступа к памяти и требований к ресурсам приложения.
Например, Agarwal и др. [2015] предлагают схему размещения данных для GPU, целью которой является улучшение локальности доступа к памяти путем размещения часто используемых вместе данных в одном канале или банке памяти. Схема использует комбинацию статического и динамического анализа для определения оптимального размещения данных для каждого приложения.
Другим примером является работа Tang и др. [2017], которая предлагает схему размещения данных для GPU, направленную на улучшение использования пропускной способности памяти путем размещения данных в разных каналах памяти в зависимости от их моделей доступа. Схема использует основанный на машинном обучении подход для прогнозирования моделей доступа к памяти приложения и принятия динамических решений о размещении данных.
### Многокристальные модульные GPU
По мере роста требований к производительности и энергопотреблению GPU традиционные одночиповые конструкции могут не справляться с этими задачами. Многокристальные модульные (MCM) конструкции, в которых несколько чипов GPU интегрированы в один корпус, стали перспективным решением этой проблемы.
Исследования в этой области изучают проектирование и оптимизацию MCM GPU, включая архитектуру системы памяти, дизайн межсоединений и управление ресурсами.
Например, Arunkumar и др. [2017] предлагают конструкцию MCM GPU, использующую высокоскоростной, низкозадержечный межсоединитель для связи нескольких чипов GPU. Авторы также предлагают архитектуру системы памяти, котораяВот перевод на русский язык с сохранением оригинального кода:
Использование увеличенной пропускной способности и емкости конструкции MCM для улучшения производительности и энергоэффективности.
Другим примером является работа Milic et al. [2018], в которой предлагается схема управления ресурсами для MCM GPU, направленная на повышение эффективности использования ресурсов и снижение накладных расходов на межчиповую связь. Схема использует сочетание аппаратных и программных методов для мониторинга использования ресурсов и моделей связи приложения, а также для принятия динамических решений по распределению ресурсов.
## Заключение
Система памяти является критически важным компонентом современных архитектур GPU, и ее конструкция и оптимизация могут оказывать значительное влияние на общую производительность и эффективность системы. По мере роста требований параллельных рабочих нагрузок исследователи изучают широкий спектр методик для улучшения производительности, масштабируемости и адаптивности систем памяти GPU.
Некоторые ключевые направления исследований в этой области включают планирование доступа к памяти и проектирование межсоединений, эффективность кэширования, приоритезацию запросов к памяти и обход кэша, использование гетерогенности между потоками, согласованный обход кэша, адаптивное управление кэшем, приоритезацию кэша, размещение страниц виртуальной памяти, размещение данных и конструкции многочиповых модулей.
Исследуя эти и другие методики, ученые стремятся разработать системы памяти GPU, которые могут справляться с растущими требованиями параллельных рабочих нагрузок, сохраняя при этом высокую производительность и энергоэффективность. Поскольку GPU продолжают развиваться и находить новые применения в таких областях, как машинное обучение, научные вычисления и аналитика данных, проектирование и оптимизация их систем памяти останутся важной областью исследований и инноваций.