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

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

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


person Alex Xander    schedule 01.11.2009    source источник
comment
Я удалил все комментарии, которые не были по теме вопроса. Это не оставило ни одного. Пожалуйста, держите это гражданскими людьми.   -  person Marc Gravell    schedule 01.11.2009
comment
Хорошая идея. В противном случае вполне хороший вопрос был бы закрыт как субъективный и спорный!   -  person RCIX    schedule 01.11.2009


Ответы (5)


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

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

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

Superscalar/конвейерная обработка

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


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

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

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

  1. IF
  2. ID
  3. EX
  4. МЕМ
  5. WB

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

  1. IF(A) IF(B)
  2. ID(A) ID(B)
  3. EX(A) EX(B)
  4. МЕМ(А) МЕМ(Б)
  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)

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

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

person Jed Smith    schedule 01.11.2009
comment
Они используются вместе в первую очередь потому, что оба метода доступны, оба являются хорошими идеями, а современные технологии производства делают это возможным. Известные чипы, которые являются конвейерными, но не суперскалярными, включают Intel i486 и некоторые из ранних процессоров ARM, MIPS, а также первый процессор Alpha. - person Paul Hsieh; 01.11.2009
comment
Первое выполнение должно быть проблемой, а затем вы можете использовать выполнение вместо выполнения. Именно так эта фаза называется в книге Henessy & Patterson. - person yeyeyerman; 01.11.2009
comment
@yeeyeyerman: Спасибо за отзыв, я исправил ответ. У меня не было большого доступа к текстам на материале, так что простите за оплошность. - person Jed Smith; 01.11.2009
comment
избыточный означает излишний, ненужный или не строго необходимый для функционирования, но включенный в случае сбоя в другом компоненте. Но функциональные блоки в суперскаляре даже не должны обеспечивать перекрывающуюся функциональность (например, в случае, когда у вас есть отдельный блок ответвления, АЛУ и блок памяти). - person Wandering Logic; 03.07.2014
comment
Если я правильно понял, это означает, что пример из Википедии выполняет векторную обработку с использованием конвейерной обработки, когда он может выдавать разные инструкции за цикл? Я говорю о двух блоках выполнения инструкций. См. здесь - imgur.com/gPsVAWY - person goelakash; 17.04.2015
comment
В чем же тогда разница между одноядерным суперскалярным процессором и многоядерным скалярным процессором? - person lodhb; 18.05.2015

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

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

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

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

person Michael Borgwardt    schedule 01.11.2009
comment
Его ответы, подобные этим, должны положить конец дебатам о ценности таких вопросов на SO. - person Alex Xander; 01.11.2009
comment
Давным-давно, в штампе далеко-далеко? - person Jed Smith; 01.11.2009
comment
Я бы проголосовал за это, но описание суперскалярных процессоров неверно. Вы описываете векторный процессор, суперскалярные процессоры немного отличаются. - person Wedge; 01.11.2009
comment
Теперь возникает другой вопрос: в чем разница между векторными и супермасштабирующими процессорами? - person AJ.; 01.11.2009
comment
Обработка векторов @Ankit является пошаговой и явной, одна инструкция с несколькими данными. Добавьте эти 5 чисел к этим 5 числам и т. д. Чтобы воспользоваться преимуществами различных степеней параллелизма (например, 12 одновременных добавлений), вам потребуется перекомпилировать и/или перепроектировать код. Суперскалярный процессор сам определяет, как выполнять код параллельно, поэтому он может выполнять немодифицированный скалярный код или код, написанный для других суперскалярных процессоров с разной степенью параллелизма. - person Wedge; 01.11.2009
comment
Я не думаю, что мое описание содержит какие-либо утверждения, которые неверны для суперскалярных процессоров — я просто не хотел вдаваться в подробности. - person Michael Borgwardt; 01.11.2009
comment
@MichaelBorgwardt: Я думаю, что в утверждении есть что-то неправильное: если бы у вас было 10 таких этапов, то, если бы каждый этап обрабатывал другую инструкцию, вы теоретически могли бы увеличить пропускную способность инструкций в десять раз без увеличения тактовой частоты ЦП! Если вы не измените (уменьшите почти в 10 раз) тактовую частоту вашего ЦП с неконвейерной на конвейерную версию, как конвейер может выиграть от общего времени выполнения? Это только выигрывает, когда каждый этап работает в 10 раз быстрее!! - person nurabha; 02.11.2014
comment
@nurabha: вы, кажется, ошибочно полагаете, что тактовая частота процессора - это скорость, с которой выполняются целые инструкции. Это неправда. Это скорость, с которой выполняются определенные внутренние операции ЦП, которые обычно являются лишь частью выполнения инструкции, то есть этапами, упомянутыми выше. Если у вас есть 10 стадий, каждая из которых занимает 1 такт ЦП (упрощение), то без конвейерной обработки требуется 10 тактов для выполнения одной инструкции, и только после этого может начать выполняться следующая. Если вы делаете это конвейерным, каждая инструкция по-прежнему занимает 10 циклов, но вы можете выполнять 10 одновременно. - person Michael Borgwardt; 03.11.2014
comment
@MichaelBorgwardt: Вот немного математики. Предположим, что f = 100 МГц или Tclk = 10 нс как в неконвейерных, так и в конвейерных процессорах. Сравните общее время выполнения и пропускную способность для 100 инструкций (аналогичных независимых инструкций). В неконвейерном процессоре общее время выполнения = 100 инструкций x 10 нс = 1000 нс ~ 100 тактовых циклов. Пропускная способность IPC = 100 инстр/100 куб. см = 1. В конвейерном процессоре общее время выполнения = 1 инстр. х 10 стадий х 10 нс + 99 инстр. x 1 этап x 10 нс = 1090 нс ~ 109 тактовых циклов. Пропускная способность IPC = 100 Instr/109 cc ‹= 1. - person nurabha; 10.11.2014
comment
@MichaelBorgwardt: Может быть, я все еще не прав, но, пожалуйста, объясните, как улучшить IPC или время выполнения без сокращения времени тактового цикла? Время тактового цикла не может быть уменьшено в неконвейерном процессоре сверх определенного значения, поскольку оно ограничено задержкой критического пути в комбинационном пути данных. Когда я конвейеризирую этот путь данных, я фактически разрезаю комбинационный путь данных на 10 этапов, и каждый этап может выполняться либо с той же частотой (1x), что и раньше, либо с более высокой частотой (‹10x). Если я запускаю каждую комбинационную stg с той же частотой clk, что и раньше, я не получаю преимуществ от конвейерной обработки. - person nurabha; 10.11.2014
comment
@nurabha: Ты хоть читал, что я написал? Вы по-прежнему предполагаете, что неконвейерный процессор может выполнять 1 инструкцию за такт. Не может, даже близко. Предположим, что он может выполнять один этап за такт. Это пропускная способность 0,1 IPC, потому что каждая инструкция проходит один этап за другим, в то время как другие этапы простаивают. Используя конвейерную обработку, вы можете оставить занятыми все этапы и достичь пропускной способности почти в 1 IPC. - person Michael Borgwardt; 10.11.2014
comment
@MichaelBorgwardt: я думаю о неконвейерном процессоре, вы предполагаете комбинированный путь данных с несколькими циклами, а я предполагаю путь данных с одним циклом. Так что для меня неконвейерный процессор — это одноступенчатый процессор, тактовая частота которого определяется моей самой медленной инструкцией. Если я предполагаю многотактный неконвейерный процессор, то часы определяются самой медленной стадией. Это подводит меня к вопросу, почему я должен сделать комбинационный путь одноступенчатого процессора многотактным путем без его конвейерной обработки... в чем преимущество? - person nurabha; 10.11.2014
comment
@nurabha: я не уверен, что полностью понимаю вашу терминологию, но смысл наличия нескольких этапов без конвейерной обработки заключается в том, что не все инструкции используют все этапы (наиболее очевидно, доступ к памяти), а этапы могут занимать более одного цикла, даже переменная количество циклов. Таким образом, вы можете выполнять некоторые инструкции намного быстрее, чем другие. Конечно, конвейерная обработка является очевидной оптимизацией, но она добавляет сложности (особенно при обработке условных переходов), поэтому вы можете не захотеть этого делать. - person Michael Borgwardt; 10.11.2014
comment
@nurabha: на практике некоторые формы конвейерной обработки были реализованы очень рано, и реальный вопрос заключается в том, насколько глубока конвейерная обработка данного процессора. Я думаю, что у Pentium IV был довольно экстремальный вариант с 40+ этапами. - person Michael Borgwardt; 10.11.2014

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

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

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

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

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

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

person Wedge    schedule 01.11.2009

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

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

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

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

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

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

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

person Paul Hsieh    schedule 01.11.2009

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

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

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

person elder_george    schedule 01.11.2009