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

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

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

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

Меню настройки процессора

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

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

    Говорят, что CPU 6 и CPU 7 ниже представляют собой одно ядро; HT и реальное ядро?

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

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

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

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

    И то и другое. Фактическое аппаратное обеспечение не определяет, на каких ядрах запускать программы, это работа операционной системы. Однако сам процессор отвечает за совместное использование ресурсов между фактическими исполнительными единицами, а 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 заполняет таблицу, в которой объясняется, какие ядра разделяют исполняемые блоки, которые разделяют кеши и т. Д. Каждая современная операционная система, которую вы, скорее всего, используете, полностью поддерживает ваш процессор, понимает полную топологию процессора.

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

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

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

    Давайте будем гением компьютера.