Потоки и работа с ними

Процессоры, ядра и потоки. Топология систем

Поддержка нескольких центральных процессоров в одной системе требует многочисленных изменений в её дизайне. Как минимум, необходимо обеспечить их физическое подключение (предусмотреть несколько сокетов на материнской плате), решить вопросы идентификации процессоров (см. далее в этой статье, а также мою предыдущую заметку), согласования доступов к памяти и доставки прерываний (контроллер прерываний должен уметь маршрутизировать прерывания на несколько процессоров) и, конечно же, поддержки со стороны операционной системы. Я, к сожалению, не смог найти документального упоминания момента создания первой многопроцессорной системы на процессорах Intel, однако Википедия утверждает, что Sequent Computer Systems поставляла их уже в 1987 году, используя процессоры Intel 80386. Широко распространённой поддержка же нескольких чипов в одной системе становится доступной, начиная с Intel Pentium.

Казалось бы, если в системе больше процессоров, то выше её производительность (на задачах, способных задействовать все ресурсы). Однако, если стоимость коммуникаций между ними слишком велика, то весь выигрыш от параллелизма убивается длительными задержками на передачу общих данных. Именно это наблюдается в многопроцессорных системах — как физически, так и логически они находятся очень далеко друг от друга. Для эффективной коммуникации в таких условиях приходится придумывать специализированные шины, такие как Intel QuickPath Interconnect. Энергопотребление, размеры и цена конечного решения, конечно, от всего этого не понижаются. На помощь должна прийти высокая интеграция компонент — схемы, исполняющие части параллельной программы, надо подтащить поближе друг к другу, желательно на один кристалл. Другими словами, в одном процессоре следует организовать несколько ядер, во всём идентичных друг другу, но работающих независимо.

Я не буду пытаться объяснить все плюсы и минусы дизайнов с SMT вообще и с HT в частности. Интересующийся читатель может найти довольно подробное обсуждение технологии во многих источниках, и, конечно же, в Википедии. Однако отмечу следующий важный момент, объясняющий текущие ограничения на число гиперпотоков в реальной продукции.

Другая ситуация наблюдается на типичных задачах, выполняемых на видеоускорителях. Поэтому для этих архитектур характерно использование техники SMT с бóльшим числом потоков. Так как сопроцессоры Intel Xeon Phi (представленные в 2010 году) идеологически и генеалогически довольно близки к видеокартам, на них может быть четыре гиперпотока на каждом ядре — уникальная для IA-32 конфигурация.

Далее для удобства обозначим количества процессоров, ядер и потоков в некоторой системе тройкой (x, y, z), где x — это число процессоров, y — число ядер в каждом процессоре, а z — число гиперпотоков в каждом ядре. Далее я буду называть эту тройку топологией — устоявшийся термин, мало что имеющий с разделом математики. Произведение p = xyz определяет число сущностей, именуемых логическими процессорами системы. Оно определяет полное число независимых контекстов прикладных процессов в системе с общей памятью, исполняющихся параллельно, которые операционная система вынуждена учитывать. Я говорю «вынуждена», потому что она не может управлять порядком исполнения двух процессов, находящихся на различных логических процессорах. Это относится в том числе к гиперпотокам: хотя они и работают «последовательно» на одном ядре, конкретный порядок диктуется аппаратурой и недоступен для наблюдения или управления программам.

В Linux информация о топологии содержится в псевдофайле /proc/cpuinfo, а также выводе команды dmidecode. В примере ниже я фильтрую содержимое cpuinfo на некоторой четырёхядерной системе без HT, оставляя только записи, относящиеся к топологии:

Также их предоставляет консольная утилита Sysinternals Coreinfo и API вызов GetLogicalProcessorInformation.

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

Ядро – упрощенно это физическая единица процессора, способная в определенно взятый момент времени выполнять одну последовательность команд. Если ядро одно, а команд много, ядро переключается между ними, выполняя задачи поочередно в зависимости от приоритета.

Поток его еще называют иногда виртуальным ядром – результат работы современных технологий (в процессорах производства компании Intel – эта технология называется Hyper Threading, а у компании AMD – SMT технологией), когда ядро, с помощью специальных технологий, способно разделять свою производительность. Выражение одно ядро и два потока говорит о том, что физически одно ядро, но это ядро виртуально делится на два и позволяет распараллеливать задачи и решать их одновременно. То есть при наличии двух сравнительно «простых задач» процессор сможет выполнить их в два раза быстрее, чем обычный процессор с одним ядром. Примером таких задач могут быть скачивание фоном файлов, работа антивируса. Технология создания потоков позволяют делать несколько параллельных вычислительных каналов, что позволяет использовать способности компьютеров более эффективно, так как если одно из виртуальных ядер закончило свою работу, то может присоединиться к работе другого ядра. Производительность повыситься, но повышение будет ограниченно, так как используются ресурсы (тактовая частота измеряется в МГц– то есть вычислительная способность) физического ядра, которое у нас одно. Только используя специальные программы, работающие с гиперпотоком и при правильной оптимизации можно прочувствовать прирост в производительности.

Можно сделать вывод, что при работе с «простыми» задачами одноядерный процессор с двумя потоками по производительности сопоставим с «настоящими» двухъядерными процессорами, но если задачи будут «сложными» например архивация, рендеринг видео, то для увеличения производительности стоит задуматься о приобретении процессора с большим количеством ядер. Так как многоядерные процессоры более предпочтительны для серьезных задач чем многопоточные.

Потоки процессора, сколько нужно ядер и потоков современному обывателю?

Как я уже сказал выше, современные ОС падки на ресурсы процессора, поскольку отнимают часть мощностей на собственные службы, интерфейс, красивости и функции защиты в реальном времени. Но при этом пользователь хочет еще и работать с комфортом.

p, blockquote 13,0,0,0,0 —>

  • По-хорошему, для офисной работы будет вполне достаточно 2‑ядерных ЦП, но при этом учитывайте, что одновременно работать с браузером, текстовыми редакторами, почтовым клиентом и проигрывателем, не получится – система попросту не справится. А если использовать топологию 2 ядра/4 потока, то ситуация в корне преображается – рук то больше.
  • Игры требуют уже больше ресурсов. Начнем с того, что современные проекты очень падки на ресурсы чипа. Взять к примеру, ту же GTA V или Watch Dogs 2: они способны выжимать все соки из любого камня, поскольку параллельно отрисовывают сцены игры (скрипты), просчитывают окружение, прорабатывают звук, поведение искусственного интеллекта и не только. И все эти процессы еще нужно синхронизировать надлежащим образом.
  • А если копнуть в задачи типа программирования, рендеринга и профессиональной работы с графики, то видно, что здесь и 4‑ядерные/8‑поточные чипы начинают захлебываться и работают на износ.

p, blockquote 14,0,0,1,0 —>

Как узнать количество потоков процессора

Для этого можно воспользоваться средствами операционной системы, паспортными данными или сторонними утилитами. Рассмотрим каждый из вариантов на примерах.

Диспетчер задач

Запустите утилиту комбинацией клавиш Ctrl + Shift + Esc и перейдите во вкладку Производительность. Ищите строчку Логических процессоров.

Сведения о системе

Нажмите Win + R и в открывшемся окне выполните команду msinfo32.

В правой части окна смотрите содержимое строчки Процессор.

Найдите свой процессор на официальном сайте и посмотрите данные в спецификации.

В бумажной документации эта информация также присутствует.

CPU-Z

Эта утилита отобразит все сведения о процессоре и других компонентах компьютера. Число потоков указано в строке Threads.

Другие информационные утилиты также покажут количество логических потоков, например AIDA64.

Windows PowerShell

Запустите инструмент через кнопку Пуск и выполните в нём команду:

WMIC CPU Get DeviceID,NumberOfCores,NumberOfLogicalProcessors

Нужное значение находится в третьем столбике.

логический процессор

Смотреть что такое «логический процессор» в других словарях:

  • Инвертор (логический элемент) — Битовые операции, иногда также булевы или логические операции операции над битами, применяемые в программировании и цифровой технике, изучаемые в дискретной математике и математической логике. Содержание 1 Введение 1.1 … Википедия
  • Микропроцессорная секция — Эта статья или раздел описывает ситуацию применительно лишь к одному региону. Вы можете помочь Википедии, добавив информацию для других стран и регионов … Википедия
  • DPC — (англ. Deferred procedure call отложенный вызов процедуры) специфический механизм вызова процедур в архитектуре Windows. Содержание 1 Суть DPC 2 Управление DPC 3 … Википедия
  • Битовая операция — Битовые операции, иногда также булевы или логические операции операции над битами, применяемые в программировании и цифровой технике, изучаемые в дискретной математике и математической логике. Содержание 1 Введение 1.1 … Википедия
  • Булевы операции — Битовые операции, иногда также булевы или логические операции операции над битами, применяемые в программировании и цифровой технике, изучаемые в дискретной математике и математической логике. Содержание 1 Введение 1.1 … Википедия
  • Микросхема — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия
  • Большая интегральная схема — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия
  • Видеочип — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия
  • Интегральная микросхема — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия
  • Интегральные микросхемы — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия
  • Классификация микросхем по степени интеграции (СССР) — Современные интегральные микросхемы, предназначенные для поверхностного монтажа. Советские и зарубежные цифровые микросхемы. Интегральная (engl. Integrated circuit, IC, microcircuit, microchip, silicon chip, or chip), (микро)схема (ИС, ИМС, м/сх) … Википедия

Как узнать сколько потоков в процессоре

У многих процессоров Intel есть поддержка технологии под названием Hyper-threading. Данная технология позволяет выполнять сразу 2 потока команд на одном ядре процессора. Таким образом удается более эффективно использовать вычислительную мощность ядра. Но, технология Hyper-threading используется далеко не во всех процессорах Intel. Технология Hyper-threading присутствует в процессорах Core i3, Core i7, а также в некоторых новых Pentium и мобильных Core i5.

У процессоров AMD с архитектурой Zen также есть технология, создающая по два потока вычислений на ядро. И у AMD также не все процессоры получают поддержку данной технологии.

Из-за такого разброса в характеристиках процессоров создается путаница и пользователи часто не могут разобраться, в каких процессорах сколько потоков используется. В данной статье речь пойдет о том, как узнать сколько потоков на вашем процессоре.

Способ № 1. Диспетчер задач.

Самый простой способ узнать сколько потоков в вашем процессоре, это посмотреть в «Диспетчере задач». Для открытия «Диспетчера задач» можно воспользоваться классической комбинацией клавиш CTRL-SHIFT-DELETE. Если у вас операционная система Windows 7 или более новая, то это можно сделать еще и с помощью CTRL-SHIFT-ESC.

После открытия «Диспетчера задач» нужно перейти на вкладку «Быстродействие».

Здесь будет отображаться загруженность процессора и оперативной памяти компьютера. В правой верхней части окна будет отображаться хронология загрузки ЦП. Особенностью данного графика является, то что нагрузка отображается отдельно для каждого из потоков процессора. Поэтому подсчитав количество окошек с графиками можно узнать сколько потоков в процессоре. Например, на скриншоте внизу, отображается 8 графиков с хронологией загрузки процессора, следовательно, на компьютере используется процессор с 8 потоками.

Если у вас Windows 8 или Windows 10, то хронология нагрузки на процессор может отображаться одним графиком. В этом случае вам нужно сначала переключиться на отображение хронологии по логическим процессорам (потокам). Для этого нужно кликнуть правой кнопкой мышки и выбрать «Изменить график – Логические процессоры».

После этого в «Диспетчере задач» появятся отдельные графики для каждого потока вашего процессора. Например, на скриншоте внизу отображается 4 графика, следовательно, в используемом процессоре 4 потока.

Кроме этого, в «Диспетчере задач» Windows 8/10 прямым текстом указывается сколько потоков в процессоре. Сразу под графиками есть блок с информацией. Там в строке «Логические процессоры» указано количество потоков процессора.

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

Способ № 2. Программы.

Пожалуй, самой известной программой для получения информации о характеристиках процессора является программа CPU-Z. Данная программа является бесплатной, и вы можете скачать ее с официального сайта. Если вы хотите узнать сколько потоков в процессоре, то вам нужно запустить CPU-Z на своем компьютере и посмотреть значение «Threads», которое находится в правом нижнем углу программы на вкладке «CPU». На скриншоте внизу видно, что у процессора 4 потока.

Кроме CPU-Z можно использовать и другие программы. Например, вы можете прибегнуть к бесплатной программе Speccy. Данная программа отображает массу технической информации о вашем компьютере.

Среди прочего с ее помощью можно узнать и количество потоков процессора. Для этого нужно перейти в раздел «CPU» и посмотреть значение «Threads».

Сколько ядер и потоков процессора нужно для игр в 2021 году

Четырьмя ядрами процессора уже давно никого не удивить, в последние время количество ядер и потоков в предлагаемых для настольного ПК центральных процессорах растёт с каждым годом. Поколение консолей с x86 архитектурой и 8 ядрами на борту уже готово смениться на следующее. Сколько же ядер нужно для игр прямо сейчас и в ближайшем будущем?

В идеальных условиях необходимо взять многоядерный процессор и протестировать все варианты отключения ядер. При этом надо сохранить идентичность внутренних взаимодействий и размер кеша. С другой стороны, такое исследование несет меньше пользы в реальном применении — размер кеша является одним из инструментов в разделении линеек. Поэтому многоядерные решения имеют большой размер кеша, а самые младшие процессоры в несколько раз меньше заветных МБ в L3.

На что влияет количество ядер

Любое действие на компьютере (запуск программ, развёртывание окошка, произведение анимации) – команда, отправляемая на выполнение процессору. Чем больше шагов одновременно выполняет пользователь, тем больше запросов в этот момент получает процессор. Причём количество команд, даже при малой активности пользователя, считается сотнями и тысячами, а не единицами, но и выполняет их процессор с огромной скоростью, измеряемой миллисекундами.

У каждого процессора свой придел загрузки — более производительные могут выполнять большее количество задач в единицу времени. Перегруженность приводит к тому, что вы начинаете видеть зависания на экране, некоторые программы перестают отвечать или аварийно закрываются.

Поскольку современные приложения становятся требовательнее, процессорам нельзя отставать. Развивать одно ядро бесконечно невозможно, поэтому было принято решение использовать несколько ядер в одном процессоре. Взаимодействуют они так: допустим, пользователь накликал 100 действий, тогда 50 из них будет решать первое ядро, а оставшиеся — второе. Конечно, на самом деле процедура распределения задач сложнее, но для общего понимания принципа этого достаточно. За счёт увеличения количества ядер уменьшается время, необходимое на выполнения всех требований пользователя. Чем больше ядер, тем больше «рабочих», обрабатывающих данные.

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

Как узнать количество потоков процессора

Для этого можно воспользоваться средствами операционной системы, паспортными данными или сторонними утилитами. Рассмотрим каждый из вариантов на примерах.

Диспетчер задач

Запустите утилиту комбинацией клавиш Ctrl + Shift + Esc и перейдите во вкладку Производительность. Ищите строчку Логических процессоров.

Сведения о системе

Нажмите Win + R и в открывшемся окне выполните команду msinfo32.

В правой части окна смотрите содержимое строчки Процессор.

Найдите свой процессор на официальном сайте и посмотрите данные в спецификации.

В бумажной документации эта информация также присутствует.

CPU-Z

Эта утилита отобразит все сведения о процессоре и других компонентах компьютера. Число потоков указано в строке Threads.

Другие информационные утилиты также покажут количество логических потоков, например AIDA64.

Windows PowerShell

Запустите инструмент через кнопку Пуск и выполните в нём команду:

WMIC CPU Get DeviceID,NumberOfCores,NumberOfLogicalProcessors

Нужное значение находится в третьем столбике.

Классификация потоков по уровню реализации

  1. Реализация потоков на уровне ядра. Проще говоря, это классическая 1:1 модель. Под эту категорию подпадают:
    • Потоки Win32.
    • Реализация Posix Threads в Linux — Native Posix Threads Library (NPTL). Дело в том, что до версии ядра 2.6 pthreads в Linux был целиком и полностью реализован в режиме пользователя (LinuxThreads). LinuxThreads реализовывалf модель 1:1 следующим образом: при создании нового потока, библиотека осуществляла системный вызов clone, и создавало новый процесс, который тем не менее разделял единое адресное пространство с родительским. Это породило множество проблем, к примеру потоки имели разные идентификаторы процесса, что противоречило некоторым аспектам стандарта Posix, которые касаются планировщика, сигналов, примитивов синхронизации. Также модель вытеснения потоков, работала во многих случаях с ошибками, по этому поддержку pthread решено было положить на плечи ядра. Сразу две разработки велись в данном направлении компаниями IBM и Red Hat. Однако, реализация IBM не снискала должной популярности, и не была включена ни в один из дистрибутивов, потому IBM приостановила дальнейшую разработку и поддержку библиотеки (NGPT). Позднее NPTL вошли в библиотеку glibc.
    • Легковесные ядерны потоки (Leight Weight Kernel Threads — LWKT), например в DragonFlyBSD. Отличие этих потоков, от других потоков режима ядра в том, что легковесные ядерные потоки могут вытеснять другие ядерные потоки. В DragonFlyBSD существует множество ядерных потоков, например поток обслуживания аппаратных прерываний, поток обслуживания программных прерываний и т.д. Все они работают с фиксированным приоритетом, так вот LWKT могут вытеснять эти потоки (preempt). Конечно это уже более специфические вещи, про которые можно говорить бесконечно, но приведу еще два примера. В Windows все потоки ядра выполняются либо в контексте потока инициировавшего системный вызов/IO операцию, либо в контексте потока системного процесса system. В Mac OS X существует еще более интересная система. В ядре есть лишь понятие task, т.е. задачи. Все операции ядра выполняются в контексте kernel_task. Обработка аппаратного прерывания, к примеру, происходит в контексте потока драйвера, который обслуживает данное прерывание.
  2. Реализация потоков в пользовательском режиме. Так как, системный вызов и смена контекста — достаточно тяжелые операции, идея реализовать поддержку потоков в режиме пользователя витает в воздухе давно. Множество попыток было сделано, однако данная методика популярности не обрела:
    • GNU Portable Threads — реализация Posix Threads в пользовательском режиме. Основное преимущество — высокая портабельность данной библиотеки, проще говоря она может быть легко перенесена на другие ОС. Проблему вытиснения потоков в данной библиотеке решили очень просто — потоки в ней не вытесняются 🙂 Ну и конечно ни о какой мультмпроцессорности речь идти не может. Данная библиотека реализует модель N:1.
    • Carbon Threads, которые я упоминал уже не раз, и RealBasic Threads.
  3. Гибридная реализация. Попытка использовать все преимущества первого и второго подхода, но как правило подобные мутанты обладают гораздо бОльшими недостатками, нежели достоинствами. Один из примеров: реализация Posix Threads в NetBSD по модели N:M, которая была посже заменена на систему 1:1. Более подробно вы можете прочесть в публикации Scheduler Activations: Effective Kernel Support for the User-Level Management of Parallelism.

Планирование

Операционные системы могут планировать потоки предварительно или совместно. Вытесняющая многопоточность обычно считается превосходным подходом, поскольку она позволяет операционной системе определять, когда должно произойти переключение контекста. Недостатком вытесняющей многопоточности является то, что система может осуществлять переключение контекста в неподходящее время, вызывая блокировку конвоя(англ. lock convoy), инверсию приоритета или другие негативные эффекты, которых может избежать совместная многопоточность. С другой стороны, совместная многопоточность полагается на то, что сами потоки отказываются от управления, когда они находятся в точке остановки. Это может создать проблемы, если поток ждет, когда ресурс станет доступным.

До начала 2000-х годов большинство настольных компьютеров имели только один одноядерный процессор без поддержки аппаратных потоков, хотя потоки все еще использовались на таких компьютерах, потому что переключение между потоками, как правило, было все же более быстрым, чем контекстные переключатели полного процесса. В 2002 году Intel добавила поддержку одновременной многопоточности процессора Pentium 4 под названием hyper-threading; В 2005 году они представили двухъядерный процессор Pentium D, а AMD представила двухъядерный процессор Athlon 64 X2.

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

Вместо итогов

Практика показывает, что современный универсальный ПК должен иметь в своем распоряжении как минимум 4 ядра/8 потоков, чего будет достаточно для большинства задач, связанных с обработкой данных. Хотя варианты из серии 6/12 выглядят более обещающими по той причине, что стоят они не намного дороже, а пользы от них больше.

В качестве «золотой» середины можем предложить свежий вариант модели, построенный на обновленной архитектуре Zen2. Он отлично справляется с играми, программами, распараллеливанием и обработкой данных, при этом отлично гонится(одним словом – стал популярным (появился в июле 2019)).

Надеемся, что вы почерпнули для себя полезную информацию, которая пригодится при подборе процессора для будущей системы. Следите за дальнейшими обновлениями, чтобы не пропустить новые статьи об анатомии ЦП.

С уважением Андрей Андреев