GTC17: все подробности архитектуры NVIDIA Volta

Опубликовано:

nvidia-gtc

На пленарном докладе GPU Technology Conference NVIDIA представила новую архитектуру Volta. Также были объявлены и первые решения на базе новой архитектуры – вычислительные ускорители Tesla V100. Но первая информация была ограничена базовыми спецификациями GPU, подробностей архитектуры не было. Мы исправляем этот недостаток.

Конечно, GPU GV100 – наиболее мощный и сложный чип, когда-либо производившийся NVIDIA. GPU содержит 21 млрд. транзисторов, 5.120 потоковых процессоров, 16 Гбайт памяти HBM2 (на подложке) и более 100 млрд. межсоединений (GPU, подложка и память).

Вместе с тем архитектура Volta была серьезно доработана во многих областях, где изменения последний раз происходили два-четыре поколения назад. С архитектурой Volta NVIDIA вновь нацеливается на сегмент высокопроизводительных вычислений HPC. И пока не совсем понятно, когда архитектура Volta станет доступна для домашних систем. С памятью HBM2 по-прежнему наблюдаются проблемы доступности, поэтому у NVIDIA вряд ли есть возможность вывести ее на розничный рынок. Но SK Hynix собирается начать производство новых чипов памяти GDDR6 с начала 2018 года, возможно, тогда мы и увидим их вместе с GPU на архитектуре Volta.

Архитектура GPU GV100

Подобно предшествующим архитектурам, Volta или GPU GV100 состоит из кластеров обработки графики (Graphics Processing Clusters, GPC), обработки текстур (Texture Processing Clusters, TPC), потоковых мультипроцессоров (Streaming Multiprocessors, SM) и контроллеров памяти. Полная версия GPU GV100 как раз содержит шесть кластеров GPC, 84 Volta SM, 42 TPC (каждый по два SM) и восемь 512-битных контроллеров памяти (4.096 бит в сумме). У каждого SM доступны 64 ядра FP32, 64 ядра INT32, 32 ядра FP64 и восемь новых ядер Tensor. Также отметим наличие четырех текстурных блоков на SM.

В полной версии GPU GV100 имеются 84 SM, мы получаем 5.376 ядер FP32, 5.376 ядер INT32, 2.688 ядер FP64, 672 ядер Tensor и 336 текстурных блоков. Каждый контроллер памяти работает с 768 кбайт кэша L2, к каждому стеку памяти HBM2 подключены два контроллера памяти. В данной версии GPU GV100 мы получаем 6.144 кбайт кэша L2.

Volta SM (Streaming Multiprocessor)

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

Перечислим наиболее важные инновации Volt SM:

Как и GPU GP100, Volta SM имеет 64 ядра FP32 и 32 ядра FP64. Но архитектура Volta использует более современный способ распределения нагрузки по доступным ядрам, что повышает их загруженность и производительность в целом. SM в GPU GP100 содержали два вычислительных блока, каждый по 32 ядра FP32, 16 ядер FP64, буфер инструкций, Warp Scheduler, два блока диспетчеризации и файл регистров на 128 кбайт, но сейчас архитектура изменилась.

SM в GPU GV100 разделяются уже на четыре вычислительных блока. Каждый содержит 16 ядер FP32, 8 ядер FP64, 16 ядер INT32, два новых ядра Tensor со смешанной точностью, новый кэш инструкций L0, Warp Scheduler, блок диспетчеризации и файл регистров на 64 кбайт.

Файл регистров не изменился в размере при переходе с архитектуры Pascal на Volta. Но поскольку в GPU GV100 присутствует намного больше SM, суммарная емкость всех файлов регистров увеличивается. Объем общей памяти (Shared Memory) увеличился до 96 кбайт, у архитектуры Pascal он составлял 64 кбайт.

В отличие от архитектуры Pascal, которая не позволяла одновременно выполнять инструкции FP32 и INT32, теперь в архитектуре Volta это возможно, что тоже увеличивает производительность рендеринга.


Улучшения общей памяти и кэша данных L1

В архитектуре Pascal кэш данных и общая память не могли использоваться и адресоваться совместно. С архитектурой Volta NVIDIA меняет данный подход, теперь можно выделять до 128 кбайт на SM. В результате кэш данных можно увеличивать до семи раз по сравнению с Pascal. Сильнее всего от такого шага будет выигрывать код, который не использует общую память, но зависит от максимально возможного кэша данных.

Текстурные блоки тоже используют кэш данных, поэтому они тоже выигрывают от увеличения его максимального объема. Распределение объединенной памяти может варьироваться. Например, можно выделить 128 кбайт на SM, из которых 64 кбайт отведены на текстуры и операции загрузки/выгрузки, а оставшиеся 64 кбайт – на инструкции.

С новым подходом NVIDIA пытается реализовать лучшее из двух миров. Общая память Shared Memory в предыдущих архитектурах обеспечивала высокий уровень пропускной способности и низкие задержки, но разработчикам приходилось явно использовать эту память – с возможными проблемами overprovisioning. Но с архитектурой Volta это уже не требуется.

NVIDIA провела тесты в нескольких приложениях, под архитектурой Pascal потери составляют до 30%, под архитектурой Volta их удалось уменьшить до 7%.

В контексте NVLink была улучшена работа с унифицированной памятью (Unified Memory). До сих пор процессор не мог обращаться через интерфейс PCI Express к Unified Memory, если с памятью в то же время работал GPU. Так называемый движок Page Migration Engine гарантировал, что данные не могут одновременно поступать с двух источников.

Если же Tesla V100 и процессор подключаются через NVLink, то возможен одновременный доступ. Чуть ниже мы поговорим об улучшениях NVLink 2.0.

Ядра Tensor

Одна из наиболее важных инноваций архитектуры Volta, вернее, GPU GV100, заключается в ядрах Tensor. В случае Tesla V100 доступны 640 таких ядер. Добавление этих специальных ядер еще раз доказывает, насколько сильно NVIDIA ориентировала архитектуру Volta на глубокое обучение.

С ядрами Tensor NVIDIA смогла увеличить производительность вычислений FP32, важных для глубокого обучения, до 120 TFLOPS. То есть мы получаем прирост вычислительной производительности в 12 раз по сравнению с GPU GP100. NVIDIA также говорит о шестикратном увеличении производительности обработки запросов (inferencing).

Для процесса тренировки сетей глубокого обучения наиболее важны операции матричного умножения (BLAS GEMM), именно на них ориентированы ядра Tensor в GPU GV100. У ядер Tensor в SM имеются собственные пути передачи данных, их также можно полностью выключать с помощью стробирования частоты, если ядра не требуются.

Каждое ядро Tensor может обрабатывать матрицу 4 x 4 x 4 в виде D = A x B + C. Входные матрицы A и B относятся к типу FP16, для сложения может использоваться матрица FP16 или FP32.

Каждое ядро Tensor выполняет 64 операции FMA со смешанной точностью за такт – каждая такая операция может содержать умножение и сложение. В итоге восемь ядер Tensor на SM обеспечивают производительность 1.024 операций с плавающей запятой за такт.

В зависимости от приложения, производительность увеличивается в 1,8-9,3 раза. NVIDIA сравнивает Tesla P100 с ядрами CUDA 8 против Tesla V100 с CUDA 9.

Multi Process Service

Современные GPU могут выполнять одновременно несколько процессов. При этом на каждый процесс могут выделяться несколько вычислительных ядер. В архитектуре Pascal в GPU процессам выделялись необходимые ресурсы на GPU, потом процессы выполнялись в определенном порядке за выделенное время.

CUDA Multi-Process Service должен обеспечивать как можно более высокую загрузку доступных ресурсов. Но в предыдущей версии архитектуры некоторым процессам приходилось совместно использовать часть ресурсов. Что могло приводить к нежелательным ошибкам вычислений.

В Multi-Process Service архитектуры Volta проведены дальнейшие оптимизации выделения ресурсов, а также обеспечивается изоляция ресурсов. В результате Tesla V100 может выполнять до 163.840 потоков одновременно – в три раза больше, чем Tesla P100.

Производство на грани возможного

Хотелось бы упомянуть и производство GPU GV100. Площадь чипа составляет 815 мм², он содержит 21 млрд. транзисторов, что подходит к пределу технических возможностей. Так что здесь NVIDIA рискует. Впрочем, NVIDIA наверняка принимала решение о разработке подобного чипа после консультаций со своим партнером по производству TSMC. Но даже в этом случае нельзя исключить случайности.

Тесное сотрудничество между NVIDIA и TSMC приносит свои плоды. Чип производится по оптимизированному 12-нм техпроцессу, который можно назвать лучшим из доступных сегодня.

GPU GV100 интересен не только большим количеством потоковых процессоров. Ядра Tensor занимают весьма существенную часть площади чипа. NVIDIA не называет точных цифр, но ядра Tensor настолько сложные, что для них потребовалось выделить существенную площадь. Что, в свою очередь, увеличивает сложность чипа.

Но высокая сложность производства характерна не только для самого GPU, но и для памяти с подложкой. В частности, подложка в упаковке GV100 с чипами High Bandwidth Memory играет важную роль, поскольку обеспечивает соединения между GPU и чипами памяти. Из-за размеров GPU в производстве подложки возникли свои сложности, так что NVIDIA пришлось непросто.

Чтобы площадь подложки не была слишком большой для производства, NVIDIA и TSMC пришлось разделить ее на две части. Они производятся раздельно, после чего соединяются друг с другом.


Independent Thread Scheduling

При разработке архитектуры Volta особое внимание было уделено тому, чтобы с архитектурой было проще работать программистам, чтобы часть нагрузки взяли на себя API и аппаратное обеспечение. GPU GV100 стал первым графическим процессором с поддержкой функции Independent Thread Scheduling. Цель Independent Thread Scheduling заключается в дальнейшем увеличении загрузки ресурсов GPU, причем разработчику кода не нужно брать на себя задачу управления распределением ресурсов.

У архитектуры Pascal группа в 32 потока называлась warp. Такой подход хорошо соответствует классическому подходу SIMT (single instruction, multiple thread). Подобный warp выполнялся в архитектуре Pascal с единым счетчиком PC (program counter) для всех 32 потоков. Но поскольку не все 32 потока могли быть выполнены одновременно, некоторым потокам приходилось ждать, пока не будут готовы остальные.

В архитектуре Volta у каждого из 32 потоков используется свой планировщик, который отслеживает, на какой ступени конвейера находится поток, нужно ли передавать данные из одного потока в другой, нужно ли сделать паузу и подождать. В результате потоки можно более тонко адаптировать под возможности "железа", а также обеспечить большую нагрузку аппаратных ресурсов. Таким образом, допускается тонкое управление отдельными потоками внутри warp. Архитектура Volta и драйвер самостоятельно управляют назначениями потоков, программист кода на этот процесс не влияет.

NVLink 2.0

Скоростной интерконнект является важной частью любой платформы HPC. Все основные производители пытаются соединять чипы как можно более скоростными магистралями, то же самое касается соединения с внешними компонентами. Технологию интерконнекта NVLink NVIDIA представила еще на GPU Technology Conference в 2014 году. NVLink опирается на технологию High-Speed Signaling Interconnect (NVHS), разработанную NVIDIA.

С новыми GPU GV100 NVIDIA оптимизировала NVLink двумя путями. С одной стороны, увеличилась скорость каждого соединения. Также увеличилось и число каналов NVLink на GPU GV100. Максимальная пропускная способность канала NVLink до сих пор составляла до 40 Гбайт/с на канал для приема и передачи, в случае NVLink 2.0 мы получаем уже 50 Гбайт/с. Поскольку число каналов NVLink было увеличено с четырех до шести, для GPU GV100 мы получаем пропускную способность до 300 Гбайт/с.

Два дополнительных канала NVLink могут использоваться для построения новой инфраструктуры. До сих пор каналы NVLink позволяли соединять до восьми Tesla P100, а с процессором связь обеспечивалась через коммутатор PCI Express. В случае NVLink 2.0 появляются два дополнительных канала, их можно использовать, например, для связи с двумя CPU. Кроме того, в случае GPU Tesla V100 можно объединять до 64 GPU в одну систему. В целом, NVLink стал более быстрым и более гибким, что наверняка понравится разработчикам серверных решений.

NVLink 1.0 совместим с NVLink 2.0, то есть Tesla V100 можно устанавливать в существующие решения, где начнет поддерживаться интерконнект нового поколения. NVIDIA планирует на годы вперед, в том числе и возможности расширения.

Производительность

Конечно, NVIDIA привела подробности производительности и результаты тестов. В частности, NVIDIA протестировала производительность в разных приложениях глубокого обучения и сравнила результаты с предшественником Tesla P100.

В зависимости от теста, Tesla V100 справляется с расчетами до 80% быстрее. Но здесь все очень сильно зависит от внесенных оптимизацией. NVIDIA заявляет о поддержке всех актуальных API глубокого обучения, но не все разработчики имели возможность адаптировать свои программы под архитектуру Volta.

Также важную роль играет использование новых ядер Tensor. Когда они задействуются, NVIDIA указывает прирост производительности 2,4 раза по тренировке ResNet и в 3,7 раза по выборке результата (inferencing) в ResNet