Linux узнать идентификатор ядра Hyper-threading

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

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


person Patrick    schedule 01.09.2011    source источник
comment
Обычно либо все ядра имеют гиперпоточность, либо ни одно ядро. Или я ошибаюсь в этом предположении?   -  person knittl    schedule 01.09.2011
comment
Да, если HT включен, каждое физическое ядро ​​будет иметь 2 потока (1 физический + 1 HT). В программном обеспечении оба потока обрабатываются одинаково, но у них будет разный идентификатор процессора (в Linux). Я хотел бы узнать, какой идентификатор принадлежит физическому потоку, а какой - потоку HT.   -  person Patrick    schedule 01.09.2011
comment
Какой у вас процессор? P4 или Core2 или Corei7 или Atom?   -  person osgx    schedule 01.09.2011


Ответы (6)


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

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 — это ядро ​​с гиперпоточностью.

person Patrick    schedule 18.10.2011
comment
У меня не работает на гипервизоре Xen: ls -l cpu0/topology/ total 0 ----- uname -a: Linux XXXX 2.6.18-128.2.1.4.37.el5xen #1 SMP, сб, 9 апр., 05:30: 32 EDT 2011 i686 i686 i386 GNU/Linux - person Joe Casadonte; 17.08.2012
comment
Можно ли получить что-то возможное на окнах? - person Tomas Kubes; 12.04.2014

Я удивлен, что никто еще не упомянул 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

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

person Connor Doyle    schedule 15.12.2016
comment
Но какой брат является ядром HT? - person Aaron Copley; 30.12.2016
comment
Они одноранговые, нет основного ядра и ядра гиперпотока 2-го класса. - person Connor Doyle; 11.01.2017

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

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

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

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

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

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

PS

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

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

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

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

...

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

...

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

PPPS: Книга Intel Optimization перечисляет совместное использование ресурсов в HT второго поколения: (стр. 93, этот список предназначен для nehalem, но в разделе Sandy этот список не изменяется)

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

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

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

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

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

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

person osgx    schedule 01.09.2011
comment
Ты так много сказал, ничего не сказав. - person suprjami; 13.07.2016
comment
Он отмечен как правильный ответ, прокрутите вверх и найдите большую зеленую галочку. - person suprjami; 15.07.2016
comment
Это очень исчерпывающий ответ. Спасибо - person DAG; 14.09.2016

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

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

Страница загрузки: http://www.open-mpi.org/software/hwloc/v1.10/

Описание:

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

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

 ubuntu$ sudo apt-get hwloc
 ubuntu$ lstopo

lstopo из hwloc (OpenMPI) - пример вывода

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

 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)
person osgx    schedule 28.02.2015

Простой способ получить гиперпотоковые братья и сестры ядер процессора в bash:

cat $(find /sys/devices/system/cpu -regex ".*cpu[0-9]+/topology/thread_siblings_list") | sort -n | uniq

Также есть lscpu -e, который даст соответствующую информацию о ядре и процессоре:

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0       yes    4100.0000 400.0000
1   0    0      1    1:1:1:0       yes    4100.0000 400.0000
2   0    0      2    2:2:2:0       yes    4100.0000 400.0000
3   0    0      3    3:3:3:0       yes    4100.0000 400.0000
4   0    0      0    0:0:0:0       yes    4100.0000 400.0000
5   0    0      1    1:1:1:0       yes    4100.0000 400.0000
6   0    0      2    2:2:2:0       yes    4100.0000 400.0000
7   0    0      3    3:3:3:0       yes    4100.0000 400.0000
person Orsiris de Jong    schedule 09.10.2019

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

введите здесь описание изображения

person Tomas Kubes    schedule 12.04.2014
comment
Ваш метод странный и может не сработать. Попробуйте hwloc: open-mpi.org/projects/hwloc у него есть win32 и win64. варианты - person osgx; 01.03.2015