Как работает сродство процессоров Windows с многопоточными процессорами?

27

Как работает сродство процессоров Windows с многопоточными процессорами? Давайте рассмотрим пример (на рисунке) системы с четырьмя ядрами, каждое с виртуальным ядром с гиперпоточностью.

  1. Какие ядра соответствуют каждому «процессору» ниже?
  2. Представляют ли (скажем) ЦП 6 и ЦП 7 ниже одно ядро; HT и реальное ядро?
  3. Если, например, CPU 6 представляет реальное ядро, а CPU 7 - ядро ​​HT, получит ли поток, назначенный только на CPU7, только оставшиеся ресурсы реального ядра? (при условии, что ядро ​​выполняет другие задачи)
  4. Управляется ли гиперпоточность полностью внутри процессора, чтобы потоки были внутренне обработаны? Если так, то это в области ЦП или основной области? Пример: если ЦП 6 и 7 представляют одно ядро, не имеет значения, для какого процесса назначен процесс, поскольку ЦП назначит ресурсы соответствующим образом для работающего потока?
  5. Я замечаю, что длительные однопоточные процессы довольно сильно смещены вокруг ядер, по крайней мере, по словам диспетчера задач. Означает ли это, что присвоение процесса одному ядру немного улучшит производительность (избегая переключений контекста и аннулирования кэша и т. Д.)? Если так, могу ли я знать, что я не назначаю «просто виртуальное ядро»?

Это все очень расплывчато и запутанно для меня. HT - это здорово, но, похоже, это снижает прозрачность распределения ресурсов.

Меню соответствия процессоров

Чарльз Бернс
источник
Просто чтобы вы знали, каждое ядро ​​процессора, которое вы видите, является «виртуальным ядром». Каждый из них имеет физическое соединение с процессором, термин «виртуальный» происходит от того, как Windows планирует процессы на этих процессорах из-за аппаратной реализации гиперпоточности. Смотрите мой ответ для более подробной информации.
Прорыв
Кроме того, последний комментарий для вас. «HT - это здорово, но, похоже, это снижает прозрачность распределения ресурсов». Это 100% верно, но есть мало вы можете сделать об этом, и не существует много причин для Вас , чтобы сделать что - нибудь об этом. Все современные операционные системы знают, что такое гиперпоточность, у большинства есть продвинутые планировщики процессоров, чтобы компенсировать это, и, за исключением нескольких конкретных случаев (и я имею в виду несколько), почти всегда выигрыш в производительности.
Прорыв

Ответы:

18

Какие ядра соответствуют каждому «процессору» ниже?

Предполагая, что у нас есть Core 1, 2, 3 и 4, CPU4 и CPU5 представляют ядро ​​3.

Представляют ли (скажем) ЦП 6 и ЦП 7 ниже одно ядро; HT и реальное ядро?

Между этими двумя понятиями нет различия: они оба имеют физические аппаратные интерфейсы с процессором, логический интерфейс реализован аппаратно ( более подробную информацию см. В техническом описании процессора Intel Core, том 1 ). По сути, каждое ядро ​​имеет два отдельных исполнительных блока, но оно разделяет некоторые общие ресурсы между ними. Вот почему в некоторых случаях гиперпоточность может фактически снизить производительность.

Если, например, CPU 6 представляет реальное ядро, а CPU 7 - ядро ​​HT, получит ли поток, назначенный только на CPU7, только оставшиеся ресурсы реального ядра? (при условии, что ядро ​​выполняет другие задачи)

Смотри выше. Поток, назначенный ТОЛЬКО CPU6 или ТОЛЬКО CPU7, будет работать с той же скоростью (при условии, что поток выполняет ту же самую работу, а другие ядра в процессоре находятся в режиме ожидания). Windows знает о HT-процессорах, и планировщик процессов учитывает это.

Управляется ли гиперпоточность целиком внутри процессора так, что потоки внутренне обрабатываются? Если так, то это в области ЦП или основной области? Пример: если ЦП 6 и 7 представляют одно ядро, не имеет значения, для какого процесса назначен процесс, поскольку ЦП назначит ресурсы соответствующим образом для работающего потока?

И то и другое. Сам фактическое оборудование не не планировать то , что ядра для запуска программ на, это работа операционной системы. Однако сам ЦП отвечает за распределение ресурсов между фактическими исполнительными блоками, и Intel диктует, как вы можете написать код, чтобы сделать его максимально эффективным.

Я замечаю, что длительные однопоточные процессы довольно сильно смещены вокруг ядер, по крайней мере, по словам диспетчера задач. Означает ли это, что присвоение процесса одному ядру немного улучшит производительность (избегая переключений контекста и аннулирования кэша и т. Д.)? Если так, могу ли я знать, что я не назначаю «просто виртуальное ядро»?

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

Причина, по которой процесс «отскакивает», связана с планировщиком процесса. Это нормальное поведение, и вы, скорее всего, будете испытывать снижение производительности, ограничивая число ядер, на которых может выполняться процесс (независимо от того, сколько потоков у него есть), поскольку планировщик процессов теперь должен работать усерднее, чтобы все работало с наложенными вами ограничениями. Да, этот штраф может быть незначительным в большинстве случаев, но суть в том, что если у вас нет причин для этого, не делайте этого !

Прорвать
источник
5

Компоновка ЦП должна быть организована таким образом, чтобы операционная система, которая не может распознать все ваши ЦП, получила максимально возможную производительность. Это будет означать, что одно виртуальное ядро ​​от каждого физического ядра будет перечислено прежде, чем второе виртуальное ядро ​​от любого физического ядра будет перечислено.

Например, скажем, у вас есть четыре гиперпоточных ядра, называемые A, B, C и D. Если вы предполагаете, что A и B совместно используют кэш L2, а C и D совместно используют кэш L2, порядок должен быть примерно таким:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

Таким образом, операционная система, которая захватывает только два процессора, получает возможность использовать весь кэш L2. Кроме того, операционная система, которая захватывает только четыре процессора, получает возможность использовать все исполнительные блоки.

Опять же, так и должно быть.

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

Дэвид Шварц
источник
1
  1. Их соответствие зависит от того, как ваш процессор и материнская плата подсчитывают и определяют ядра. Предполагается, что сначала перечисляются физические сокеты, затем логические ядра, а затем виртуальные ядра. В вашем случае ядра 0-3 должны быть физическими ядрами, а 4-7 - виртуальными ядрами HT. Основная причина этого заключается в том, что в случае запуска ОС, которая не в состоянии обрабатывать все доступные исполнительные блоки, наиболее вероятно, что они получат самые независимые блоки в первую очередь перед общими. Было бы нехорошо, если бы гипотетическая ОС с двумя ЦП нашла пару HT в вашей системе вместо двух отдельных ядер. (Это было реальной проблемой для некоторых ранних систем HT, прежде чем планировщики ядра могли быть обновлены для новых процессоров.)
  2. См. 1.
  3. Нет. ХТ сложнее, чем это. Помните, что два виртуальных ядра часто совместно используют одни ресурсы, в то время как другие биты разделены, но одновременно может выполняться только одно или другое.
  4. Вроде, как бы, что-то вроде. Ваш пример (с учетом предположений) в целом правильный. Однако, если приложение может знать, какую рабочую нагрузку оно выполняет, оно может помочь ОС правильно планировать потоки.
  5. Есть очень веская причина для скачкообразного изменения сердечника: распространение тепловой нагрузки вокруг. Учитывая, что во многих случаях кэши более высокого уровня (L2, L3) в любом случае совместно используются всеми ядрами, скачкообразное изменение ядра не окажет существенного влияния на производительность, но тепловое воздействие будет значительным, поскольку у вас не будет «горячей точки» на одно ядро ​​постоянно работает, а остальные бездействуют. Теперь пересечение розеток в системе с несколькими сокетами (особенно в системе NUMA) может оказать существенное влияние на производительность. Большинство планировщиков знают об этом и принимают это во внимание.

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

Если вы обнаружите какие-либо рабочие нагрузки, в которых ручное назначение соответствия оказывает значительное влияние, сообщите об этом как об ошибке разработчику приложения, чтобы программа могла быть исправлена.

afrazier
источник
4
«Ядра 0-3 должны быть физическими ядрами, а 4–7 - виртуальными ядрами HT». На самом деле, ядро ​​0 и ядро ​​1 соответствуют одному (одному) физическому ядру. Каждое «гиперпоточное ядро» имеет два физических соединения с процессором, поэтому Windows буквально видит 8 физических ядер. Он просто знает, что процессор имеет гиперпоточность. Посмотрите таблицу Intel Core для более подробной информации об этом, если вы заинтересованы.
Прорыв
@Breakthrough Это не будет хорошей топологией, потому что это будет означать, что наивная ОС, которая поддерживает только 4 ядра, будет работать только с половиной физических ядер. Одно виртуальное ядро ​​от каждого физического ядра должно появиться в списке виртуальных ядер, прежде чем появится второе виртуальное ядро ​​из любого физического ядра.
Дэвид Шварц
@DavidSchwartz Хорошая топология или нет, так перечисляют логические процессоры. Поэтому широко рекомендуется отключить гиперпоточность в ранних ОС (например, Windows 2000 и более ранних), которые неправильно перечисляют LPs по сравнению с ядрами по сравнению с физическими пакетами ЦП.
Джейми Ханрахан