В чем разница между суперскейлингом и конвейерной обработкой? - PullRequest
37 голосов
/ 01 ноября 2009

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

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

Ответы [ 5 ]

55 голосов
/ 01 ноября 2009

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

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

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

Superscalar/pipelining in use

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


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

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

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

  1. IF
  2. ID
  3. EX
  4. MEM
  5. WB

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

  1. ЕСЛИ (А) ЕСЛИ (В)
  2. ID (A) ID (B)
  3. EX (A) EX (B)
  4. MEM (A) MEM (B)
  5. WB (A) WB (B)

Две инструкции по пять часов - теоретический максимальный коэффициент усиления 100%.

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

  1. IF (A) IF (B)
  2. ID (A) ID (B) IF (C) IF (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. WB (I) WB (J)

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

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

32 голосов
/ 01 ноября 2009

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

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

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

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

10 голосов
/ 01 ноября 2009

Аналогия: Стирка белья

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

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

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

  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), вам нужно будет перекомпилировать ваш код. Проекторы векторных процессоров были популярны в самом старшем поколении суперкомпьютеров, потому что их было легко проектировать, и в науке и технике существует большой класс проблем с большим естественным параллелизмом.

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

6 голосов
/ 01 ноября 2009

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

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

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

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

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

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

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

2 голосов
/ 01 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...