Как работает сродство процессоров Windows с многопоточными процессорами? Давайте рассмотрим пример (на рисунке) системы с четырьмя ядрами, каждое с виртуальным ядром с гиперпоточностью.
- Какие ядра соответствуют каждому «процессору» ниже?
- Представляют ли (скажем) ЦП 6 и ЦП 7 ниже одно ядро; HT и реальное ядро?
- Если, например, CPU 6 представляет реальное ядро, а CPU 7 - ядро HT, получит ли поток, назначенный только на CPU7, только оставшиеся ресурсы реального ядра? (при условии, что ядро выполняет другие задачи)
- Управляется ли гиперпоточность полностью внутри процессора, чтобы потоки были внутренне обработаны? Если так, то это в области ЦП или основной области? Пример: если ЦП 6 и 7 представляют одно ядро, не имеет значения, для какого процесса назначен процесс, поскольку ЦП назначит ресурсы соответствующим образом для работающего потока?
- Я замечаю, что длительные однопоточные процессы довольно сильно смещены вокруг ядер, по крайней мере, по словам диспетчера задач. Означает ли это, что присвоение процесса одному ядру немного улучшит производительность (избегая переключений контекста и аннулирования кэша и т. Д.)? Если так, могу ли я знать, что я не назначаю «просто виртуальное ядро»?
Это все очень расплывчато и запутанно для меня. HT - это здорово, но, похоже, это снижает прозрачность распределения ресурсов.
windows
scheduling
hyper-threading
affinity
Чарльз Бернс
источник
источник
Ответы:
Предполагая, что у нас есть Core 1, 2, 3 и 4, CPU4 и CPU5 представляют ядро 3.
Между этими двумя понятиями нет различия: они оба имеют физические аппаратные интерфейсы с процессором, логический интерфейс реализован аппаратно ( более подробную информацию см. В техническом описании процессора Intel Core, том 1 ). По сути, каждое ядро имеет два отдельных исполнительных блока, но оно разделяет некоторые общие ресурсы между ними. Вот почему в некоторых случаях гиперпоточность может фактически снизить производительность.
Смотри выше. Поток, назначенный ТОЛЬКО CPU6 или ТОЛЬКО CPU7, будет работать с той же скоростью (при условии, что поток выполняет ту же самую работу, а другие ядра в процессоре находятся в режиме ожидания). Windows знает о HT-процессорах, и планировщик процессов учитывает это.
И то и другое. Сам фактическое оборудование не не планировать то , что ядра для запуска программ на, это работа операционной системы. Однако сам ЦП отвечает за распределение ресурсов между фактическими исполнительными блоками, и Intel диктует, как вы можете написать код, чтобы сделать его максимально эффективным.
Это нормальное поведение, и нет, назначение его одному ядру не улучшит производительность. При этом, если по какой-то причине вы хотите, чтобы один процесс выполнялся только на одном физическом ядре, назначьте его любому логическому процессору.
Причина, по которой процесс «отскакивает», связана с планировщиком процесса. Это нормальное поведение, и вы, скорее всего, будете испытывать снижение производительности, ограничивая число ядер, на которых может выполняться процесс (независимо от того, сколько потоков у него есть), поскольку планировщик процессов теперь должен работать усерднее, чтобы все работало с наложенными вами ограничениями. Да, этот штраф может быть незначительным в большинстве случаев, но суть в том, что если у вас нет причин для этого, не делайте этого !
источник
Компоновка ЦП должна быть организована таким образом, чтобы операционная система, которая не может распознать все ваши ЦП, получила максимально возможную производительность. Это будет означать, что одно виртуальное ядро от каждого физического ядра будет перечислено прежде, чем второе виртуальное ядро от любого физического ядра будет перечислено.
Например, скажем, у вас есть четыре гиперпоточных ядра, называемые 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 заполняет таблицу, в которой объясняется, какие ядра совместно используют исполнительные блоки, какие кэши и т. Д. Каждая современная операционная система, которую вы, вероятно, будете использовать, которая полностью поддерживает ваш процессор, понимает полную топологию процессора.
источник
В конечном итоге все сводится к тому, что вы (как конечный пользователь) часто мало что можете сделать с привязкой потоков к значительному влиянию на производительность, за исключением того, что вы используете современную ОС, которая знает о различных битах в ваша система.
Если вы обнаружите какие-либо рабочие нагрузки, в которых ручное назначение соответствия оказывает значительное влияние, сообщите об этом как об ошибке разработчику приложения, чтобы программа могла быть исправлена.
источник