1

Этот вопрос задается гуру Intel, который, как я знаю, там. Обращаются ли оба потока на физическом процессоре одинаково?

Как мы знаем, гиперпоточность на процессорах Intel - это система, в которой каждое физическое ядро представлено как 2 виртуальных ядра для ОС. Эти 2 виртуальных ядра дают процессору возможность переключаться между двумя исполнительными блоками (потоки @ виртуальные ядра) в контексте событий, которые неизвестны ОС (сбои страниц, другие внутренние процессы ЦП), которые обычно заставляют циклы ненужных ЦП ожидать другие события IO.

По умолчанию ОС не нужно учитывать гиперпоточность. Все ядра в конечном итоге выполнят свою работу, с той лишь разницей, что теперь не все видимые / виртуальные ядра могут работать с одинаковой скоростью. Запланированная работа для 2 потоков на одном физическом ядре (VCPU0 + 1 -> CPU 0) будет не такой быстрой, как запланированная работа на 2 разных ядрах (VCPU0 + 2 -> CPU 0 + 1).

Исходя из того, что я исследовал, ОС, поддерживающие «гиперпоточность», пойдут настолько далеко, что попытаются спланировать работу по физическим ядрам, прежде чем удвоить планирование «виртуальных ядер». Я обычно рассматриваю это как «четный» VCPU, запланированный первым (заполните VCPU 0+2 до 1+3). Равны ли и четные, и нечетные потоки? (на самом деле это не виртуальный процессор с «гиперпоточностью»).

Другими словами, нет ли первичного / вторичного «потока» для физического ЦП? Если я планирую работу только на VCPU 1, будет ли он работать так же, как если бы я только что запланировал на VCPU 0? Предполагая, что, если для обоих запланирована одинаковая работа, потребуется ли примерно вдвое больше времени для завершения обоих потоков?

1 ответ1

3

Обращаются ли оба потока на физическом процессоре одинаково?

Да. Нет предпочтения в распределении ресурсов выполнения ядра одному потоку или другому. (Что такое "ресурс выполнения"? Смотрите статью, на которую я ссылаюсь ниже. Но примерами являются такие вещи, как архитектурные регистры (IP, SP, EAX и т.д.), "Исполнительные блоки", которые реализуют определенные операции, такие как арифметика и т.д.)

Как мы знаем, гиперпоточность на процессорах Intel - это система, в которой каждое физическое ядро представлено как 2 виртуальных ядра для ОС.

На самом деле он представлен просто как две вещи, которые кажутся операционной системе "ядром", или двумя "логическими процессорами", как их называет Windows. (Несмотря на то, что утверждал Ramhound.) Если у вас отключен HT, то у каждого ядра только один LP, поэтому используется та же терминология.

Если у вас ОС, не поддерживающая HT, тогда ваше ядро с включенным HT будет выглядеть как два ядра и будет перечисляться и использоваться ОС таким образом. Фактически это имело место в Windows 2000, которая вообще не знала о HT.

Эти 2 виртуальных ядра дают процессору возможность переключаться между двумя исполнительными блоками (потоки @ виртуальные ядра) в контексте событий, которые неизвестны ОС (сбои страниц, другие внутренние процессы ЦП), которые обычно заставляют циклы ненужных ЦП ожидать другие события IO.

На самом деле это не так (а я бы добавил, что ошибки страниц наиболее известны ОС! Возможно, вы думаете о задержке доступа к памяти). Процессор с поддержкой HT не делает ничего похожего на переключение контекста на уровне ОС между потоками. Помните, ядро HT фактически перечисляет как два разных (логических) процессора, каждый со своим собственным набором архитектурных регистров и т.д. При переключении контекста потока содержимое этих регистров копируется в память (в объекте потока), и регистры загружен из сохраненного контекста какого-либо другого потока. Этого не происходит в HT, потому что эти регистры (и многие другие ресурсы) дублируются двумя LP. Таким образом, состояние каждого LP поддерживается непрерывно в CPU.

Но есть и другие ресурсы, которые не дублируются. HT позволяет встроенному программному обеспечению процессора использовать ресурсы выполнения, ресурсы, которые были бы потрачены впустую, если бы работал только один LP, для поддержки действий второго LP. Вот действительно хорошее описание: http://arstechnica.com/features/2002/10/hyperthreading/

По умолчанию ОС не нужно учитывать гиперпоточность. Все ядра в конечном итоге выполнят свою работу, с той лишь разницей, что теперь не все видимые / виртуальные ядра могут работать с одинаковой скоростью. Запланированная работа для 2 потоков на одном физическом ядре (VCPU0 + 1 -> CPU 0) будет не такой быстрой, как запланированная работа на 2 разных ядрах (VCPU0 + 2 -> CPU 0 + 1).

Все верно. Windows 2000 вообще не знала о HT, но когда она работала на одном ядре ЦП с включенной HT, она "видела" два процессора и использовала их. (Из-за порядка перечисления с ранними версиями прошивки для таких платформ, если бы вы работали с версией Windows 2000, которая поддерживала только два процессора, она, к сожалению, использовала бы два LP в одном из пакетов процессора! Позднее это было исправлено обновлением прошивки ("BIOS"), которое изменило порядок появления LP в таблицах ACPI.)

Исходя из того, что я исследовал, ОС, поддерживающие «гиперпоточность», пойдут настолько далеко, что попытаются спланировать работу по физическим ядрам, прежде чем удвоить планирование «виртуальных ядер».

Windows, конечно, делает. Они пытаются использовать только один LP на ядро. Например, при поиске незанятого LP для запуска нового потока Ready, планировщик Windows сначала пытается найти незанятые LP, которые находятся в ядре, где оба LP простаивают.

Я обычно рассматриваю это как «четный» VCPU, запланированный первым (заполните VCPU 0+2 до 1+3). Равны ли и четные, и нечетные потоки?

Ну, они равны в том, что в ядре нет встроенного смещения для одного LP над другим. Может случиться так, что один получится выполнить работу быстрее, чем другой, потому что поток, работающий на одном, требует меньше ресурсов для выполнения, чем другой.

Между прочим, в HT есть недостаток: центральный процессор с поддержкой HT не реализует концепцию приоритета между двумя LP. Допустим, у вас есть два связанных с вычислениями потока, которые для ОС имеют различный приоритет. По правилам ОС, если бы у вас был только один логический процессор, поток с более высоким приоритетом получал бы практически все процессорное время. Но предположим, что вместо этого у нас есть два бесплатных LP, которые находятся в одном ядре. Микропрограмма ядра будет пытаться запустить их примерно одинаково, даже если это не совсем то, чего хочет ОС. (По крайней мере, в последний раз, когда я смотрел на эти детали, это было так.)

(на самом деле это не виртуальный процессор с «гиперпоточностью»). Другими словами, нет ли первичного / вторичного «потока» для физического ЦП?

Правильный. Нет. Кстати, процессоры и ядра процессоров "не имеют потоков". Логический процессор может запустить поток. Чем больше пластинок у вас есть, тем больше потоков может быть "вычислительным" одновременно.

Если я планирую работу только на VCPU 1, будет ли он работать так же, как если бы я только что запланировал на VCPU 0?

Да.

Предполагая, что, если для обоих запланирована одинаковая работа, потребуется ли примерно вдвое больше времени для завершения обоих потоков?

Ну нет. Весь смысл HT в том, что ядро обычно имеет больше ресурсов для выполнения, чем может использовать какой-либо один поток. Представляя ядро как два LP, два потока могут работать "одновременно" и иметь меньше ресурсов выполнения, бездействующих. С большинством потоков вы можете ожидать, что ваши два потока будут завершены где-то между 1.4x и 1.7x временем, которое занял бы только один из них.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .