Ранние компьютеры были полностью последовательными. Каждая инструкция, полученная процессором, должна быть выполнена полностью, прежде чем можно будет запустить следующую. Большинство инструкций состоит из пяти этапов: выборка инструкции, декодирование инструкции, выполнение, доступ к памяти и обратная запись. Соответственно эти этапы получают инструкцию, которую необходимо выполнить, отделяют операцию от значений, выполняем операцию, открываем регистр, в который будет записан результат, и записываем результат в открытый регистр.
Каждый из этих этапов должен занять один цикл. К сожалению, если данных нет в регистре, то их необходимо запрашивать из кеша процессора или системной оперативной памяти. Это намного медленнее, добавляя десятки или сотни тактовых циклов задержки. Тем временем все остальное должно подождать, так как никакие другие данные или инструкции не могут быть обработаны. Этот тип конструкции процессора называется субскалярным, поскольку он выполняет менее одной инструкции за такт.
Конвейерная обработка скаляра
Скалярный процессор может быть получен путем применения системного конвейера. Каждая из пяти стадий выполняемой инструкции выполняется на разных аппаратных компонентах реального ядра процессора. Таким образом, если вы будете осторожны с данными, которые вы вводите в аппаратное обеспечение для каждого этапа, вы можете заставлять каждый из них быть занятым каждый цикл. В идеальном мире это могло бы привести к 5-кратному ускорению и к идеально скалярному процессору, выполняющему полную инструкцию за такт.
На самом деле программы сложны и снижают производительность. Например, если у вас есть две инструкции сложения «a = b + c» и «d = e + f», их можно без проблем запустить в конвейере. Однако, если у вас есть «a = b + c», за которым следует «d = a + e», у вас есть проблема. Если предположить, что эти две инструкции идут непосредственно одна за другой, процесс вычисления нового значения «а» не будет завершен, не говоря уже о том, чтобы быть записанным обратно в память до того, как вторая инструкция прочитает старое значение «а», а затем даст неправильный ответ для «д».
Этому поведению можно противопоставить включение диспетчера, который анализирует предстоящие инструкции и следит за тем, чтобы ни одна инструкция, зависящая от другой, не выполнялась слишком близко друг к другу. Он фактически запускает программу в неправильном порядке, чтобы исправить это. Это работает, потому что многие инструкции не обязательно опираются на результат предыдущей.
Расширение пайплайна до суперскалярного
Суперскалярный процессор способен выполнять более одной полной инструкции за такт. Один из способов сделать это — расширить конвейер так, чтобы было два или более аппаратных компонента, способных обрабатывать каждый этап. Таким образом, на каждом этапе конвейера в каждом цикле может быть две инструкции. Это, очевидно, приводит к усложнению конструкции, поскольку аппаратное обеспечение дублируется, однако предлагает отличные возможности масштабирования производительности.
Однако увеличение производительности за счет увеличения конвейеров эффективно масштабируется только до такой степени. Температурные и размерные ограничения накладывают некоторые ограничения. Есть также значительные сложности планирования. Эффективный диспетчер теперь еще более важен, поскольку он должен гарантировать, что ни один из двух наборов инструкций не зависит от результата любой из других обрабатываемых инструкций.
Предсказатель ветвлений — это часть диспетчера, которая становится тем более важной, чем выше уровень суперскалярности процессора. Некоторые инструкции могут иметь два возможных результата, каждый из которых приводит к разным инструкциям. Простым примером может быть оператор «если». «Если это правда, делай то, иначе делай это другое». Предсказатель ветвления пытается предсказать результат операции ветвления. Затем он упреждающе планирует и выполняет инструкции, следуя тому, что, по его мнению, является вероятным результатом.
В современных предсказателях ветвлений много сложной логики, что может привести к успешности предсказания ветвлений порядка 98%. Правильный прогноз экономит время, которое могло быть потрачено впустую на ожидание фактического результата, неправильный прогноз требует, чтобы предсказанный инструкции и любые их результаты отбрасываются, а на их место запускаются настоящие инструкции, что приводит к небольшому штрафу за простое ждал. Таким образом, высокий уровень успешных прогнозов может заметно повысить производительность.
Вывод
Компьютерный процессор считается суперскалярным, если он может выполнять более одной инструкции за такт. Ранние компьютеры были полностью последовательными, выполняя только одну инструкцию за раз. Это означало, что для выполнения каждой инструкции требовалось более одного цикла, поэтому эти процессоры были субскалярными. Базовый конвейер, который позволяет использовать аппаратное обеспечение для каждого этапа инструкции, может выполнять не более одной инструкции за такт, что делает его скалярным.
Следует отметить, что ни одна отдельная инструкция не обрабатывается полностью за один такт. По-прежнему требуется не менее пяти циклов. Однако одновременно в конвейере может находиться несколько инструкций. Это позволяет выполнять одну или несколько завершенных инструкций за цикл.
Суперскаляр не следует путать с гиперскейлером, который относится к компаниям, которые могут предложить гипермасштабируемые вычислительные ресурсы. Гипермасштабируемые вычисления включают в себя возможность плавного масштабирования аппаратных ресурсов, таких как вычислительные ресурсы, память, пропускная способность сети и хранилище, по мере необходимости. Это обычно встречается в крупных центрах обработки данных и средах облачных вычислений.