Есть ли какой-нибудь простой тест производительности, чтобы определить, включен ли HT или нет?
Например, мне это нужно, когда максимальный номер процессора ограничен ядром Linux (NR_CPUS) и нет доступа к BIOS.
Можете ли вы посоветовать какой-либо код для обнаружения, если HT включен?
Есть и другой способ — файловая система / sys /, она должна быть более упорядоченной, чем / proc.
/ proc / cpuinfo варьируется в зависимости от версии ядра;
cat / sys / devices / system / cpu / cpu0 / topology / thread_siblings
дает вам список аппаратных потоков, которые работают вместе с ядром cpu0.
https://www.kernel.org/doc/Documentation/cputopology.txt
4) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
internal kernel map of cpuX's hardware threads within the same
core as cpuX
По линуксу думаю почитать можно /proc/cpuinfo
, но после этого вам нужно немного подумать, чтобы увидеть, есть ли у нас многоядерный процессор или процессор с поддержкой HT и т. д.
Первый, flags
предоставит вам поддерживаемые функции и ХТ там будет указывать на поддержку гиперпоточности.
Затем вы должны проверить, количество братьев и сестер Матчи количество ядер на каждом процессоре, так что ищите идентификатор процессора и вычтите оттуда. (Так что, если число братьев и сестер соответствует числу ядер -> нет HT)
Более подробную информацию можно найти здесь: http://richweb.com/cpu_info
Проверка флагов даст вам четкий ответ, тогда как тест производительности (особенно если программно проверяет результат) будет иметь некоторую неопределенность. Для какой характеристики производительности мы будем проверять сигнатуру Hyper-Threading (HT)? HT обеспечивает лучшую производительность, когда потоки выполняют различную работу, где разные определяются на основе микроархитектуры. Напротив, отдельные ядра имеют небольшую корреляцию производительности из-за кода, выполняемого на каждом ядре (некоторые факторы все еще существуют, например, пропускная способность памяти или общие кэши).
Существует множество комбинаций, которые вы можете проверить; Я нарисую здесь одно возможное решение. Предполагая, что в системе есть по крайней мере два ядра, которые также могут включать HT. Это представляет 4 логических процессора (LP), на которых могут быть запланированы потоки. Создайте однопоточную программу, которая может использовать ресурсы одного ядра. Теперь дублируйте эту работу, чтобы у нас было два потока, которые могут работать независимо друг от друга. Чтобы затем проверить производительность, установите привязку планирования потоков к разным парам LP в системе. Затем измерьте производительность для бега на разных парах. Пара HT даст другую производительность, чем пара отдельных ядер.
При написании теста производительности у вас есть обычные проблемы с измерением производительности. Обладает ли механизм измерения необходимой детализацией? Изменяется ли переменная, которую вы тестируете (HT по сравнению с ядром), но нет других переменных? Например, находится ли кэш в одном и том же состоянии перед каждым тестом? Или, некоторые ядра совместно используют кэши, поэтому их объединение в тесте даст производительность, отличную от других пар? Теперь, если вы делаете все это, вы должны наблюдать различные результаты производительности в зависимости от того, какую пару LP вы запланировали для своей работы.