При параллельной выдаче двух
операций (одной целочисленной команды и одной команды ПТ) потребность в дополнительной
аппаратуре, помимо обычной логики обнаружения конфликтов, минимальна:
целочисленные операции и операции ПТ используют разные наборы регистров и
разные функциональные устройства. Единственная сложность возникает, только если
команды представляют собой команды загрузки, записи и пересылки чисел с
плавающей точкой. Эти команды создают конфликты по портам регистров ПТ, а также
могут приводить к новым конфликтам типа RAW, когда операция ПТ, которая могла
бы быть выдана в том же такте, является зависимой от первой команды в паре.
Если пара команд состоит из
одной команды загрузки с ПТ и одной операции с ПТ, которая от нее зависит,
необходимо обнаруживать подобный конфликт и блокировать выдачу операции с ПТ.
За исключением этого случая, все другие конфликты естественно могут возникать,
как и в обычной машине, обеспечивающей выдачу одной команды в каждом такте. Для
предотвращения ненужных приостановок могут, правда, потребоваться
дополнительные цепи обхода.
Другой проблемой, которая
может ограничить эффективность суперскалярной обработки, является задержка
загрузки данных из памяти. В нашем примере простого конвейера команды загрузки
имели задержку в один такт, что не позволяло следующей команде воспользоваться
результатом команды загрузки без приостановки. В суперскалярном конвейере
результат команды загрузки не может быть использован в том же самом и в
следующем такте. Это означает, что следующие три команды не могут использовать
результат команды загрузки без приостановки. Задержка перехода также становится
длиною в три команды, поскольку команда перехода должна быть первой в паре
команд. Чтобы эффективно использовать параллелизм, доступный на суперскалярной
машине, нужны более сложные методы планирования потока команд, используемые
компилятором или аппаратными средствами, а также более сложные схемы
декодирования команд.
В общем случае в
суперскалярной системе команды могут выполняться параллельно и возможно не в
порядке, предписанном программой. Если не предпринимать никаких мер, такое
неупорядоченное выполнение команд и наличие множества функциональных устройств
с разными временами выполнения операций могут приводить к дополнительным
трудностям. Например, при выполнении некоторой длинной команды с плавающей
точкой (команды деления или вычисления квадратного корня) может возникнуть
исключительная ситуация уже после того, как завершилось выполнение более
быстрой операции, выданной после этой длинной команды. Для того, чтобы
поддерживать модель точных прерываний, аппаратура должна гарантировать корректное
состояние процессора при прерывании для организации последующего возврата.
Обычно в машинах с
неупорядоченным выполнением команд предусматриваются дополнительные буферные
схемы, гарантирующие завершение выполнения команд в строгом порядке,
предписанном программой. Такие схемы представляют собой некоторый буфер
"истории", то есть аппаратную очередь, в которую при выдаче попадают
команды и текущие значения регистров результата этих команд в заданном
программой порядке.
3.3 Историческая справка
В 1993 году корпорация Intel
внедрила в массовое производство параллелизм на уровне команд, выпустив
процессор Intel Pentium, обладавший способностью декодировать и выполнять
команды вычислительного потока параллельно. Годом позже специалисты Intel
реализовали двухпроцессорную обработку (два полноценных процессора помещались в
два разъема на одной системной плате), создав аппаратную многопоточную среду
для серверов и рабочих станций. В 1995 году был представлен процессор Intel
Pentium Pro, поддерживавший эффективное объединение четырех процессоров на
одной системной плате, что позволило обеспечить более высокую скорость
обработки данных в многопоточных приложениях, ориентированных на серверные
платформы и рабочие станции.