Многопоточность позволяет процессору одновременно обрабатывать несколько потоков, эффективно используя ресурсы CPU. Разбираемся, чем отличаются физические ядра от логических потоков, как работает SMT и Hyper-Threading, и насколько важна многопоточность для реальной производительности в разных задачах.
Многопоточность процессора позволяет эффективнее использовать вычислительные ресурсы CPU и одновременно обрабатывать несколько последовательностей инструкций. Именно поэтому в характеристиках современных процессоров часто можно увидеть, например, 8 ядер и 16 потоков. При этом 16 потоков не означают наличие 16 полноценных физических ядер - это разные понятия.
Чтобы понять, как работает многопоточность, сначала нужно разобраться, что такое ядра и потоки процессора, почему их количество отличается и какую роль каждый из этих параметров играет в производительности компьютера.
Ядро процессора - это физический вычислительный блок внутри CPU, который способен самостоятельно выполнять инструкции программы. Современный процессор может содержать несколько таких ядер, поэтому разные задачи или части одной программы могут обрабатываться параллельно.
Например, восьмиядерный процессор физически содержит восемь вычислительных ядер. Операционная система распределяет между ними работу: одно ядро может обрабатывать процессы браузера, другое - игру, третье - фоновые службы, а остальные одновременно выполнять другие вычисления.
Поток процессора - это последовательность инструкций, которую процессор выполняет в определённый момент времени. В характеристиках CPU под потоками обычно понимают количество логических процессоров, которые видит операционная система и между которыми она может распределять задачи.
Самый простой вариант - одно физическое ядро выполняет один поток. В таком случае восьмиядерный CPU будет представлен системе как процессор с восьмью потоками.
Однако современные процессоры могут позволять одному физическому ядру работать сразу с несколькими потоками. Например, конфигурация "8 ядер / 16 потоков" означает, что каждое из восьми физических ядер способно обслуживать два потока.
Дополнительные потоки иногда называют виртуальными ядрами, но это упрощённое обозначение. Они не являются отдельными физическими ядрами и не получают собственный полный набор вычислительных блоков. Два потока одного ядра используют значительную часть его ресурсов совместно.
Поэтому процессор с 8 ядрами и 16 потоками нельзя напрямую считать аналогом 16-ядерного CPU. Полноценные физические ядра обладают собственными исполнительными ресурсами, тогда как дополнительные потоки помогают эффективнее загружать уже существующее ядро.
Чтобы понять, как одно ядро выполняет несколько задач одновременно, важно учитывать устройство самого процессора. Во время работы ядро использует разные исполнительные блоки: одни отвечают за целочисленные вычисления, другие - за операции с числами с плавающей точкой, загрузку данных из памяти и другие действия. При выполнении одного потока часть этих ресурсов периодически простаивает.
Например, если программе нужны данные из оперативной памяти, ядру приходится ждать, пока они будут загружены. Для современных процессоров даже небольшая задержка памяти может означать большое количество потерянных тактов. Многопоточность позволяет использовать такие паузы эффективнее: пока один поток ждёт данные или освобождения определённого блока, ядро может выполнять инструкции другого.
Для этого внутри процессора хранится состояние сразу нескольких потоков: значения регистров, счётчики инструкций и другая информация, необходимая для продолжения выполнения программы. При этом основная часть вычислительных ресурсов ядра остаётся общей.
Современные технологии одновременной многопоточности идут ещё дальше. Если инструкции двух потоков требуют разных исполнительных блоков, процессор может выполнять часть их операций практически одновременно в рамках одного физического ядра. Именно поэтому создаётся впечатление, что одно ядро работает как два.
Однако вычислительная мощность самого ядра от этого не удваивается. Оба потока конкурируют за общие ресурсы: исполнительные блоки, кэш, пропускную способность и другие компоненты. Если два потока одновременно требуют одни и те же ресурсы, прирост производительности будет значительно меньше.
Подробнее устройство CPU и причины, по которым производительность зависит не только от тактовой частоты, разобраны в материале Почему частота процессора больше не главное: что такое IPC и как правильно сравнивать CPU.
Поэтому многопоточность правильнее рассматривать не как добавление ещё одного ядра, а как способ лучше использовать уже имеющееся. Процессор старается заполнить свободные вычислительные ресурсы полезной работой второго потока вместо того, чтобы оставлять их незадействованными.
Технология, которая позволяет одному физическому ядру работать с несколькими потоками, обычно называется SMT - Simultaneous Multithreading, или одновременная многопоточность. Её задача - эффективнее загружать исполнительные ресурсы ядра, используя инструкции сразу нескольких потоков.
Hyper-Threading - это фирменное название реализации SMT у Intel. Принцип тот же: одно физическое ядро представляется операционной системе как несколько логических процессоров. В классическом варианте одно ядро обслуживает два потока, поэтому четырёхъядерный процессор с Hyper-Threading может отображаться в системе как восьмипоточный.
У AMD используется термин SMT без отдельного маркетингового названия. Например, процессор с 8 физическими ядрами и поддержкой SMT может иметь 16 потоков. Для операционной системы каждый поток выглядит как отдельный логический процессор, между которыми планировщик распределяет задачи.
Именно отсюда появилось выражение "виртуальные ядра". Оно удобно для объяснения, но технически не совсем точно. Логический процессор не является отдельным физическим ядром: у него нет собственного полного набора исполнительных блоков, кэша и других ресурсов. Значительная часть компонентов используется совместно с другим потоком того же ядра.
Из-за этого два логических потока одного физического ядра не обеспечивают такую же производительность, как два отдельных ядра. Если оба потока активно используют одинаковые вычислительные ресурсы, они начинают конкурировать между собой. Если же один поток оставляет часть блоков незагруженными, второй может использовать их и увеличить общую производительность ядра.
Поэтому разница между SMT и Hyper-Threading в первую очередь заключается в названии. SMT - это общий принцип одновременной многопоточности, а Hyper-Threading - конкретное обозначение технологии Intel, построенной на этом принципе.
Многопоточность даёт наибольший эффект в задачах, которые можно разделить на несколько независимых частей. Чем лучше программа умеет распределять вычисления между потоками, тем больше пользы она получает от процессора с большим количеством логических потоков.
Хороший пример - 3D-рендеринг, кодирование видео, компиляция программ, архивирование и некоторые инженерные расчёты. Такие задачи часто можно разбить на множество небольших операций и выполнять их параллельно. В результате процессор с 8 ядрами и 16 потоками обычно справляется с подобной нагрузкой быстрее, чем тот же CPU без одновременной многопоточности.
Полезна многопоточность и при активной работе сразу с несколькими программами. Браузер, мессенджер, редактор изображений, фоновые службы и другие процессы одновременно требуют процессорного времени. Чем больше потоков доступно системе, тем проще распределять нагрузку без заметных задержек.
В играх ситуация сложнее. Современные игровые движки умеют использовать несколько потоков для физики, искусственного интеллекта, подготовки графических команд, загрузки ресурсов и других операций. Но далеко не все вычисления можно равномерно распределить между большим количеством потоков.
Поэтому увеличение количества потоков не всегда приводит к пропорциональному росту FPS. Для игровой производительности также важны архитектура процессора, скорость отдельных ядер, объём и задержки кэш-памяти, оперативная память и особенности конкретного движка.
Подробнее о влиянии кэша на производительность в играх можно прочитать в материале Почему кэш-память важнее частоты процессора для игр.
Важно учитывать и то, что 8 ядер и 16 потоков не равны 16 полноценным ядрам. Дополнительные логические потоки используют общие ресурсы физических ядер, поэтому прирост зависит от типа нагрузки. В одних задачах многопоточность заметно ускоряет работу, а в других разница может быть небольшой.
По этой причине сравнивать процессоры только по количеству потоков неправильно. Два CPU с одинаковой конфигурацией ядер и потоков могут значительно отличаться по производительности из-за архитектуры, частот, объёма кэша и эффективности выполнения инструкций.
Оптимальное количество ядер и потоков зависит прежде всего от того, какие задачи выполняются на компьютере. Само по себе большое число потоков не гарантирует высокую производительность: важны архитектура процессора, производительность каждого ядра, объём кэша, частоты и особенности программ.
Для браузера, офисных приложений, просмотра видео и повседневной работы обычно не требуется большое количество потоков. В таких сценариях важнее высокая производительность отдельных ядер и достаточный объём оперативной памяти, поскольку большинство задач не создают длительную нагрузку на весь процессор.
В современных играх несколько дополнительных ядер помогают одновременно обрабатывать игровой движок, физику, искусственный интеллект, фоновые процессы и работу операционной системы. При этом после определённого количества ядер дальнейшее увеличение числа потоков часто даёт намного меньший эффект, чем повышение производительности каждого отдельного ядра.
Для монтажа видео, 3D-рендеринга, компиляции, виртуальных машин и других хорошо распараллеливаемых задач ситуация обратная. Такие программы способны загружать большое количество ядер и потоков практически одновременно, поэтому многопоточный процессор здесь раскрывается значительно лучше.
Также важно учитывать архитектуру современных CPU. Например, в некоторых процессорах Intel одновременно используются производительные P-ядра и энергоэффективные E-ядра. Они отличаются по возможностям и назначению, поэтому простое сравнение общего количества ядер между разными моделями может вводить в заблуждение.
Подробнее устройство такой архитектуры разобрано в материале P-ядра и E-ядра в процессорах Intel: как работает гибридная архитектура и стоит ли отключать малые ядра.
При выборе процессора лучше смотреть не только на запись вроде "8 ядер / 16 потоков", а на результаты именно тех задач, для которых покупается компьютер. Для игр важнее высокая производительность отдельных ядер и сбалансированная архитектура, а для рендеринга и других тяжёлых вычислений большое количество физических ядер и потоков обычно приносит больше пользы.
Многопоточность процессора позволяет одному физическому ядру эффективнее использовать свои вычислительные ресурсы, одновременно обслуживая несколько потоков. Поэтому современные CPU могут иметь больше потоков, чем физических ядер, но дополнительные логические потоки не превращают одно ядро в два полноценных.
SMT и Hyper-Threading особенно полезны в задачах, которые хорошо распараллеливаются: 3D-рендеринге, кодировании видео, компиляции, архивировании и активной многозадачности. В играх и приложениях с небольшой параллельной нагрузкой прирост может быть значительно скромнее.
При выборе процессора стоит учитывать не только количество ядер и потоков, но и архитектуру CPU, производительность одного ядра, объём кэша и особенности конкретных программ. Конфигурация "8 ядер / 16 потоков" сама по себе ещё не говорит, насколько быстрым окажется процессор в реальной работе.