#cpu #hyperthreading #superscalar
#процессор #гиперпоточность #суперскалярный
Вопрос:
Представьте процессор (или ядро), который является суперскалярным (несколько исполнительных модулей), а также поддерживает гиперпоточность (SMT).
Почему количество программных потоков, которые процессор может действительно выполнять параллельно, обычно определяется количеством логических ядер (т. Е. Так Называемых аппаратных потоков), которыми он обладает, а не Общим количеством исполнительных модулей, которые у него есть?
Если я правильно понимаю, SMT фактически не обеспечивает истинное параллельное выполнение, вместо этого он просто делает переключение контекста намного быстрее / эффективнее, дублируя определенные части CPU (те, которые хранят состояние архитектуры, но не основные ресурсы выполнения). С другой стороны, суперскалярная архитектура допускает истинное одновременное выполнение нескольких инструкций за такт, потому что процессор имеет несколько исполнительных блоков, то есть несколько параллельных конвейеров, каждый из которых может обрабатывать отдельный поток по-настоящему параллельным образом.
Так, например, если процессор имеет 2 ядра, и каждое ядро имеет 2 исполнительных модуля, не должен ли его аппаратный параллелизм (количество потоков, которые он действительно может выполнять параллельно) быть 4? Почему его аппаратный параллелизм вместо этого определяется количеством логических ядер, когда SMT фактически не обеспечивает истинное параллельное выполнение?
Ответ №1:
Вы не можете просто вставить инструкции в исполнительные модули.
Если вы хотите два 2-полосных SMT, вам нужно сохранить два архитектурных состояния и получить два потока команд.
Если в компании 100 разработчиков, но только два менеджера проектов, она может параллельно разрабатывать только два проекта (но она может одновременно разрабатывать больше, если каждый день или около того переключать проект PMs).
Если процессор может извлекать только из двух потоков команд (сохраняя только два контекста потоков), вы можете назначить ему только два потока для параллельного выполнения.
Однако вы можете сделать разделение по времени и выполнять больше потоков одновременно.
Программное обеспечение не имеет доступа к блокам выполнения, что привело бы к циклическому аргументу (программному обеспечению нужны EU для выполнения, но EU требуется программное обеспечение для выполнения).
Процессор попытается использовать как можно больше EU, используя неисправности и спекулируя на всем, что может.
На самом деле, гиперпоточность — это просто способ сохранить все ресурсы занятыми (например, поделиться разработчиком с другим PM, когда у них мало дел).
Но если все завершается неудачей и EU не используется, то эта возможная единица работы просто пропала даром.
Комментарии:
1. Спасибо за быстрый ответ. Вы хотите сказать, что EU не является полным автономным конвейером выполнения для CPU? К сожалению, я не смог найти четкого объяснения того, что такое EU, источники, которые я прочитал, говорят, что это либо один внутренний блок, такой как ALU или FPU, в то время как другие говорят, что это относится к группе внутренних компонентов (например, блок последовательности внутреннего управления, регистры,ALU FPU и так далее. Другими словами, полный конвейер, в который можно вставлять инструкции). Что вы думаете об этом? Еще раз спасибо.
2. @AdmiralAdama Оба определения принципиально эквивалентны. ЕС — это схема, которая принимает входные данные (операнды) и выдает результат. В обоих случаях входными данными EU являются операнды (константы, архитектурные регистры), а не инструкции, поэтому вам все еще нужно все остальное вокруг EUS. Точного определения EU нет, часть процессора, которая фактически преобразует входные данные в выходные, называется EU. Будучи синхронизирующей сетью вентилей, EU может иметь внутренние (невидимые) регистры, разреженную логику управления и т. Д. И Обычно конвейерно. Но он не может извлекать, декодировать и удалять инструкции.
3. Хорошо, похоже, что EU относится только к ALU / FPU / etc., а не к полномасштабному конвейеру, включающему ALU / FPU / etc, но также и к нескольким другим вещам за пределами указанного ALU / FPU, и которые могут обрабатывать инструкции. Ваше определение также объяснило бы, почему EU не = дополнительный аппаратный поток, который был моим первоначальным Q. Тем не менее, интересно, что # logical cores является мерой аппаратного параллелизма, поскольку SMT не обеспечивает истинное одновременное выполнение. Я думаю, это достаточно близко, поскольку существует фактический hw, поддерживающий поток hw (позволяющий хранить состояние archi и молниеносное переключение контекста)?
4. @AdmiralAdama На самом деле это так. SMT определяется либо как параллельное выполнение, либо как целые параллельные конвейеры. На процессорах Intel только первые этапы интерфейса (вероятно, только выборка и предварительное декодирование) не являются по-настоящему параллельными (смесь мелкозернистой вертикальной многопоточности и крупнозернистой многопоточности). Более поздние этапы обрабатывают инструкции обоих потоков параллельно. Это благодаря различным очередям в конвейере (например, IQ и IDQ для интерфейса). Происходит то, что один 4/6/7-полосный конвейер обрабатывает инструкции двух потоков независимо от источника.
5. Ах, хорошо, я неправильно понял ваш комментарий. Я думаю, что я правильно понимаю. С помощью SMT один конвейер может «видеть» и выбирать из обоих потоков (из-за наличия обоих состояний archi) при вводе в него инструкций, и это делает суперскалярные процессоры более эффективными, поскольку это позволяет процессору выполнять больше с каждым циклом. Другими словами, за цикл может быть использовано больше (почти все) внутренних частей / ресурсов процессора, чем без SMT.