В чем разница между супермасштабированием и конвейерной обработкой?

StackOverflow https://stackoverflow.com/questions/1656608

  •  11-09-2019
  •  | 
  •  

Вопрос

Что ж, вопрос выглядит слишком простым, чтобы его задавать, но я задал его после нескольких вопросов по обоим вопросам.

Оба метода увеличивают пропускную способность команд.И супермасштабирование почти всегда использует конвейерную обработку.Супермасштабирование имеет более одного исполнительного блока, как и конвейерная обработка, или я ошибаюсь?

Это было полезно?

Решение

Суперскалярный дизайн предполагает способность процессора выдавать несколько инструкций за один такт с резервными средствами для выполнения инструкций.Заметьте, мы говорим об одном ядре — многоядерная обработка отличается.

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

Они почти всегда используются вместе.На этом изображении из Википедии показаны обе концепции в использовании, поскольку эти концепции лучше всего объясняются графически:

Superscalar/pipelining in use

Здесь две инструкции выполняются одновременно в пятиэтапном конвейере.


Чтобы разбить его дальше, учитывая ваше недавнее редактирование:

В приведенном выше примере инструкция проходит 5 этапов перед «выполнением».Это IF (выборка инструкций), ID (декодирование инструкций), EX (выполнение), MEM (обновление памяти), WB (обратная запись в кэш).

В очень простой конструкции процессора каждый такт выполнялся бы отдельный этап, поэтому мы имели бы:

  1. ЕСЛИ
  2. ИДЕНТИФИКАТОР
  3. БЫВШИЙ
  4. МЕМ
  5. ВБ

Это позволит выполнить одну инструкцию за пять тактов.Если мы затем добавим резервный исполнительный блок и введем суперскалярный дизайн, для двух инструкций A и B мы получим следующее:

  1. ЕСЛИ(А) ЕСЛИ(В)
  2. Идентификатор(А) Идентификатор(Б)
  3. ЕХ(А) ЕХ(В)
  4. МЕМ(А) МЕМ(Б)
  5. ВБ(А) ВБ(Б)

Две инструкции за пять тактов — теоретический максимальный выигрыш в 100%.

Конвейерная обработка позволяет выполнять части одновременно, поэтому в итоге мы получим что-то вроде (для десяти инструкций от A до J):

  1. ЕСЛИ(А) ЕСЛИ(В)
  2. ID(A) ID(B) ЕСЛИ(C) ЕСЛИ(D)
  3. EX(A) EX(B) ID(C) ID(D) IF(E) IF(F)
  4. MEM(A) MEM(B) EX(C) EX(D) ID(E) ID(F) IF(G) IF(H)
  5. WB(A) WB(B) MEM(C) MEM(D) EX(E) EX(F) ID(G) ID(H) IF(I) IF(J)
  6. WB(C) WB(D) MEM(E) MEM(F) EX(G) EX(H) ID(I) ID(J)
  7. WB(E) WB(F) MEM(G) MEM(H) EX(I) EX(J)
  8. WB(G) WB(H) MEM(I) MEM(J)
  9. ВБ(И) ВБ(Я)

За девять тактов мы выполнили десять инструкций — вы можете видеть, как на самом деле движется конвейерная обработка.И это объяснение графического примера, а не того, как он на самом деле реализован в полевых условиях (это черная магия).

Статьи в Википедии для Суперскаляр и Конвейер инструкций довольно хороши.

Другие советы

Долго назад процессоры выполняли только одна машинная инструкция одновременно.Только когда процесс был полностью завершен, ЦП извлекал следующую инструкцию из памяти (или, позже, из кэша инструкций).

В конце концов, кто-то заметил, что это означает, что большая часть ЦП большую часть времени ничего не делает, поскольку имеется несколько исполнительных субблоков (таких как декодер команд, блок целочисленных арифметических операций, блок арифметических операций FP и т. д.), и выполнение инструкции сохраняется. только один из них занят одновременно.

Таким образом, "простой" трубопровод был рожден:как только одна инструкция была декодирована и перешла к следующему подблоку выполнения, почему бы уже не получить и не декодировать следующую инструкцию?Если бы у вас было 10 таких»этапы", затем по на каждом этапе обрабатывается отдельная инструкция теоретически вы можете увеличить пропускную способность инструкций в десять раз, вообще не увеличивая тактовую частоту процессора!Конечно, это работает безупречно только тогда, когда в коде нет условных переходов (это привело к большим дополнительным усилиям по специальной обработке условных переходов).

Позже, когда закон Мура продолжал оставаться верным дольше, чем ожидалось, производители процессоров обнаружили, что у них появилось все больше транзисторов, и они подумали: «Почему у каждого исполнительного субблока должно быть только по одному?».Таким образом, суперскаляр процессоры с несколько исполнительных субъединиц, способных выполнять такой же вещь параллельно появились на свет, и конструкции ЦП стали намного сложнее распределять инструкции по этим полностью параллельным блокам, обеспечивая при этом результаты такие же, как если бы инструкции выполнялись последовательно.

Аналогия:Стирка одежды

Представьте себе химчистку со следующими возможностями:вешалка для развешивания грязной или чистой одежды, стиральная и сушильная машины (каждая из которых может стирать по одному предмету одежды за раз), складной стол и гладильная доска.

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

В обычный день эти инструкции могут быть примерно такими:

  1. возьми рубашку со вешалки
  2. постирать рубашку
  3. высушить рубашку
  4. гладить рубашку
  5. сложить рубашку
  6. положи рубашку обратно на вешалку
  7. возьми штаны со вешалки
  8. постирать штаны
  9. высушить штаны
  10. сложить штаны
  11. положи штаны обратно на вешалку
  12. взять пальто с вешалки
  13. постирать пальто
  14. высушить пальто
  15. гладить пальто
  16. положи пальто обратно на вешалку

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

Однако однажды дежурный увольняется и нанимается новый, более умный дежурный, который замечает, что большая часть оборудования простаивает в любой момент времени в течение дня.Пока штаны сушились, ни гладильная доска, ни стиральная машина не использовались.Поэтому он решил более эффективно использовать свое время.Таким образом, вместо вышеуказанной серии шагов он сделал бы следующее:

  1. возьми рубашку со вешалки
  2. постирать рубашку, возьми штаны со вешалки
  3. высушить рубашку, постирать штаны
  4. погладить рубашку, высушить штаны
  5. сложить рубашку, (берём пальто с вешалки)
  6. положи рубашку обратно на вешалку, сложить штаны, (стирать пальто)
  7. положи штаны обратно на вешалку, (высушить пальто)
  8. (гладить пальто)
  9. (кладу пальто обратно на вешалку)

Это конвейерная обработка. Упорядочение несвязанных действий таким образом, чтобы они одновременно использовали разные компоненты.Поддерживая активными одновременно как можно больше различных компонентов, вы максимизируете эффективность и ускоряете время выполнения, в данном случае сокращая 16 «циклов» до 9, что дает ускорение более чем на 40%.

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

  1. возьми рубашку со вешалки, возьми штаны со вешалки
  2. постирать рубашку, постирать штаны, (берём пальто с вешалки)
  3. высушить рубашку, высушить штаны, (стирать пальто)
  4. погладить рубашку, сложить штаны, (высушить пальто)
  5. сложить рубашку, положи штаны обратно на вешалку, (гладить пальто)
  6. положи рубашку обратно на вешалку, (кладу пальто обратно на вешалку)

Это суперскалярный дизайн. Несколько подкомпонентов, способных выполнять одну и ту же задачу одновременно, но процессор решает, как это сделать.В данном случае это привело к увеличению скорости почти на 50% (за 18 «циклов» новая архитектура могла выполнить 3 итерации этой «программы», тогда как предыдущая архитектура могла выполнить только 2).

Старые процессоры, такие как 386 или 486, являются простыми скалярными процессорами, они выполняют одну инструкцию за раз точно в том порядке, в котором она была получена.Современные потребительские процессоры, начиная с PowerPC/Pentium, являются конвейерными и суперскалярными.Процессор Core2 способен выполнять тот же код, который был скомпилирован для 486, при этом используя преимущества параллелизма на уровне команд, поскольку он содержит собственную внутреннюю логику, которая анализирует машинный код и определяет, как его переупорядочить и запустить (что можно запускать параллельно). , что нельзя и т. д.) В этом суть суперскалярного проектирования и почему он так практичен.

Напротив, векторный параллельный процессор выполняет операции одновременно с несколькими фрагментами данных (вектором).Таким образом, вместо того, чтобы просто складывать x и y, векторный процессор будет добавлять, скажем, x0,x1,x2 к y0,y1,y2 (в результате получим z0,z1,z2).Проблема с этой схемой заключается в том, что она тесно связана с конкретной степенью параллелизма процессора.Если вы запустите скалярный код на векторном процессоре (при условии, что вы можете это сделать), вы не увидите преимуществ векторного распараллеливания, поскольку его необходимо использовать явно, аналогично, если вы хотите воспользоваться преимуществами более нового векторного процессора с большим количеством параллельных процессоров (например,способный добавлять векторы из 12 чисел вместо 3), вам придется перекомпилировать свой код.Векторные процессоры были популярны в старейшем поколении суперкомпьютеров, поскольку их было легко спроектировать, а в науке и технике существуют большие классы задач с большим естественным параллелизмом.

Суперскалярные процессоры также могут выполнять спекулятивное выполнение.Вместо того, чтобы оставлять процессоры бездействующими и ждать завершения выполнения пути кода перед разветвлением, процессор может сделать лучшее предположение и начать выполнение кода после ветки до того, как предыдущий код завершит обработку.Когда выполнение предыдущего кода догоняет точку ветвления, процессор может затем сравнить фактическую ветвь с предположением о ветке и либо продолжить работу, если предположение было правильным (уже значительно опережая то место, где оно было бы, просто ожидая), либо он может аннулировать результаты спекулятивного выполнения и запустить код для правильной ветки.

Конвейерная обработка — это то, чем занимается автомобильная компания при производстве своих автомобилей.Они разбивают процесс сборки автомобиля на этапы и выполняют разные этапы в разных точках сборочной линии, выполняемые разными людьми.Конечным результатом является то, что автомобиль производится со скоростью самого медленного этапа.

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

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

Суперскаляр в микропроцессорах аналогичен, но обычно имеет гораздо больше ограничений.Таким образом, этап выборки инструкций обычно генерирует более одной инструкции на своем этапе — именно это делает возможным суперскалярность в микропроцессорах.Тогда будет два этапа выборки, два этапа выполнения и два этапа обратной записи.Это, очевидно, распространяется на более чем два конвейера.

Это все прекрасно и здорово, но с точки зрения правильного исполнения оба метода могут привести к проблемам, если выполнять их вслепую.Для корректного выполнения программы предполагается, что инструкции выполняются полностью одна за другой по порядку.Если две последовательные инструкции выполняют взаимозависимые вычисления или используют одни и те же регистры, тогда может возникнуть проблема. Более поздней инструкции необходимо дождаться завершения обратной записи предыдущей инструкции, прежде чем она сможет выполнить этап выборки операнда.Таким образом, вам необходимо задержать вторую инструкцию на два этапа, прежде чем она будет выполнена, что в первую очередь противоречит цели того, что было получено с помощью этих методов.

Существует множество методов, позволяющих уменьшить проблему остановки, которые немного сложно описать, но я перечислю их:1.зарегистрировать пересылку (также сохранить для пересылки загрузки) 2.переименование регистра, 3.табло, 4.внеочередное исполнение.5.Спекулятивное выполнение с откатом (и прекращением работы) Все современные процессоры используют практически все эти методы для реализации суперскалярной и конвейерной обработки.Однако эти методы имеют тенденцию иметь уменьшающуюся отдачу от количества конвейеров в процессоре, прежде чем остановки станут неизбежными.На практике ни один производитель процессоров не использует более 4 конвейеров в одном ядре.

Многоядерность не имеет ничего общего ни с одним из этих методов.По сути, это объединение двух микропроцессоров для реализации симметричной многопроцессорной обработки на одном кристалле и совместное использование только тех компонентов, которые имеет смысл совместно использовать (обычно кеш-память L3 и устройства ввода-вывода).Однако метод, который Intel называет «гиперпоточностью», представляет собой метод попытки виртуальной реализации семантики многоядерности в суперскалярной структуре одного ядра.Таким образом, одна микроархитектура содержит регистры двух (или более) виртуальных ядер и извлекает инструкции из двух (или более) разных потоков выполнения, но выполняется из общей суперскалярной системы.Идея состоит в том, что, поскольку регистры не могут мешать друг другу, будет наблюдаться тенденция к большему параллелизму, что приведет к меньшему количеству зависаний.Таким образом, вместо того, чтобы просто выполнять два потока выполнения виртуального ядра на половине скорости, это лучше из-за общего сокращения остановок.Казалось бы, это предполагает, что Intel может увеличить количество конвейеров.Однако было обнаружено, что этому методу не хватает практического применения.Однако, поскольку это неотъемлемая часть суперскалярных методов, я все равно упомянул об этом.

Конвейерная обработка — это одновременное выполнение разных этапов нескольких инструкций в одном цикле.Он основан на разбиении обработки инструкций на этапы и наличии специализированных блоков для каждого этапа и регистров для хранения промежуточных результатов.

Супермасштабирование — это передача нескольких инструкций (или микроинструкций) нескольким исполнительным модулям, существующим в ЦП.Таким образом, он основан на резервных модулях ЦП.

Конечно, эти подходы могут дополнять друг друга.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top