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

13760
Charles Burns

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

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

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

Processor affinity menu

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

3 ответа на вопрос

17
Breakthrough

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

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

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

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

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

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

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

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

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

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

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

4
David Schwartz

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

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

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

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

«Ядра 0-3 должны быть физическими ядрами, а 4-7 - виртуальными ядрами HT». На самом деле, ядро ​​0 и ядро ​​1 соответствуют одному (одному) физическому ядру. Каждое «гиперпоточное ядро» имеет два физических соединения с процессором, поэтому Windows буквально видит 8 физических ядер. Он просто знает, что процессор имеет гиперпоточность. Посмотрите таблицу Intel Core для более подробной информации об этом, если вы заинтересованы. Breakthrough 13 лет назад 4