GPU Hardware

Ядра и потоки процессора

Ядро — самостоятельный вычислительный блок процессора, поток — логическая линия исполнения; одно физическое ядро с SMT показывается системе как два потока.

Что такое ядра и потоки процессора

Ядро (core) — самостоятельный вычислительный блок внутри процессора: собственные исполнительные устройства, регистры и кеш L1/L2. Каждое ядро выполняет свой поток инструкций независимо от остальных. Четырёхъядерный процессор физически считает четыре вещи одновременно.

Поток (thread) — линия исполнения инструкций, которую ядро обрабатывает. Логических потоков может быть больше, чем ядер: технология SMT позволяет одному физическому ядру держать в работе два потока сразу.

Проще говоря: ядро — это работник, поток — это задача в его руках. SMT — попытка дать работнику вторую задачу, чтобы он не простаивал, пока первая ждёт данных из памяти.

Ядро процессора или ядро ОС

Запрос «что такое ядро» в IT означает две совершенно разные вещи:

  • Ядро процессора (CPU core) — физический блок железа, о нём эта статья.
  • Ядро операционной системы (kernel) — центральная часть ОС, управляющая памятью, процессами и устройствами. Например, ядро Linux. К количеству ядер процессора отношения не имеет.

По-английски их не путают: core и kernel. В русском совпало.

Что такое многопоточность

Термин используют в двух смыслах, и их стоит различать:

Аппаратная многопоточность (SMT) — Simultaneous Multithreading, у Intel маркетингово называется Hyper-Threading. Одно физическое ядро дублирует регистры и выставляется в ОС как два логических процессора. Исполнительные устройства при этом общие — их делят оба потока.

Программная многопоточность — когда приложение само разбивает работу на потоки, чтобы занять несколько ядер. Это уже про код, а не про железо.

Важно: SMT не удваивает производительность. Второй поток лишь заполняет паузы, когда первый ждёт данных из памяти. На смешанной нагрузке типичный выигрыш — десятки процентов, а не 2×. На задаче, которая и так полностью загружает вычислительные блоки ядра (плотная математика, AVX), SMT может дать около нуля или чуть замедлить.

Как посчитать ядра и потоки

# Linux: сводка по топологии
lscpu | grep -E 'CPU\(s\)|Thread|Core|Socket|Model name'

# Число логических процессоров (потоков)
nproc

# Физические ядра: уникальные пары "сокет + core id"
grep -E 'core id|physical id' /proc/cpuinfo | sort -u | wc -l

Формула: потоки = сокеты × ядра на сокет × потоков на ядро. В выводе lscpu строка Thread(s) per core: 2 означает включённый SMT, 1 — выключенный или отсутствующий.

В Windows число ядер и логических процессоров показывает вкладка «Производительность» в диспетчере задач.

Ядра, потоки и vCPU в облаке

В облаке считают vCPU, и это почти всегда логический поток, а не физическое ядро. Инстанс с 8 vCPU обычно означает 4 физических ядра с SMT.

Отсюда несколько практических моментов:

  • Сравнивать «8 vCPU здесь» и «8 ядер там» напрямую нельзя — это разные величины.
  • На VPS vCPU ещё и делятся между соседями по гипервизору; реальная доля зависит от переподписки провайдера.
  • Часть провайдеров указывает «dedicated core» — тогда за vCPU закреплено физическое ядро.

Сколько потоков ставить приложению

Больше потоков ≠ быстрее. Когда потоков больше, чем логических процессоров, ОС начинает их переключать, и накладные расходы съедают выигрыш.

# Ограничить число потоков математических библиотек
export OMP_NUM_THREADS=8
export MKL_NUM_THREADS=8

# Привязать процесс к конкретным ядрам (0-3)
taskset -c 0-3 ./my_app

Частая ошибка в контейнерах: библиотека видит все ядра хоста и запускает по потоку на каждое, хотя cgroups ограничивает контейнер парой ядер. Результат — постоянное переключение контекста вместо работы. Число потоков нужно задавать явно, по лимиту контейнера.

Ядра CPU и ядра GPU

Ядра CPU и «ядра» GPU — принципиально разные сущности, несмотря на общее слово. Ядро CPU — сложный универсальный блок с предсказанием переходов и внеочередным исполнением, их единицы или десятки. CUDA-ядро — простейший арифметический блок, их тысячи, и они работают синхронно группами.

Поэтому «16 ядер CPU против 16 384 ядер GPU» — сравнение, ничего не говорящее о производительности: у этих ядер разное назначение.

Связанные термины

  • CPU — процессор, которому принадлежат ядра
  • GPU — тысячи простых ядер против десятков сложных
  • CUDA Core — «ядро» в терминологии NVIDIA
  • VPS — где vCPU означает логический поток
  • Виртуальная машина — как ядра хоста превращаются в vCPU
  • Утилиты Linuxlscpu, nproc, taskset

Готовы запустить GPU-задачу?

Запустить GPU-сервер