Гиперпоточность и суперскалярное исполнение
Представьте себе процессор (или ядро), который является суперскалярным (несколько исполнительных блоков), а также имеет поддержку гиперпоточности (SMT).
Почему количество программных потоков, которые ЦП может действительно выполнять параллельно, обычно определяется количеством логических ядер (то есть так называемых аппаратных потоков), которым оно обладает, а не общим количеством исполнительных блоков, которые оно имеет?
Если я правильно понимаю, SMT на самом деле не позволяет выполнять истинное параллельное выполнение, а просто делает переключение контекста намного быстрее / эффективнее, дублируя определенные части ЦП (те, которые хранят архитектурное состояние, но не основные ресурсы выполнения). С другой стороны, суперскалярная архитектура допускает истинное одновременное выполнение нескольких инструкций за такт, потому что ЦП имеет несколько исполнительных блоков, то есть несколько параллельных конвейеров, каждый из которых может обрабатывать отдельный поток в истинно параллельном режиме.
Так, например, если ЦП имеет 2 ядра, а каждое ядро имеет 2 исполнительных блока, разве его аппаратный параллелизм (количество потоков, которые он может выполнять параллельно) не должен быть равен 4? Почему его аппаратный параллелизм задается количеством логических ядер, когда SMT фактически не обеспечивает истинное параллельное выполнение?
1 ответ
Вы не можете просто бросить инструкции в исполнительные единицы.
Если вам нужны два двухсторонних SMT, вам нужно сохранить два архитектурных состояния и извлечь два потока инструкций.
Если у компании есть 100 разработчиков, но только два менеджера проектов, она может разрабатывать только два проекта параллельно (но она может одновременно разрабатывать больше, если она заставляет менеджеров по проектам переключать проект каждый день или около того).
Если ЦП может выбирать только из двух потоков инструкций (сохраняя только два контекста потока), вы можете назначить ему только два потока для параллельного выполнения.
Однако вы можете сделать разделение по времени и одновременно выполнять больше потоков.
Программное обеспечение не имеет доступа к исполнительным блокам, что может привести к круговому аргументу (программное обеспечение требует выполнения ЕС, но для выполнения требуется программное обеспечение ЕС).
Процессор постарается использовать как можно больше стран ЕС, используя неупорядоченную систему и спекулируя на чем угодно.
На самом деле, гиперпоточность - это просто способ сохранить все ресурсы занятыми (например, поделиться разработчиком с другим менеджером, когда у них мало работы).
Но если все терпит неудачу и ЕС не используется, то эта возможная единица работы просто теряется.