Как процессор может доставлять более одной инструкции за цикл?

41

Инструкции Википедии на второй странице гласят, что i7 3630QM обеспечивает ~ 110 000 MIPS на частоте 3,2 ГГц; это будет (110 / 3,2 инструкции) / 4 ядра = ~ 8,6 инструкции на цикл на ядро ​​?! Как одно ядро ​​может доставить более одной инструкции за цикл?

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

Это мои мысли:

  • Внутренняя частота на самом деле выше, чем 3,2 ГГц
  • Некоторые части процессора асинхронны, и такой скромный человек, как я, не может этого понять.
  • Есть несколько одновременных конвейеров на ядро
  • Конвейер может выдавать больше, чем результат за такт, инструкция может пропускать этапы конвейера, и есть несколько предварительных выборок, чтобы поддерживать
  • Я что-то упустил
безработный
источник
1
Он обеспечивает 110 000 MIPS Dhrystone , поэтому я вижу непосредственно DMIPS, а не MIPS - может быть, это может иметь значение? См en.wikipedia.org/wiki/Dhrystone

Ответы:

44

Во- первых, в качестве комментария Килан в и ответ Turbo Джея отмечаете, измерение было 113,093 Dhrystone MIPS не родной MIPS.

Микроархитектура Ivy Bridge i7 3630QM может фиксировать только 4 слитых микропроцессора за цикл, хотя может начинать выполнение по 6 микопоп за цикл. (Количество слитых мопов в следе кода примерно равно количеству инструкций; некоторые сложные инструкции декодируются в несколько неоплавленных мопов, а некоторые пары инструкций могут быть слиты в один моп, например, выполнить немедленное сравнение с последующим условным прыжком.)

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

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

HyperSPARC использовал несколько связанную технику, каскадные ALU. HyperSPARC передал результаты двух ALU в третий ALU. Это позволило выполнить две независимые и третью зависимые операции за один цикл.

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

Есть также несколько других шансов и окончаний выполнения команд, которые, возможно, стоит отметить. Некоторые операции могут быть более эффективно выполнены вне обычных исполнительных блоков. Техника исключения перемещений использует использование переименования регистров в процессорах вне порядка для выполнения операций перемещения во время переименования регистров; перемещение просто копирует физический номер регистра из одной позиции в таблице переименования (называемой таблицей псевдонимов регистра) в другую. Это не только эффективно увеличивает ширину выполнения, но также устраняет зависимость. Этот метод использовался на ранних этапах работы с x87 на базе стека, но теперь широко используется в высокопроизводительных процессорах Intel x86. (Использование деструктивных инструкций с двумя операндами в x86 делает устранение перемещений более полезным, чем это было бы в типичном RISC.)

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

Другая техника, используемая некоторыми процессорами x86, снижает стоимость операций push и pop. Обычно инструкция, использующая указатель стека, должна была бы ждать полного цикла предыдущего нажатия или всплывающего окна, чтобы обновить значение указателя стека. Признавая, что push и pop только добавляют или вычитают небольшое значение к указателю стека, можно параллельно вычислять результаты нескольких сложений / подстановок. Основной задержкой для добавления является перенос переноса, но при небольших значениях более значимые биты базового значения - в данном случае указатель стека - будут иметь не более одного переноса. Это позволяет применять оптимизацию, аналогичную оптимизации сумматора переноса, к множественным сложениям небольших значений. Кроме того, поскольку указатель стека обычно обновляется только константами,

Также возможно объединить инструкции в одну более сложную операцию. Хотя обратный процесс разделения инструкций на несколько более простых операций является старой техникой, объединение инструкций (которое Intel называет макрооперацией слияния) может позволить реализации поддерживать операции более сложные, чем те, которые представлены в наборе команд.

С теоретической стороны были предложены другие методы. Небольшие константы, отличные от нуля, могут поддерживаться в RAT, и некоторые простые операции, которые используют или надежно генерируют такие малые значения, могут быть обработаны на ранней стадии. («Inkining Physical Register Inlining», Mikko H. Lipasti et al., 2004, предложил использовать RAT в качестве средства уменьшения количества регистров, но эту идею можно расширить, чтобы поддерживать загрузку небольших немедленных операций и простых операций с небольшими числами.)

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

Предсказание значений может использоваться для увеличения числа операций, которые могут выполняться параллельно, путем удаления зависимостей. Предсказатель значений на основе шага аналогичен оптимизации всплывающего / push-кода специализированного стекового механизма, упомянутого ранее. Он может вычислять несколько сложений в основном параллельно, удаляя сериализацию. Общая идея прогнозирования значения заключается в том, что с прогнозируемым значением зависимые операции могут выполняться без задержки. (Направление ветвления и целевое предсказание - фактически просто очень ограниченная форма предсказания значения, позволяющая извлекать следующие инструкции, которые зависят от «значения» ветвления - взятого или нет - и следующий адрес инструкции, другое значение.)

Пол А. Клейтон
источник
здорово! Спасибо за ценную информацию. Не могли бы вы предложить книгу, где я могу прочитать все эти архитектурные приемы?
без работы
@workless Как только вы выйдете за рамки конвейерной обработки и неупорядоченного суперскалярного выполнения (которое будет охватываться большинством учебников по компьютерной архитектуре), лучшими источниками информации, вероятно, станут описания конкретных микроархитектур процессоров (таких как статья на Haswell, связанная с в ответе gnasher729 ) и в научных статьях (ISCA и MICRO [конференции], как правило, есть хорошие статьи; HPCA, PACT, ASPLOS и, возможно, некоторые другие также имеют хорошую репутацию). Энди Глеу (возможно, самый известный за его работу над Pentium Pro) ...
Пол А. Клейтон
1
... работал над вики-сайтом CompArch, который представлял более продвинутые концепции, но прогресс был медленным, и он, по-видимому, был взломан некоторое время назад и теперь выдает только сообщение об ошибке ( semipublic.comp-arch.net/wiki ). Он намеревается восстановить вики (исходный текст был сохранен) с использованием другого программного обеспечения вики (у него были некоторые проблемы с программным обеспечением, которое он использовал, и он использует это как возможность внести улучшения), но "это будет какое-то время".
Пол А. Клейтон,
Хорошим примером успеха суперскалярной архитектуры является HyperThreading от Intel - при всех этих оптимизациях инженеры Intel обнаружили, что около 30% ALU большую часть времени не использовались, потому что память не может перемещаться достаточно быстро, или трубопровод не может быть заполнен достаточно эффективно. HyperThreading позволяет вам получить много работы бесплатно в идеальном сценарии. Это гораздо меньше, чем отдельное новое ядро, но при этом оно намного дешевле (и его можно комбинировать с многоядерным процессором).
Луаан
@ PaulA.Clayton - два снимка этой страницы на Wayback. 20 дец 2013 и 14 февраля 2014 . Я не знаю, предшествуют ли эти снимки проблемам со страницей. К сожалению, когда я попытался посетить эти страницы на Wayback, я получил сообщение « Bummer. Машина, которая обслуживает этот файл, не работает. Мы работаем над этим », поэтому я не уверен, что можно увидеть на этих страницах. ,
Кевин Феган,
10

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

Ключом к пониманию эффективности современных процессоров является понимание того, что они суперскалярны . Из Википедии (выделено мое):

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

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

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

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

  • Результаты предыдущих инструкций недоступны.
  • Кеш пропускает.
  • Разветвление кода, которое сделает недействительными уже извлеченные инструкции (читайте о предсказании ветвления здесь и здесь ).

Современные компиляторы пытаются помочь со многими из вышеперечисленных пунктов, процессор затем берет на себя. Для хорошего примера см этот вопрос в другом месте на Stackexchange, в котором подчеркивается важное различие между двумя инструкциями , которые могут делать то же самое (в некоторых случаях). Однако один может быть «быстрее», чем другой на некоторых процессорах из-за используемого исполнительного модуля.

Для удобочитаемого объяснения современного конвейера ЦП см . Путешествие по конвейеру ЦП . Несколько более техническое объяснение см. В статье Микроархитектуры Агнера Фога .

Дэвид
источник
спасибо за объяснение и очень интересные ссылки. Как примечание Cell выглядит очень интересно, я с нетерпением жду возможности больше узнать об архитектурах ЦП ^ _ ^. «В x86 используется« суперпайплайн », как описано выше. Семейство Cell использует «синергетический» подход, включающий девять мини-процессоров. Это правда, что каждый мини-процессор следует в основном конвейеру в порядке, мини-процессор имеет несколько параллельных суперскалярных конвейеров, а не один конвейер. "" "
без работы
4

Как вы думаете, что произошло: все инженеры Intel, AMD и IBM прочитали, что конвейер может выдавать только один результат за цикл, и они сказали: «Ну что ж, вот и все, эти процессоры не могут работать быстрее». Или они прочитали это и сказали: «Не может дать более одного результата за цикл? Мы посмотрим на это!».

Например, для хорошего знакомства с архитектурой Haswell вы можете перейти по этой ссылке http://www.realworldtech.com/haswell-cpu/ или просто зайти на сайт Intel, и там вы найдете немного документации.

Каждое ядро ​​процессора Haswell имеет огромное количество исполнительных блоков, которые могут выполнять операции независимо друг от друга, поэтому несколько операций могут выполняться параллельно. Затем процессор Haswell имеет несколько исполнительных блоков, которые обрабатывают векторные операции размером до 256 бит. Векторная операция может, например, выполнять четыре операции с плавающей запятой двойной точности или восемь операций с плавающей запятой одинарной точности в одной векторной операции. И, наконец, процессор Haswell поддерживает «плавное умножение-сложение», что означает, что вычисление времен b плюс c - это всего лишь одна операция.

Теоретический максимум, поскольку Haswell имеет два блока, способных к объединенному умножению-сложению, - это две объединенные операции умножения-сложения за цикл, каждая из которых выполняет восемь умножений с одинарной точностью плюс сложения или 32 операции с плавающей запятой одинарной точности.

Процессор 3630 не входит в последний прайс-лист Intel, но есть такие модели, как 3740QM с четырьмя ядрами. Таким образом, вместо 32 вы можете получить 128 операций с плавающей запятой за такт. Это теоретический максимум. Достижение половины этого в реальной жизни является сложной задачей, но не является невозможным для подходящих задач. Доступны и другие процессоры с 15 ядрами (по ценам, которые не заплатят даже самые фанатичные фанатики игр).

Итак, у вас есть комбинация из нескольких множителей:

  1. Несколько ядер на процессор.
  2. (Гиперпоточность, не упомянутая ранее, позволяет приблизиться к теоретическим пределам)
  3. Объединенная операция умножения-сложения выполняет две арифметические операции, считая только одну.
  4. 256-битные векторы выполняют 8 операций, считая только одну.
  5. Два векторных исполнительных блока, способных обрабатывать слияние-умножение.

8,6 операций за цикл не так уж сложно достичь. Даже 8,6 операций на цикл на ядро ​​не так уж сложно.

gnasher729
источник
Интересно, было бы целесообразно или выгодно проектировать ЦП с некоторыми ядрами, работающими на x86, и некоторыми, которые запускали набор инструкций, оптимизированный для суперскалярного поведения. Я знаю, что Intel и AMD делают довольно удивительные вещи, чтобы обойти ограничения в наборе команд x86, но в некоторых случаях я думаю, что было бы полезно знать некоторые вещи, которые текущий набор команд не может выразить. Например, отдельные версии ADDинструкций, основанные на том, следует ли оставить переполнение без изменений или его следует установить, когда происходит переполнение (и оставить установленным, если это не так).
суперкат
1
Я опечален тем, что в наши дни многие языки по умолчанию не проверяют переполнение. Я знаю, что Java в значительной степени застрял в семантических требованиях, но в таких языках, как C #, которые включают как арифметические операторы с перехватом, так и без перехвата, я вижу только одну вескую причину не перехватывать переполнение, потому что нужно поведение переноса. В настоящее время проверка переполнения может привести к значительному снижению скорости, но если машинный язык был разработан на основе идеи, что перехват переполнения не должен быть точным, если код может гарантировать, что переполнения не было до операции ...
суперкат
... достигает определенных критических точек, должно быть возможно уменьшить накладные расходы на переполнение почти до нуля. Если код выполняет вычисление, а затем сохраняет значение в местоположении, которое будет оставлено, если первое вычисление переполнится, не должно быть необходимости откладывать сохранение до тех пор, пока процессор не узнает, успешно ли выполнено первое вычисление, но процессор в настоящее время не имеет никакого способа зная это. Если код может просто выполнять все операции, которые можно безопасно выполнять независимо от того, произошло ли переполнение, а затем проверьте, не произошло ли какое-либо неправильное переполнение на каком-либо из них ...
суперкат
... казалось бы, это должно помочь уменьшить зависимости выполнения.
суперкат
2

Тест Drystone взят с 1984 года, и соответствующая номинальная машина 1 MIPS VAX не очень эффективна в современных условиях. Даже Cortex M3 обеспечивает 1,25 DMPIS / МГц.

Процессоры Intel Core с архитектурой действительно могут выполнять несколько команд параллельно в одном ядре, потому что присутствует несколько вычислительных блоков.

Turbo J
источник
1

Я очень многому научился у Джона "Ганнибала" из Ars Technica Stokes, отличных и обширных статей на тему микропроцессорной архитектуры. Статьи немного устарели (кажется, что они датированы примерно 2004 годом), но все еще очень актуальны.

Некоторые ссылки на следующую часть статьи не работают, однако, кажется, вы можете исправить их самостоятельно, тщательно сравнив URL первой части и неработающий URL следующей страницы (например, добавив что- m-то в URL).

(да, это прославленный ответ только для ссылок, извините; статьи слишком хороши, чтобы не упоминать их)

marcelm
источник