Linux выяснил Hyper-Threading ID ядра - PullRequest
       76

Linux выяснил Hyper-Threading ID ядра

10 голосов
/ 01 сентября 2011

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

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

Ответы [ 5 ]

29 голосов
/ 18 октября 2011

Я обнаружил простой способ сделать то, что мне нужно.

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

Если первое число равно номеру процессора (0 в этом примере), то это реальное ядро, если нет, то этоЯдро с гиперпоточностью.

Пример реального ядра:

# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13

Пример с ядром Hyperthreading

# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13

Вывод второго примера точно такой же, как и в первом.Однако мы проверяем cpu13, и первое число - 1, поэтому ЦП 13 - это ядро ​​с гиперпоточностью.

11 голосов
/ 01 сентября 2011

HT симметричен (с точки зрения базовых ресурсов системный режим может быть асимметричным).

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

Существует различие между ядром с отключенным HT и ядром с включенным HT;но нет никакой разницы между первой половиной ядра с поддержкой HT и второй половиной ядра с поддержкой HT.

В один момент времени один HT-поток может использовать больше ресурсов, чем другой, но эта балансировка ресурсов является динамической.Процессор будет балансировать потоки так, как он может, и как он хочет, если оба потока хотят использовать один и тот же ресурс.Вы можете сделать только rep nop или pause в одном потоке, чтобы процессор мог выделять больше ресурсов другому потоку.

Я хочу найти эту информацию и использовать set_affinity () для привязки процессадля гиперпоточного потока или не гиперпоточного потока для профилирования его производительности.

Хорошо, вы на самом деле можете измерить производительность, не зная фактов.Просто создайте профиль, когда единственный поток в системе связан с CPU0;и повторите это, когда он привязан к CPU1.Я думаю, результаты будут почти одинаковыми (ОС может генерировать шум, если она связывает некоторые прерывания с CPU0; поэтому постарайтесь уменьшить количество прерываний, когда выполняете тестирование, и попробуйте использовать CPU2 и CPU3, если они у вас есть).

PS

Агнер (он Гуру в x86) рекомендует использовать четные ядра в том случае, если вы не хотите использовать HT, но он включен в BIOS:

Если обнаружена гиперпоточность, заблокируйте процесс, чтобы использовать только четные логические процессоры.Это приведет к тому, что один из двух потоков в каждом ядре процессора будет бездействовать, чтобы не было конкуренции за ресурсы.

PPS О новой реинкарнации HT (не на основе P4, а на базе Nehalem и Sandy)исследования Агнера по микроархитектуре

Новые узкие места, требующие внимания в Sandy Bridge, следующие: ... 5. Совместное использование ресурсов между потоками.Многие критические ресурсы распределяются между двумя потоками ядра при включенной гиперпоточности.Может быть целесообразно отключить гиперпоточность, когда несколько потоков зависят от одних и тех же ресурсов выполнения.

...

В NetBurst было представлено решение на полпути иснова в Nehalem и Sandy Bridge с помощью так называемой технологии Hyperthreading.Процессор с гиперпоточностью имеет два логических процессора, использующих одно и то же ядро.Преимущество этого ограничено, если два потока конкурируют за одни и те же ресурсы, но гиперпоточность может быть весьма полезной, если производительность ограничена чем-то другим, например доступом к памяти.

...

И Intel, и AMD создают гибридные решения, в которых некоторые или все исполнительные блоки совместно используются двумя ядрами процессора (гиперпоточность в терминологии Intel).

PPPS: В книге Intel Optimization перечислены общие ресурсы в HT второго поколения: (стр. 93, этот список предназначен для Nehalem, но в разделе Sandy нет изменений в этом списке)

Более глубокая буферизация и улучшенаполитики совместного использования ресурсов / раздела:

  • - Реплицируемый ресурс для операции HT: состояние регистра, переименованный буфер стека возврата, ITLB большой страницы // комментарий от меня: есть 2 набора этого HW
  • - Распределенные ресурсы для работы HT: буферы загрузки, буферы хранения, буферы переупорядочения, ITLB небольших страниц - статическиеРаспределение между двумя логическими процессорами.// комментарий от меня: есть один набор этого HW;он статически разделен между двумя виртуальными ядрами HT на две половины
  • - Ресурс с конкурентным разделением при работе HT: станция резервирования, кэшиерархия, заполнить буферы, как DTLB0, так и STLB. // комментарий: один набор, но не разделенный пополам. Процессор будет динамически перераспределять ресурсы.
  • - Чередование во время работы HT: работа внешнего интерфейса обычно чередуется между двумя логическими процессорами для обеспечения справедливости. // комментарий: существует один интерфейс (декодер инструкций), поэтому потоки будут декодироваться в следующем порядке: 1, 2, 1, 2.
  • - HT незнающие ресурсы: исполнительные единицы. // комментарий: есть фактические устройства hw, которые выполняют вычисления, обращаются к памяти. Есть только один набор. Если один из потоков способен использовать много исполнительных блоков и если у него небольшое количество ожиданий памяти, он будет использовать все исполнительные блоки, а производительность второго потока будет низкой (но HT иногда переключается на второй поток. Как часто? ??). Если оба потока не сильно оптимизированы и / или ожидают памяти, исполнительные блоки будут разделены между двумя потоками.

На стр. 112 также есть рисунки (Рисунок 2-13), на которых показано, что оба логических ядра симметричны.

Потенциал производительности благодаря технологии HT обусловлен:

  • • Тот факт, что операционные системы и пользовательские программы могут планировать процессы или потоки для одновременного выполнения на логических процессорах в каждом физическом процессор
  • • Возможность использовать встроенные ресурсы исполнения на более высоком уровне, чем когда один поток потребляет ресурсы выполнения; более высокий уровень ресурса использование может привести к повышению пропускной способности системы

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

6 голосов
/ 15 декабря 2016

Я удивлен, что никто еще не упомянул lscpu. Вот пример системы с одним сокетом с четырьмя физическими ядрами и включенной гиперпоточностью:

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,0,0,0,,0,0,0,0
5,1,0,0,,1,1,1,0
6,2,0,0,,2,2,2,0
7,3,0,0,,3,3,3,0

Вывод объясняет, как интерпретировать таблицу идентификаторов; логические идентификаторы ЦП с одинаковым идентификатором ядра являются родственными.

2 голосов
/ 01 марта 2015

Существует универсальный (Linux / Windows) и портативный HW-детектор топологии (ядра, HT, какаши, южные мосты и локальное подключение диска / сети) - hwloc по проекту OpenMPI. Вы можете использовать его, потому что linux может использовать разные правила нумерации ядра HT, и мы не можем знать, будет ли это четное / нечетное правило или правило нумерации y и y + 8.

Домашняя страница hwloc: http://www.open -mpi.org / проекты / hwloc /

Страница загрузки: http://www.open -mpi.org / Программное обеспечение / hwloc / v1.10 /

Описание:

Программный пакет Portable Hardware Locality (hwloc) обеспечивает переносимое абстрагирование (для разных ОС, версий, архитектур, ...) иерархической топологии современных архитектур, включая узлы памяти NUMA, сокеты, общие кэши, ядра и одновременную многопоточность. , Он также собирает различные системные атрибуты, такие как информация о кеше и памяти, а также расположение устройств ввода-вывода, таких как сетевые интерфейсы, InfiniBand HCA или GPU. Он в первую очередь направлен на то, чтобы помочь приложениям собирать информацию о современном компьютерном оборудовании, чтобы использовать его соответствующим образом и эффективно.

Имеет команду lstopo для получения топологии hw в графической форме, например

 ubuntu$ sudo apt-get hwloc
 ubuntu$ lstopo

lstopo from hwloc (OpenMPI) - output example

или в текстовом виде:

 ubuntu$ sudo apt-get hwloc-nox
 ubuntu$ lstopo --of console

Мы можем видеть физические ядра как Core L#x, каждое из которых имеет два логических ядра PU L#y и PU L#y+8.

Machine (16GB)
  Socket L#0 + L3 L#0 (4096KB)
    L2 L#0 (1024KB) + L1 L#0 (16KB) + Core L#0
      PU L#0 (P#0)
      PU L#1 (P#8)
    L2 L#1 (1024KB) + L1 L#1 (16KB) + Core L#1
      PU L#2 (P#4)
      PU L#3 (P#12)
  Socket L#1 + L3 L#1 (4096KB)
    L2 L#2 (1024KB) + L1 L#2 (16KB) + Core L#2
      PU L#4 (P#1)
      PU L#5 (P#9)
    L2 L#3 (1024KB) + L1 L#3 (16KB) + Core L#3
      PU L#6 (P#5)
      PU L#7 (P#13)
  Socket L#2 + L3 L#2 (4096KB)
    L2 L#4 (1024KB) + L1 L#4 (16KB) + Core L#4
      PU L#8 (P#2)
      PU L#9 (P#10)
    L2 L#5 (1024KB) + L1 L#5 (16KB) + Core L#5
      PU L#10 (P#6)
      PU L#11 (P#14)
  Socket L#3 + L3 L#3 (4096KB)
    L2 L#6 (1024KB) + L1 L#6 (16KB) + Core L#6
      PU L#12 (P#3)
      PU L#13 (P#11)
    L2 L#7 (1024KB) + L1 L#7 (16KB) + Core L#7
      PU L#14 (P#7)
      PU L#15 (P#15)
1 голос
/ 12 апреля 2014

Я попытался проверить информацию, сравнив температуру ядра и нагрузку на ядро ​​HT.

enter image description here

...