Вычислительная архитектура Nvidia Ampere и графический процессор A100: изучаем теоретические возможности, не связанные с играми
Каждую весну компания Nvidia собирает GPU Technology Conference — большую конференцию с несколькими тысячами участников, посвященную аспектам применения графических процессоров в различных сферах. Основная часть конференции проходит в калифорнийском городе Сан-Хосе, и чаще всего именно на ней глава компании Дженсен Хуанг представляет новые архитектуры. Наш сайт по возможности старается не пропускать эти мероприятия, публикует новости с них и большие отчетные статьи. В новостях про Ampere и A100 мы уже вкратце рассказывали, настало время более подробного материала.
По понятным причинам мартовская конференция в этом году была отменена, и ее формат был переведен в цифровой. Конечно же, это довольно серьезно повлияло и на анонсы Nvidia. Сначала программное выступление главы было отменено вовсе, вроде как, но в мае он все-таки решил выступить перед сообществом, представив несколько новых продуктов, технологий и идей. Главными из которых являются новая архитектура Ampere и первый вычислительный процессор A100 на ее основе. Сегодня мы расскажем обо всех их особенностях подробно настолько, насколько это возможно на данный момент.
Вычислительные решения Nvidia уже много лет используются в весьма требовательных к производительности сферах, таких как глубокое обучение, анализ данных, научные вычисления, анализ видеоданных, облачные сервисы и многих других. Именно решения этой компании предоставляют необходимые возможности по ускорению большого количества вычислительных задач с параллельной обработкой огромных массивов данных, которыми заняты современные серверы.
Nvidia является одним из лидеров в деле освоения задач искусственного интеллекта, они предлагают вычислительные платформы, дающие многократный прирост в приложениях, использующих нейронные сети. Также их процессоры обеспечивают отличную скорость и в более традиционных высокопроизводительных вычислениях и при анализе больших объемов данных. Важно, что вычислительная платформа Nvidia универсальна, решения предлагаются в различных вариантах, от миниатюрных изделий для небольших роботов до мощнейших суперкомпьютеров.
В уже довольно далеком 2017 вышел ускоритель Tesla V100 с новым типом вычислительных блоков — тензорными ядрами, которые позволили в разы увеличить производительность матричных вычислений в задачах глубокого обучения, использующих мощь нейросетей. Через год вышла Tesla T4 на основе архитектуры Turing с тензорными ядрами и различными улучшениями эффективности. Тензорные ядра затем появились и в массовых решениях линейки GeForce на основе этой же архитектуры, и они позволили раскрыть некоторые возможности ИИ, вроде метода повышения производительности 3D-рендеринга под названием DLSS, который использует способности тензорных ядер.
Но сегодня мы говорим не об играх, а о куда более серьезных применениях GPU. Мощные вычислительные решения компании показали отличные результаты в индустриальных тестах производительности и были хорошо приняты рынком, да и пользовательские продукты и решения для автопилотируемых автомобилей и роботов также завоевали определенный успех. Немалая его доля была достигнута и за счет программного обеспечения — весьма удачной платформы для разработки CUDA, включающей API, библиотеки, программные стеки и оптимизаторы — все это и помогло раскрыть возможности аппаратных решений Nvidia, которые выпускаются несколько лет подряд. Этой весной пришло время обновить архитектуру и выпустить новый ускоритель вычислений — A100.
Графический процессор Nvidia A100 Tensor Core
Для начала, давайте сразу разберемся с названиями, а то многих слегка запутали схожие названия, относящиеся к несколько разным вещам. GA100 — это внутреннее кодовое имя чипа, а A100 — наименование первого решения компании на основе этого чипа (аналогично GV100 и V100 для Volta). Это важно в том числе и потому, что технические характеристики полного чипа и решений на его основе могут отличаться. В частности, у A100 некоторые из исполнительных блоков неактивны, о чем мы подробно расскажем далее. А ведь есть еще и DGX A100 — уже готовая система Nvidia на базе одноименного процессора. Вот такая путаница.
Итак, вычислительный процессор «A100 Tensor Core» (полное название показывает важность тензорных ядер, но мы его сократим до A100) основан на новой архитектуре Ampere, и, по сравнению с аналогом из предыдущего поколения в виде Tesla V100, добавляет немало новых возможностей и обеспечивает более высокую производительность в различных типах вычислительных задач — ИИ, при анализе данных, в высокопроизводительных вычислениях и многих других задачах.
Также A100 обеспечивает гибкое масштабирование для вычислительных задач в составе рабочих станций с одним или несколькими GPU, в серверах, кластерах, облачных центрах обработки данных, суперкомпьютерах и т. д. Новый графический процессор позволяет создавать масштабируемые и универсальные высокопроизводительные центры обработки данных с разным количеством GPU, от одного до сотен штук.

Новый SXM4-модуль с A100
Чип GA100 производится на тайваньской фабрике TSMC по новому для компании Nvidia техпроцессу N7 — они впервые используют 7 нм для производства своих GPU. Да и вообще, такой большой и сравнительно массовый чип на основе этого техпроцесса компания TSMC выпускает впервые — GA100 включает 54,2 млрд транзисторов и имеет площадь кристалла в 826 мм² (физические размеры чипа составляют порядка 26×32 мм). По словам главы компании Nvidia, они выжали максимум возможного из этого техпроцесса, и в это довольно легко поверить, глядя на характеристики нового GPU.
Кратко перечислим главные особенности A100. Во-первых, в нем применяется уже третье поколение тензорных ядер, которые были серьезно модифицированы, по сравнению с аналогичными исполнительными устройствами V100. Они стали более гибкими и производительными, а также получили некоторые нововведения, предназначенные для упрощения их использования разработчиками. Одним из самых важных изменений стал новый формат вычислений TensorFloat-32 (TF32) для задач ИИ, который способен повысить скорость таких вычислений до 10-20 раз для формата FP32 в уже существующих задачах — при этом, изменения кода не требуется.
Также тензорные ядра A100 поддерживают и формат вычислений FP64 (IEEE-совместимый), что повышает скорость работы в высокопроизводительных вычислениях до 2,5 раз по сравнению с Volta. Такой же прирост скорости новинка обеспечивает и для операций смешанной точности FP16/FP32 по сравнению с V100 — для этого пригодится еще один новый тип операций — Bfloat16 (BF16), который обсчитывается на той же скорости, что и операции со смешанной точностью FP16/FP32. Что касается ускорения INT8, INT4 и бинарных операций при инференсе в задачах глубокого обучения, то преимущество A100 в них может достигать 10-20 раз, а то и больше.
Для наглядности приведем таблицу возможностей A100 и V100 по вычислениям в основных форматах и на различных исполнительных блоках, которые используются в высокопроизводительных вычислениях и задачах ИИ (уточнение TC означает использование возможностей тензорных ядер). Все значения даны с учетом турбо-частоты GPU (1410 МГц), а значения в скобках — эффективная производительность с учетом разреженности данных, о которой написано далее.
| Пиковая производительность | V100 | A100 | Ускорение |
|---|---|---|---|
| A100 FP16 против V100 FP16 | 31,4 тфлопс | 78 тфлопс | 2,5× |
| A100 FP16 TC против V100 FP16 TC | 125 тфлопс | 312 (624) тфлопс | 2,5× (5×) |
| A100 BF16 TC против V100 FP16 TC | 125 тфлопс | 312 (624) тфлопс | 2,5× (5×) |
| A100 FP32 против V100 FP32 | 15,7 тфлопс | 19,5 тфлопс | 1,25× |
| A100 TF32 TC против V100 FP32 | 15,7 тфлопс | 156 (312) тфлопс | 10× (20×) |
| A100 FP64 против V100 FP64 | 7,8 тфлопс | 9,7 тфлопс | 1,25× |
| A100 FP64 TC против V100 FP64 | 7,8 тфлопс | 19,5 тфлопс | 2,5× |
| A100 INT8 TC против V100 INT8 | 62 TOPS | 624 (1248) TOPS | 10× (20×) |
Но это лишь пиковые теоретические цифры, вряд ли достижимые на практике. Давайте посмотрим на то, что получается в конкретных задачах. По данным самой компании Nvidia, графический процессор A100 обеспечивает увеличение производительности над V100 в реальных задачах по тренировке и инференсу ИИ, и преимущество новинки в них достигает нескольких раз.

На диаграмме сравнивается скорость аналогичных 8-процессорных решений на основе вычислительных процессоров A100 и V100 в сценариях глубокого обучения BERT. При обучении нейросети, преимущество A100 составляет от 3 раз для FP16-точности до 6 раз для FP32 (на A100 автоматически используется формат TF32), а при инференсе A100 уже в 7 раз быстрее, так как позволяет запускать на одном чипе сразу семь виртуальных GPU, каждый со скоростью одного V100, чего вполне достаточно для этой нагрузки.
Понятно, что такие условия специально подобраны для того, чтобы показать новые возможности A100, да еще и используются несколько разные форматы вычислений, но и преимущество получилось очень большим. А что мы увидим в задачах высокопроизводительных вычислений, в которых новый GPU даже по теории должен быть мощнее лишь в пару-тройку раз от силы?

Судя по данным Nvidia, сразу в нескольких подобных задачах новый A100 показывает приличное ускорение, по сравнению с Tesla V100 — преимущество новинки в основном составляет 1,5-2 раза. Конечно, это заметно меньше, чем 6-7 раз в сфере ИИ, но ведь упор в случае Ampere делался в основном на тензорные операции. А для HPC-задач ускорение вдвое при даже меньшей теоретической разнице в пиковом темпе FP64-вычислений (если не брать возможности тензорных ядер), выглядит неплохо. Наверняка также сказываются и многочисленные оптимизации подсистемы памяти и кэширования. Обо всем этом мы сейчас и поговорим подробнее.
Архитектурные новшества Ampere
Все современные графические процессоры Nvidia состоят из укрупненных блоков — потоковых мультипроцессоров (streaming multiprocessor — SM), и архитектура Ampere и чип GA100 — не исключение. Как и более ранние графические процессоры компании Nvidia, новый чип состоит из нескольких кластеров GPU processing cluster (GPC), которые содержат кластеры текстурной обработки (TPC — texture processing cluster), а те, в свою очередь, составлены уже из потоковых мультипроцессоров (SM — streaming multiprocessor). Также в состав чипа входят контроллеры памяти (в случае GA100 — HBM2-памяти), кэш-память второго уровня и управляющая логика.
Полная модификация чипа GA100 включает 8 GPC из 8 TPC каждый, по два SM на каждый TPC — то есть 128 мультипроцессоров всего. Каждый мультипроцессор состоит из 64 CUDA-ядер для FP32-вычислений, и общее их количество на чип составляет 8192 штуки. Каждый мультипроцессор также имеет по четыре тензорных ядра, что дает в результате 512 тензорных ядер на GPU. Что касается видеопамяти, то на чипе может быть установлено до 6 стеков HBM2-памяти, которую обслуживают 12 контроллеров с шириной шины по 512 бит каждый.

Схема полной версии чипа GA100
А теперь внимание: в отличие от полной версии GA100, в конкретной модели A100, которая была анонсирована недавно, было отключено несколько исполнительных блоков. В частности, неактивен один из кластеров GPC, также может быть 7 или 8 разблокированных текстурных кластера на каждый GPC. То есть в целом эта версия чипа содержит лишь 108 мультипроцессоров SM с общим количество CUDA-ядер в 6912 штуки и 432 тензорными ядрами. Память тоже немного порезали — до пяти стеков HBM2-памяти и десятка 512-битных контроллеров.
Изменения в мультипроцессорах
Новый мультипроцессор архитектуры Ampere хоть и основан на том, что мы уже видели в Volta и Turing, но в него добавлены несколько новых возможностей. Так, если мультипроцессоры прошлых двух поколений имеют по восемь тензорных ядер на SM, и каждое из них умеет исполнять 64 FMA-операции смешанной точности (FP16/FP32) за такт. А мультипроцессоры в GA100 имеют улучшенные тензорные ядра третьего поколения, которые исполняют по 256 FMA-операций FP16/FP32 за такт, поэтому вполне достаточно и четырех таких ядер на каждый SM, ведь общие вычислительные возможности GA100 даже в таком случае выросли вдвое, по сравнению с Volta и Turing — с 512 до 1024 операций с точностью FP16/FP32 за такт.
Ключевые возможности мультипроцессоров Ampere:
- Тензорные ядра третьего поколения
- Ускорение всех типов данных, включая форматы FP16, BF16, TF32, FP64, INT8, INT4 и бинарного
- Новая возможность, использующая разреженность нейросетей, удваивающая производительность стандартных тензорных операций
- TF32-операции, обеспечивающие простой метод ускорения вычислений над данными формата FP32 в нейросетях и высокопроизводительных вычислениях, исполняющиеся в 10 раз быстрее, чем FP32 FMA-операции на V100, и в 20 раз быстрее, если используется разреженность матриц
- Операции со смешанной точностью FP16/FP32 для глубокого обучения, работающие в 2,5 раза быстрее, чем на V100 (и в 5 раз быстрее при использовании разреженности)
- Операции со смешанной точностью BF16/FP32, работающие с той же производительностью, что и FP16/FP32-операции
- Тензорные FP64-операции двойной точности, предназначенные для высокопроизводительных вычислений и выполняющиеся в 2,5 раза быстрее, чем FP64 DFMA-операции на V100
- INT8-операции с использованием разреженности с высочайшей производительностью, используемые для задач референса при глубоком обучении, работающие в 20 раз быстрее, чем аналогичные операции на V100
- Увеличенный объем в 192 КБ комбинированной общей памяти и L1-кэша для данных, что в полтора раза больше, чем у GV100
- Новая инструкция асинхронного копирования, загружающая данные напрямую из глобальной памяти в разделяемую, с возможностью обойти L1-кэш без необходимости использования регистрового файла
- Асинхронные барьеры на основе разделяемой памяти для использования с инструкцией асинхронного копирования
- Новые инструкции для управления процессом кэширования данных в кэш-памяти второго уровня
- Множество улучшений, предназначенных для снижения сложности программирования GPU

Потоковый мультипроцессор GA100
Кроме разного количества блоков и описанной выше разницы в объеме L1-кэша и общей памяти, на схеме мультипроцессора все выглядит довольно знакомо. Единственное, что наметанный взгляд постоянного читателя нашего раздела может заметить, так это то, что на диаграмме нет RT-ядер, которые были в Turing. Все верно, аппаратной поддержки трассировки в GA100 нет. Но это неудивительно, ведь эта модель GPU — чисто вычислительный процессор, которому RT-ядра просто не нужны. Как и блок кодирования видеоданных NVEnc, например, и разъемы вывода информации на дисплеи. Все это обязательно появится далее в игровых решениях семейства GeForce и профессиональных графических видеокартах Quadro.
На следующей схеме показана разница в темпе исполнения стандартных операций над данными различных типов на процессорах V100 и A100: FP16, FP32 против TF32, FP64 и INT8, соответственно. Естественно, больше всего выросла производительность в тех случаях, когда вместо основных исполнительных блоков V100 вычисления проводятся при помощи тензорных блоков A100, которые получили расширенную поддержку разных форматов, да еще и с учетом возможности использования разреженности матриц на A100.

В случае с FP16-форматом у V100 показано два столбца тензорных ядер, так как каждый мультипроцессор этого GPU содержит по два тензорных ядра, а у A100 он всего один. Но все равно, с учетом разреженности, прирост скорости на Ampere достигает 5 раз в пике, а без разреженности — 2,5 раза, что тоже совсем неплохо.
Рассмотрим новый формат вычислений TensorFloat-32 (TF32) — он обеспечивает ускорение операций над данными в FP32-формате в задачах глубокого обучения хитрым образом. Для удобства числа с плавающей запятой представляются в экспоненциальной записи — к примеру, для формата FP32 один бит отводится на знак числа, 8 бит уходит на порядок (экспоненту), который определяет максимально возможный диапазон чисел, а оставшиеся 23 бита — на мантиссу, обеспечивающую точность вычислений.
Для FP16-формата меньше и порядок (лишь 5 бит) и точность (10 бит). Такие вычисления в современных GPU производятся значительно быстрее, но зачастую разработчикам в задачах глубокого обучения хватает и той точности, которая обеспечивается 10-битной мантиссой, но бывает недостаточно диапазона значений, который могут дать 5 бит в FP16-формате.
Поэтому сейчас большинство задач ИИ для обучения используют формат FP32, который не ускоряется на тензорных ядрах, и Nvidia вышла из положения хитрым образом, представив новый 32-битный формат вычислений TF32, обеспечивающий диапазон значений FP32 при точности FP16: 8-битная экспонента и 10-битная мантисса. Но самое главное — такие вычисления проводятся над FP32-значениями на входе, да и на выход подается именно FP32, и накопление данных при этом производится в формате FP32, так что точность не теряется.

Архитектура Ampere использует TF32-вычисления при использовании тензорных ядер над данными формата FP32 по умолчанию, пользователю не нужно ничего делать для этого, он получит ускорение автоматически. А вот не тензорные операции будут использовать обычные FP32-блоки. Но на выходе в обоих случаях — стандартный IEEE FP32-формат. Автоматическое использование смешанной точности BF16 позволяет еще вдвое повысить производительность, по сравнению с TF32, но для этого понадобится поменять пару строк кода.
То есть для процесса обучения нейросетей у разработчика при использовании A100 есть два высокопроизводительных варианта:
- (По умолчанию) Используются тензорные ядра TF32, ничего изменять в пользовательских скриптах для этого не нужно. Такой подход позволяет получить восьмикратное ускорение по отношению к FP32 на GA100 и до 10-кратного преимущества над GV100.
- Для максимальной скорости тренировки нейросетей нужно использовать FP16 или формат со смешанной точностью BF16, который дает двойное ускорение по сравнению с TF32, и до 16-кратного по сравнению с FP32. Если же сравнивать с Volta, то новый GA100 будет до 20 раз быстрее в таких условиях.

Мы говорили о теоретических пиковых показателях, но на диаграмме выше можно оценить примерную производительность тензорных вычислений при перемножении матриц разных размеров по данным компании Nvidia. Как видите, использование новых типов тензорных операций над матрицами на A100 позволяет увеличить производительность вычислений в несколько раз. И это уже не теоретическая, а практическая производительность.
Ускорение высокопроизводительных вычислений на тензорных ядрах
Кроме задач искусственного интеллекта, не менее важными являются высокопроизводительные вычисления (HPC), и потребность в высокой скорости в таких системах растет огромными темпами. Такие вычисления используются большим количеством научных приложений, которые предпочитают формат двойной точности FP64 — именно по причине его высокой точности, простите за тавтологию.
Для того, чтобы улучшить характеристики A100 в этом плане, в Nvidia решили обеспечить новый графический процессор A100 возможностью исполнения таких операций и на тензорных ядрах, а не только основных. И A100 теперь поддерживает ускорение вычисления в IEEE-совместимом формате FP64 на тензорных ядрах, обеспечивая пиковую производительность в 2,5 раза выше, чему Tesla V100. Новая инструкция для совмещенного умножения-сложения матриц с двойной точностью у A100 заменяет сразу восемь DFMA-инструкций на V100, что сокращает количество выборок команд и чтение из регистров, снижает накладные расходы и требования к пропускной способности разделяемой памяти.
Каждый мультипроцессор SM умеет вычислять 64 такие FMA-операции с точностью FP64 за один такт (то есть всего 128 FP64-операций за такт), что вдвое больше, чем у Tesla V100. И 108 активных мультипроцессоров в составе A100 обеспечивают пиковую производительность для FP64 в 19,5 терафлопс, что в 2,5 раза больше, чем может V100. Причем, почти такой же прирост уже можно получить и в реальности — в cuBLAS DGEMM, умеющем использовать новые возможности A100.

Приведем сводную сравнительную таблицу характеристик процессоров A100, V100 и P100, а также сравнение их пиковой теоретической производительности для разных типов данных и операций. В следующей таблице показаны отличия между GPU производства Nvidia трех разных поколений, с учетом их турбо-частот. В скобках указаны данные пиковой производительности A100 с учетом разреженности матриц, о которой написано в следующем разделе нашего материала.
| Модель GPU | P100 | V100 | A100 |
|---|---|---|---|
| Кодовое имя | GP100 | GV100 | GA100 |
| Архитектура | Pascal | Volta | Ampere |
| Техпроцесс, нм | 16 | 12 | 7 |
| Кол-во транзисторов, млрд | 15,3 | 21,1 | 54,2 |
| Площадь кристалла, мм² | 610 | 815 | 826 |
| Потребление энергии, Вт | 300 | 300 | 400 |
| Кол-во мультипроцессоров | 56 | 80 | 108 |
| Кол-во кластеров TPC | 28 | 40 | 54 |
| Кол-во FP32-ядер | 3584 | 5120 | 6912 |
| Кол-во FP64-ядер | 1792 | 2560 | 3456 |
| Кол-во INT32-ядер | — | 5120 | 6912 |
| Кол-во тензорных ядер | — | 640 | 432 |
| Турбо-частота, МГц | 1480 | 1530 | 1410 |
| Производительность тензорных FP16, терафлопс | — | 125 | 312 (624) |
| Производительность тензорных BF16, терафлопс | — | — | 312 (624) |
| Производительность тензорных TF16, терафлопс | — | — | 156 (312) |
| Производительность тензорных FP64, терафлопс | — | — | 19,5 |
| Производительность тензорных INT8, топс | — | — | 624 (1248) |
| Производительность тензорных INT4, топс | — | — | 1248 (2496) |
| Производительность FP16, терафлопс | 21,2 | 31,4 | 78 |
| Производительность BF16, терафлопс | — | — | 39 |
| Производительность FP32, терафлопс | 10,6 | 15,7 | 19,5 |
| Производительность FP64, терафлопс | 5,3 | 7,8 | 9,7 |
| Производительность INT32, топс | — | 15,7 | 19,5 |
| Кол-во текстурных модулей | 224 | 320 | 432 |
| Ширина HBM2-памяти, бит | 4096 | 4096 | 5120 |
| Объем памяти, ГБ | 16 | 16/32 | 40 |
| Частота памяти, МГц | 703 | 877,5 | 1215 |
| Пропускная способность памяти, ГБ/с | 720 | 900 | 1555 |
| Объем L2-кэша, МБ | 4 | 6 | 40 |
| Объем разделяемой памяти на SM, КБ | 64 | До 96 | До 164 |
| Объем регистрового файла, КБ | 14336 | 20480 | 27648 |
Хорошо видно, что с каждым поколением Nvidia не только тупо ускоряла математическую производительность исполнительных блоков GPU и увеличивала кэши, но и внедряла все более широкие возможности по исполнению специфических вычислений с повышенной производительностью, а также улучшала общую эффективность своих процессоров. В особенности это касается различных типов вычислений на тензорных блоках, но не только их. Увы, и без минусов не обошлось — потребление энергии новым GPU выросло с 300 до 400 Вт, и это — при отключенной части чипа. Похоже, что высокое потребление энергии является одним из его недостатков.
Использование разреженных матриц
В A100 также внедрили новую технологию структурированной разреженности (Structured Sparsity), которая помогает удвоить производительность вычислений над матрицами, используя разреженность данных. Разреженная матрица — это матрица с преимущественно нулевыми элементами в ней, и подобные матрицы довольно часто встречаются в приложениях, связанных с использованием ИИ.
Так как нейросети способны адаптировать весовые коэффициенты в процессе обучения на основе его результатов, то подобное структурное ограничение не особенно влияет на точность обученной сети для инференса, что позволяет выполнять его с разреженностью. Чтобы получить повышение производительности, нужно использовать разреженность на ранних этапах обучения, и подобное ускорение без потерь в точности является предметом для дальнейших исследований.
Структура использует определение разреженной матрицы в виде 2:4, которая допускает два ненулевых значения в каждом векторе с четырьмя входными значениями. A100 поддерживает структурированную разреженность 2:4 построчно, как показано на схеме. Благодаря четкой структуре матрицы, ее можно эффективно сжать, сократив требуемый объем памяти и пропускную способность почти вдвое.

В Nvidia разработали универсальный метод прореживания нейросетей для инференса, используя структурированный шаблон разреженности 2:4. Сначала сеть обучается с использованием плотных весов, затем применяется мелкозернистое структурированное прореживание, а оставшиеся ненулевые веса корректируются на дополнительных этапах обучения. Такой метод вроде бы не приводит к значительной потере точности инференса на примере десятков проверенных специалистами компании нейросетей, включая задачи машинного зрения, определения объектов, сегментацию, перевод с одного языка на другой и т. д.
Чтобы все это работало, графический процессор A100 поддерживает новые инструкции Sparse Tensor Core, пропускающие вычисления для записей с нулевыми значениями, что и приводит к удвоению производительности вычислений, использующих разреженность матриц.
Одновременное исполнение операций FP32 и INT32
Как и все решения семейств Volta и Turing, новый GPU архитектуры Ampere A100 содержит отдельные вычислительные ядра FP32 и INT32, что позволяет одновременно исполнять соответствующие виды операций каждый такт, что увеличивает скорость выдачи команд. Мы уже неоднократно останавливались на этой возможности, которая помогает повысить производительность в некоторых задачах. Многие приложения содержат циклы, выполняющие вычисления целочисленных адресов памяти в сочетании с вычислениями с плавающей запятой, вот они и получат преимущество от одновременного исполнения операций FP32 и INT32.
Подсистема памяти и кэширования
Повышение производительности мультипроцессоров не имеет смысла без соответствующей поддержки со стороны подсистемы памяти и ее кэширования. Если просто повысить возможности исполнительных блоков, то «прокормить» их данными без увеличения пропускной способности и снижения задержек просто не получится, и роста производительности не произойдет.
Кэш-память первого уровня, объединенная с разделяемой памятью, была впервые представлена в Tesla V100, и это архитектурное решение значительно повысило производительность во многих задачах, а также упростило программирование, снизив необходимость в кропотливой оптимизации для того, чтобы добиться близкой к пиковой производительности. В A100 в полтора раза увеличили объем объединенного блока L1-кэша и общей памяти, по сравнению с их объемом в V100 — 192 КБ против 128 КБ на каждый мультипроцессор. Во многих задачах высокопроизводительных вычислений и ИИ одно это изменение дает приличный прирост производительности.
Так как требовательность высокопроизводительных вычислений, аналитики и задач ИИ к пропускной способности памяти и ее объему постоянно растут, то в Tesla P100 впервые внедрили HBM2-память, работающую с очень высокой пропускной способностью, а в Tesla V100 улучшили ее реализацию. Напомним, что тип памяти HBM2 отличается тем, что стеки чипов памяти расположены прямо на той же упаковке вместе с кристаллом графического процессора, что как раз и обеспечивает рост пропускной способности, а также снижение потребления и требуемой площади, по сравнению с традиционными типами памяти вроде GDDR5/GDDR6. Кроме роста ПСП, это решение также позволяет установить в серверы большее количество GPU.
Неудивительно, что и продукт на архитектуре Ampere получил определенные улучшения в этом плане. Новый графический процессор GA100 несет на себе 48 ГБ оперативной памяти типа HBM2 в виде шести стеков по 8 кристаллов, которые присоединены к GPU при помощи 12 контроллеров памяти с общей шириной шины в 6144-бит. Но конкретно модификация A100 слегка урезана и по возможностям памяти — в ней отключена пара контроллеров памяти и один стек HBM2, поэтому активными остались лишь пять стеков. Соответственно, общий объем памяти в новом решении сократился до 40 ГБ, а ширина шины до 5120 бит. И так как память в A100 работает на частоте 1215 МГц (DDR), то это обеспечивает пропускную способность памяти в 1,555 ТБ/с, что более чем в 1,7 раза выше пропускной способности памяти у V100.

Уточним, что мы говорим о конкретном решении A100, а у полного чипа GA100 видеопамяти установлено 48 ГБ — как понятно по фотографии чипа, они составлены шестью стеками. В случае A100 один из них отключен вместе с соответствующими контроллерами памяти. Интересно, что не участвующий в работе стек памяти полностью работоспособен, он просто отключен. Возможно, не ставить его на упаковку вовсе получается чуть ли не затратнее, чем просто отсоединить.
Вполне возможно, что со временем компания Nvidia выпустит и более мощное решение на основе полноценного GA100. Вероятнее всего, сейчас они упираются в высокое энергопотребление и тепловыделение A100, достигающее 400 Вт. К слову, количество памяти в 40 ГБ и не слишком сильно смотрится на фоне 32 ГБ у последней модификации V100, ведь все остальные характеристики чипа увеличили в два и более раз.
Подсистема памяти A100 HBM2 поддерживает исправление ошибок ECC с исправлением одиночной ошибки (single-error correcting double-error detection — SECDED) для защиты данных. ECC обеспечивает более высокую надежность для вычислений, чувствительных к повреждению данных, что важно в масштабных многокластерных вычислительных средах, в которых GPU обрабатывают большие объемы данных на протяжении длительного времени. В A100 также защищены SECDED ECC и другие структуры памяти — кэш-память первого и второго уровней, а также регистровые файлы в мультипроцессорах.
Еще более важными являются изменения в кэш-памяти второго уровня, которые можно назвать чуть ли не революционными! Графический процессор GA100 содержит 48 МБ кэш-памяти второго уровня, а модификация A100 лишена его 1/6 части, поэтому активным объемом является 40 МБ, что в 6,7 раз больше, чем у V100 — и это очень большой прирост! Такой объем кэша позволит заметно реже лазить в разы более медленную видеопамять, и это увеличит производительность во многих вычислительных задачах.
Инженеры Nvidia пришли к такому объему опытным путем — проверяя, что дают разные объемы кэша в имитации различных типов вычислений. Ну и новый техпроцесс позволил им добавить много L2-кэша, оставаясь в рамках определенного размера кристалла, конечно же. Возможно, эти лишние транзисторы также пригодились и для того, чтобы сделать кристалл физически большего размера — для более эффективного отвода тепла от него.
Но мы отвлеклись, а ведь интересное в этом разделе только начинается. Если вы обратите внимание на диаграмму чипа или фото его ядра, то заметите новую структуру разделенного кэша с кроссбаром. L2-кэш в GA100 разделен на два раздела — для того, чтобы обеспечить более широкую полосу пропускания и снизить задержки доступа к памяти для каждой половины мультипроцессоров. Каждый из двух разделов L2-кэша локализует и кэширует данные для доступа к памяти от мультипроцессоров в тех кластерах GPC, которые напрямую подключены именно к этому разделу.
Такая структура позволила увеличить пропускную способность L2-кэша в 2,3 раза по сравнению с V100. Специалистам Nvidia пришлось так сделать, так как аналогичное V100 решение кэширования второго уровня попросту было бы неспособно прокормить данными увеличенное количество более мощных мультипроцессоров конфигурации Ampere, ведь их требования превышают возможности L2-кэша Volta в 1,3-2,5 раза, как видно по прикидкам:

На схеме показано, что гипотетический V100 с улучшенными до уровня A100 тензорными ядрами не смог бы получить достаточное количество данных из кэш-памяти. Правда, с разделенным L2 в редких случаях задержки могут и увеличиться, если какому-то мультипроцессору вдруг понадобятся данные из другого раздела. Но это лишь в теории. Когерентность кэша на аппаратном уровне поддерживается моделью программирования CUDA, и приложения автоматически будут использовать преимущества новой организации L2-кэша.
Существенное увеличение объема L2-кэша в GA100 значительно повышает производительность многих алгоритмов высокопроизводительных вычислений и задач ИИ, так как это позволяет кэшировать большие части наборов данных и моделей, получая доступ к ним с гораздо большей скоростью и меньшими задержками, по сравнению с чтением и записью в память HBM2. Некоторые рабочие нагрузки, ограниченные именно ПСП, вроде нейросетей с небольшим размером пакетов, больше других выиграют от увеличенного объема L2-кэша, и разница в скорости будет многократной.
А чтобы оптимизировать использование столь немалого объема кэш-памяти, в архитектуре Ampere появилась возможность управления процессом кэширования данных в L2-кэше. A100 предоставляет новые элементы управления L2-кэшем для указания данных, которые нужно хранить в кэш-памяти. Так, в A100 можно прямо выделить часть L2-кэша (максимум до 30 МБ) для постоянного сохранения некоторых данных.

Например, для задач глубокого обучения, пинг-понг буферы можно постоянно закэшировать в L2-кэше для максимально быстрого доступа к этим данным, как и для предотвращения их обратной записи в HBM2-память. И для реализации модели «поставщик-потребитель» при обучении нейросетей, при помощи управления L2-кэшем также можно оптимизировать процесс кэширования, как и во многих других задачах. Увеличение производительности в некоторых из применений добавляет к уже и так неплохим результатам A100 по сравнению с V100, еще и дополнительный весомый прирост.

Но и это еще не все изменения в подсистеме памяти архитектуры Ampere. Также была добавлена возможность сжатия данных, находящихся в L2-кэше и локальной памяти GPU. Nvidia не делится конкретным алгоритмом, но это довольно простой метод сжатия без потерь, когда сжимаются данные с нулями или одинаковыми значениями. Берутся две соседние строки L1-кэша — 8 блоков по 32 байта, в них ищутся одинаковые байты. Если таких байтов достаточно много, то один или несколько из 32-байтных блоков в L2/глобальную память не попадает.

Сжатие данных обеспечивает увеличение пропускной способности чтения и записи HBM2-памяти и чтения из L2-кэша до четырех раз (запись в L2 ускоряется вдвое), и до двукратного увеличения эффективного объема L2. Причем, подобного ускорения можно добиться и во вполне реальных примерах — например, в задаче линейной алгебры SAXPY (Scalar Alpha X Plus Y) — скалярном умножении и векторном сложении с разным количеством блоков:

Как видите по таблице, сжатие данных не всегда приводит к положительному результату, возможен и обратный пример, когда оно не просто бесполезно, но даже вредит. Зато когда работает эффективно, то прирост скорости приличный. Автоматически режим компрессии не включается, надо выделять память специальной командой. Эффективная пропускная способность даже в реальной задаче может быть повышена вдвое, но полезность сжатия данных в кэше нужно проверять в каждом конкретном случае.
Асинхронное копирование и асинхронные барьеры
Графический процессор A100 включает новую инструкцию асинхронного копирования, которая загружает данные напрямую из памяти GPU (через L2-кэш) в разделяемую память мультипроцессора SM, минуя регистровый файл и даже L1-кэш, при необходимости. Асинхронное копирование уменьшает нагрузку на регистровый файл, используя меньше регистров, эффективнее использует пропускную способность памяти, давая другим данны
Полный текст статьи читайте на iXBT
