Суперскалярность

Суперскалярный процессор () — процессор, поддерживающий так называемый параллелизм на уровне инструкций (то есть, процессор, способный выполнять несколько инструкций одновременно) за счёт включения в состав его вычислительного ядра нескольких одинаковых функциональных узлов (таких как АЛУ, FPU, умножитель (), сдвигающее устройство () и другие устройства). Планирование исполнения потока инструкций осуществляется динамически вычислительным ядром (не статически компилятором).

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

 Использование конвейера ()
 увеличение количества функциональных узлов процессора (суперскалярность)
 увеличение количества ядер (многоядерность) 
 увеличение количества процессоров (многопроцессорность)

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

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

По классификации Флинна одноядерные суперскалярные процессоры относят к группе процессоров SISD ( — один поток инструкций, один поток данных). Подобные процессоры, поддерживающие инструкции для работы с короткими векторами, могут быть отнесены к группе SIMD ( — один поток инструкций, несколько потоков данных). Многоядерные суперскалярные процессоры относят к группе MIMD ( — несколько потоков инструкций, несколько потоков данных).

История 
Первой в мире суперскалярной ЭВМ была CDC 6600 (1964 года), разработанная Сеймуром Крэем. В СССР первой суперскалярной ЭВМ считался компьютер «Эльбрус», разработка которого велась в 1973—1979 годах в ИТМиВТ. Основным структурным отличием Эльбруса от CDC 6600 (кроме совершенно другой видимой программисту системы команд — стекового типа) являлось то, что все узлы в нём были конвейеризованы, как в современных суперскалярных микропроцессорах. На основании этого факта Б. А. Бабаян заявлял о приоритете советских ЭВМ в вопросе построения суперскалярных вычислительных машин, однако уже следующая за CDC 6600 машина фирмы Control Data, CDC 7600 (англ.), созданная в 1969 году, за 4 года до начала разработки «Эльбруса», имела конвейеризацию исполнительных устройств. Кроме того, несколько ранее (в 1967 году) фирмой IBM была выпущена машина IBM 360/91, использующая внеочередное исполнение, переименование регистров и конвейеризацию исполнительных устройств.

Первыми промышленными суперскалярными однокристальными () микропроцессорами стали микропроцессор MC88100 1988 года фирмы Motorola, микропроцессор Intel i960CA 1989 года и микропроцессор 29050 серии AMD 29000 1990 года. Первым же коммерчески широкодоступным суперскалярным микропроцессором стал i960, вышедший в 1988 году. В 1990-е годы основным производителем суперскалярных микропроцессоров стала фирма Intel.

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

Процессоры Pentium с микроархитектурой P5 (англ.) стали первыми суперскалярными процессорами архитектуры x86. Микропроцессоры Nx586, P6 Pentium Pro и AMD K5 стали первыми суперскалярными процессорами, преобразующими инструкции x86 во внутренний код, который затем исполняли.

Описание 
Если в процессе работы процессора несколько инструкций, обрабатываемых конвейером, независимы, то ядро может выполнить их одновременно. В суперскалярных системах решение о запуске инструкции на исполнение принимает само ядро процессора, что требует много ресурсов. В более поздних системах, таких, как Эльбрус-3 и Itanium, используется статпланирование, то есть решение о том, какие инструкции выполнять одновременно, принимает компилятор; компилятор находит независимые инструкции и объединяет их в одну длинную инструкцию (архитектура VLIW).

Узел суперскалярного процессора, называемый диспетчером инструкций (, ), ответственен:
 за чтение инструкций из памяти;
 за принятие решений о том, какие инструкции могут быть выполнены одновременно;
 за распределение инструкций между несколькими функциональными узлами процессора.
Узел ID должен распределять инструкции между узлами так, чтобы узлы работали без простоев. Первые суперскалярные процессоры имели по два АЛУ и по одному FPU. Современные процессоры содержат больше узлов. Например, процессор PowerPC 970 содержит четыре АЛУ, два FPU и два узла SIMD. Если узел ID не справится со своей работой (не нагрузит работой все узлы), производительность суперскалярного процессора будет не лучше производительности скалярного процессора.

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

Реализации 
Процессоры, поддерживающие суперскалярность:

Ускорение вычислений 
В суперскалярных вычислительных машинах используется ряд методов для ускорения вычислений, характерных прежде всего для них, однако такие методики могут использоваться и в других типах архитектур:
 внеочередное исполнение;
 переименование регистров;
 объединение нескольких команд в одну.

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

Скалярные и суперскалярные процессоры 
При выполнении одной инструкции скалярным процессором обрабатывается одно или два числа (скаляра). При выполнении одной инструкции векторным процессором обрабатывается несколько чисел (вектор). При единовременном выполнении нескольких инструкций суперскалярным процессором одновременно обрабатывается несколько чисел (несколько скаляров).

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

Возможность одновременного выполнения инструкций зависит от степени внутреннего параллелизма инструкций — от того, насколько одни инструкции зависят от других. Одна инструкция зависит от другой инструкции, если использует ресурсы, также используемые другой инструкцией, или использует результат работы другой инструкции. Одновременное выполнение возможно в случаях, когда инструкции программы не зависят друг от друга. Например, инструкция «a = b + c» и инструкция «d = e + f» могут быть выполнены одновременно, так как результат вычисления ни одной из них не зависит от результата вычисления другой. Инструкция «a = b + c» и инструкция «b = e + f» взаимозависимы и не могут выполняться одновременно, так как результат их выполнения зависит от того, какая из них выполнится первой.

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

См. также 
 Скалярный процессор.
 Векторный процессор.
 Многоядерный процессор.
 Многопроцессорность.
 Shelving buffer.

Примечания

Литература 
 Modern Processor Design: Fundamentals of Superscalar Processors. 2004. ISBN 0070570647.

  

  — Глава 3, стр. 148—247

 Mike Johnson, Superscalar Microprocessor Design, Prentice-Hall, 1991, ISBN 0-13-875634-1.

 Sorin Cotofana, Stamatis Vassiliadis, «On the Design Complexity of the Issue Logic of Superscalar Machines», EUROMICRO 1998: 10277-10284.

 Steven McGeady, «The i960CA SuperScalar Implementation of the 80960 Architecture», IEEE 1990, стр. 232—240.

 Steven McGeady, et al., "Performance Enhancements in the Superscalar i960MM Embedded Microprocessor, " ACM Proceedings of the 1991 Conference on Computer Architecture (Compcon), 1991, стр. 4-7.

Технологии процессоров
Параллельные вычислительные системы