Hyper-Threading на самом деле практически не работает
Hyper-Threading — это когда на самом деле у вашего процессора 4 ядра, а система думает, что ядер 8.
Через Task Manager
видно, что одна и та же однопоточная задача раньше занимала 25% процессора, а теперь лишь только 12.5% — и отсюда можно сделать вывод, что либо процессорной мощности стало вдвое больше, либо каждое ядро стало вдвое слабее, якобы «было 4 ядра по 4 GHz, а стало 8 ядер по 2 GHz.
Но всё это не так.
1. Производительность одного однопоточного приложения не изменяется. Нет разницы, включен или отключен гипер-треадинг, однопоточная программа будет работать с одинаковой скоростью.
А это значит, что частота одного ядра уж точно не стала меньше.
2. Если загрузить все 8 ядер, восьмью задачами, то общая производительность будет равна производительности без гипер треадинга, соответственно на 4 задачах.
Странно, не правда ли? И производительность ядра не упала, и ядер стало вдвое больше, но общая производительность осталась прежней.
3. Финальный эксперимент, который раскрывает тему окончательно: при включенном hyper threading’е 4 однопоточных приложения за единицу времени сделают такое же количество работы, как и 8 однопоточных приложений.
Получается так за счёт того, что от 1 до 4 приложения скейлятся линейно: 1 процесс делает х работы в единицу времени, 2 процесса делают 2х работы в ту же единицу, …, а вот начиная с 5 и далее, количество работы заморожено на пиковом значении 4 процессов, дальше лишь увеличивается время исполнения!
То есть 4 процесса за 10 минут посчитают по 10 функций каждый = 40 результатов.
8 процессов за 10 минут посчитают по 5 функций каждый = 40 результатов!
Речь идёт, напомню, о включенном гипер треадинге!
Получается, дополнительные ядра — не настоящие! Можно не обращать на них внимания и предполагать, что максимум производительности процессора при включенном HT находится на 50%.
Вот такая занимательная математика!
А теперь, объяснение. Я уже много лет назад читал, как работает гипертреадинг. Якобы, в потоках ядер остаются лишние пути исполнения, и чтобы они на тактах не простаивали, их-то HT и использует. Выжимает из ядер оставшиеся соки. Если задачи под это подходят.
Да, это буквально так и работает. 4 настоящих ядра работают на 100% своей производительности каждый, а 4 «виртуальных» ядра — очень слабые, никакие. Рассчитывать на них нельзя.
Под виндоусом, в условиях колоссальной многопоточности, само собой я рекомендую включать технологию Hyper Threading, и по логике, и даже по собственному опыту: среда по ощущениям чуть более отзывчивая, работать немного приятнее. И тем более теперь мы знаем, что включая эту технологию, мы ничего не теряем в скорости первых четырёх ядер.
Но нужно понимать, что максимум, на что способен ваш процессор, если смотреть на Task Manager
в такой конфигурации — это 50%. Всё, что выше — это уже реальное пропорциональное замедление исполнения.
Обсуждение
Откуда эти цифры-то? Поищи в интернете тесты других людей и сам попробуй.
Из моего личного опыта:
когда я писал пачку юнит тестов, пусть даже и в IDEA на Java, для прохождения курса по алгоритмам, то тесты в 1 поток ранались время Х, а в 8 потоков — время X/6. Обрати внимание, что не X/4 (ведь по факту 4 ядра), а X/6, что примерно равно ожиданиям Intel от HT.
C wiki: https://en.wikipedia.org/wiki/Hyper-threading#Performance_claims до 30% перформанса.
В моем случае были все 50% от 4х ядер, как-будто от 6ти.
Здравствуйте, Дмитрий. Цифры из собственных экспериментов с CPU-bound задачей: сложные запросы в mysql с InnoDB таблицами полностью в оперативной памяти.
Тесты-то я читал ещё много лет назад, и там были цифры от -15% до +60%, очевидно зависит от того, что во что упирается. Но вот теперь — пощупал это сам. Чем с вами и поделился.
То, что у вас 8 потоков отрабатывают быстрее, чем 4 потока — это я прекрасно верю. Это будет так, даже если HT отключите, я думаю. Сравните производительность своих тестов в одинаковых конфигурациях, одинаковым количеством потоков, но с включенным и отключенным HT. Делаю ставку на то, что никакой 50% разницы производительности, которую вы якобы пронаблюдали, не получится и близко.
Уберите барашка, он заебал.
Будет сделано, Сергей! :)
Готово, Сергей, проверяйте.
Теперь барашек гуляет не по всем страницам сразу, а по тем, на которых ему сегодня больше нравится.
В общем интересные рассуждения. Я полагал, что удвоение количества ядер реально увеличивает производительность. Но автор статьи доходчиво пояснил, что ничего подобного не происходит. Тем интереснее будет читать новые статьи. раскроются иные загадки.
Здравствуйте, Сергей. Важно понимать, что есть разница между реальными ядрами (cores) и потоками (threads). С помощью хитростей, разработчики делают из каждого реального ядра по два потока. Но ядро-то остаётся одно, несмотря на то, что рисует виндоус, или говорят маркетологи. Возможно небольшое увеличение производительности, но возможно и ухудшение.
Ну и даже в случае увеличения количества именно ядер, производительность будет возрастать только в задачах, которые поддерживают многопоточность. Типа конвертации видео. А вот например игры, как правило, могут упереться в производительность одного ядра, а другие ядра брать не попытаются. Поэтому для например игр часто хорошо чтобы была высокой именно частота одного ядра, потому что другие ядра всё равно использоваться не будут.