Ядра и потоки процессора
Ядро — самостоятельный вычислительный блок процессора, поток — логическая линия исполнения; одно физическое ядро с 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
- Утилиты Linux —
lscpu,nproc,taskset
Готовы запустить GPU-задачу?
Запустить GPU-сервер