Открыть сервис

Потоковый мультипроцессор

Потоковый мультипроцессор (Streaming Multiprocessor, SM) — это ключевой вычислительный блок в архитектуре графических процессоров (GPU) компании NVIDIA, отвечающий за параллельное выполнение множества потоков инструкций. SM представляет собой аппаратный модуль, объединяющий несколько ядер CUDA (CUDA cores), кэш-память, планировщики потоков и другие компоненты, необходимые для обработки данных в рамках модели массового параллелизма. В современных GPU NVIDIA (начиная с архитектуры Fermi и до Ada Lovelace и Hopper) SM является основной единицей, определяющей производительность устройства в задачах общего назначения (GPGPU) и рендеринга графики.

История и развитие

Архитектура Tesla (2006)

Первые GPU NVIDIA с поддержкой CUDA, такие как GeForce 8800 GTX (архитектура Tesla), содержали потоковые мультипроцессоры, которые назывались просто «мультипроцессорами» (MP). Каждый MP включал 8 ядер CUDA (скалярных процессоров), разделяемую память (shared memory) объёмом 16 КБ и планировщик потоков. Максимальное количество активных потоков на один MP составляло 768.

Архитектура Fermi (2010)

С выходом Fermi (GeForce GTX 480) появилось понятие SM (Streaming Multiprocessor). Каждый SM содержал 32 ядра CUDA, разделённые на две группы по 16 ядер (так называемые «warp schedulers»). Объём разделяемой памяти вырос до 48 КБ, а кэш L1 был объединён с разделяемой памятью. Количество активных потоков на SM увеличилось до 1536.

Архитектура Kepler (2012)

В Kepler (GeForce GTX 680) произошло разделение на SMX (Streaming Multiprocessor eXtreme). Каждый SMX содержал 192 ядра CUDA, 4 планировщика warp и 8 блоков регистров. Объём разделяемой памяти достиг 64 КБ. Однако из-за высокой сложности SMX тактовая частота была снижена по сравнению с Fermi.

Архитектура Maxwell (2014)

Maxwell (GeForce GTX 980) упростил архитектуру, вернувшись к названию SM. Каждый SM содержал 128 ядер CUDA, 4 планировщика warp и 96 КБ разделяемой памяти. Улучшена энергоэффективность за счёт оптимизации планировщика и уменьшения числа транзисторов.

Архитектура Pascal (2016)

Pascal (GeForce GTX 1080) представил SM с 128 ядрами CUDA, но с поддержкой новых инструкций (FP16, предварительная выборка). Объём разделяемой памяти остался на уровне 96 КБ. Количество активных потоков на SM достигло 2048.

Архитектура Volta (2017)

Volta (Tesla V100) ввёл новый тип SM — SM с поддержкой тензорных ядер (Tensor Cores). Каждый SM содержал 64 ядра CUDA, 8 тензорных ядер и 96 КБ разделяемой памяти. Впервые появилась независимая параллельная обработка целочисленных и вещественных операций.

Архитектура Turing (2018)

Turing (GeForce RTX 2080) добавил в SM ядра для трассировки лучей (RT Cores). Каждый SM содержал 64 ядра CUDA, 8 тензорных ядер и 1 RT-ядро. Объём разделяемой памяти — 96 КБ. Количество активных потоков — 1024.

Архитектура Ampere (2020)

Ampere (GeForce RTX 3080) увеличил количество ядер CUDA в SM до 128, тензорных ядер — до 4 (третье поколение), RT-ядер — до 2 (второе поколение). Разделяемая память выросла до 128 КБ. Поддержка новых типов данных (TF32, FP64).

Архитектура Ada Lovelace (2022)

Ada Lovelace (GeForce RTX 4090) содержит SM с 128 ядрами CUDA, 4 тензорными ядрами (четвёртое поколение) и 1 RT-ядром (третье поколение). Разделяемая память — 128 КБ. Улучшена производительность трассировки лучей и масштабирования.

Архитектура Hopper (2022, серверные GPU)

Hopper (H100) использует SM с 128 ядрами CUDA и 4 тензорными ядрами (четвёртое поколение), но с увеличенной разделяемой памятью (228 КБ) и поддержкой новых механизмов синхронизации (DPX, Transformer Engine).

Устройство и компоненты

Ядра CUDA

Ядра CUDA (CUDA cores) — это простые арифметико-логические устройства (ALU), выполняющие операции с плавающей точкой (FP32) и целыми числами (INT32). В каждом SM количество ядер CUDA варьируется от 8 (Tesla) до 128 (Ampere, Ada Lovelace). Ядра работают синхронно в рамках warp-групп.

Планировщики warp

Планировщик warp (warp scheduler) управляет выполнением групп из 32 потоков (warp). Каждый SM содержит несколько планировщиков (обычно 4), которые выбирают готовые к выполнению warp и отправляют инструкции на исполнительные блоки. В современных архитектурах планировщики поддерживают одновременное выполнение нескольких warp (до 64 активных warp на SM).

Разделяемая память

Разделяемая память (shared memory) — это быстрая память с низкой задержкой, доступная всем потокам внутри одного блока. Используется для обмена данными между потоками и ускорения операций, требующих совместного доступа. Объём разделяемой памяти на SM составляет от 16 КБ (Tesla) до 228 КБ (Hopper). В некоторых архитектурах (Fermi, Kepler) разделяемая память объединена с кэшем L1.

Регистровый файл

Регистровый файл (register file) — это набор быстрых регистров, распределяемых между потоками. Каждый SM имеет фиксированное количество регистров (например, 65536 в Ampere). Количество регистров на поток влияет на максимальное количество параллельных потоков.

Кэш-память

SM содержит кэш L1 (инструкции и данные) и кэш текстур. В современных архитектурах кэш L1 объединён с разделяемой памятью (единая память L1/shared). Кэш L2 является общим для всех SM на чипе.

Тензорные ядра

Тензорные ядра (Tensor Cores) — специализированные блоки для выполнения матричных операций (умножение матриц, свёртки) с использованием смешанной точности (FP16, BF16, TF32, INT8). Впервые появились в архитектуре Volta. В Ada Lovelace используются тензорные ядра четвёртого поколения.

RT-ядра

RT-ядра (Ray Tracing Cores) — аппаратные ускорители трассировки лучей, выполняющие пересечение лучей с треугольниками и bounding volume hierarchy (BVH). Впервые появились в архитектуре Turing. В Ada Lovelace — третье поколение.

Классификация

По поколению

  • Tesla (2006): 8 ядер CUDA, 16 КБ shared memory.
  • Fermi (2010): 32 ядра CUDA, 48 КБ shared memory.
  • Kepler (2012): 192 ядра CUDA (SMX), 64 КБ shared memory.
  • Maxwell (2014): 128 ядер CUDA, 96 КБ shared memory.
  • Pascal (2016): 128 ядер CUDA, 96 КБ shared memory.
  • Volta (2017): 64 ядра CUDA + тензорные ядра, 96 КБ shared memory.
  • Turing (2018): 64 ядра CUDA + тензорные + RT-ядра, 96 КБ shared memory.
  • Ampere (2020): 128 ядер CUDA + тензорные + RT-ядра, 128 КБ shared memory.
  • Ada Lovelace (2022): 128 ядер CUDA + тензорные + RT-ядра, 128 КБ shared memory.
  • Hopper (2022): 128 ядер CUDA + тензорные ядра, 228 КБ shared memory.

По назначению

  • Графические SM: используются в потребительских GPU (GeForce) для рендеринга и игр.
  • Вычислительные SM: оптимизированы для научных расчётов и машинного обучения (Tesla, Quadro, A100, H100).
  • Встроенные SM: применяются в мобильных и встраиваемых GPU (Tegra, Jetson) с пониженным энергопотреблением.

Применение

Графический рендеринг

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

Научные вычисления

В задачах моделирования, симуляции и численного анализа SM используются для выполнения операций с плавающей точкой. Например, в молекулярной динамике (GROMACS), климатологии (WRF) и квантовой химии (Gaussian).

Машинное обучение

Тензорные ядра SM ускоряют обучение и инференс нейронных сетей. В архитектурах Volta, Ampere и Hopper SM поддерживают смешанную точность (FP16, BF16, TF32), что позволяет увеличить пропускную способность при обучении больших моделей (GPT, BERT, Vision Transformers).

Обработка изображений и видео

SM используются для фильтрации, сжатия (NVENC, NVDEC) и анализа изображений. В профессиональных приложениях (Adobe Premiere, DaVinci Resolve) SM ускоряют рендеринг и цветокоррекцию.

Производительность и ограничения

Пропускная способность

Производительность SM измеряется в FLOPS (операциях с плавающей точкой в секунду). Например, SM в архитектуре Ampere (GeForce RTX 3080) может выполнять до 30 TFLOPS (FP32) при частоте 1,7 ГГц. Однако реальная производительность зависит от эффективности планировщика warp и загрузки памяти.

Ограничения

  • Закон Мура: рост числа транзисторов замедлился, поэтому производительность SM увеличивается за счёт архитектурных улучшений (тензорные ядра, RT-ядра).
  • Тепловыделение: каждый SM потребляет значительную мощность (до 20-30 Вт), что ограничивает количество SM на кристалле (например, в RTX 4090 — 128 SM).
  • Память: скорость доступа к глобальной памяти (VRAM) остаётся узким местом, поэтому SM используют кэш и разделяемую память для снижения задержек.

Интересные факты

  • В архитектуре Kepler (2012) SMX содержал 192 ядра CUDA, что было рекордным для своего времени, но из-за сложности тактовая частота была снижена.
  • В архитектуре Volta (2017) впервые появились тензорные ядра, которые позволили ускорить обучение нейросетей в 10-20 раз по сравнению с предыдущими поколениями.
  • В архитектуре Hopper (2022) SM поддерживает технологию DPX (Dynamic Programming eXtensions), ускоряющую алгоритмы динамического программирования (например, выравнивание последовательностей ДНК).
  • Компания NVIDIA использует SM как основу для своих суперкомпьютеров (например, DGX A100 содержит 6912 SM).

Источники

  • NVIDIA CUDA C Programming Guide (2023)
  • Архитектурные обзоры NVIDIA (Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere, Ada Lovelace, Hopper)
  • «Programming Massively Parallel Processors» by David B. Kirk, Wen-mei W. Hwu (2016)
  • Документация NVIDIA Developer Zone

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →