Подсистема исполнения с изменением последовательности
Данная подсистема обеспечивает оптимальную загрузку вычислительных узлов процессора и минимизацию их простоев. Это достигается за счет изменения порядка исполнения команд программы, не приводящего к искажению результата.
Рассмотрим возможность изменения порядка исполнения команд программы на примере.
Пример 5.1. Пусть в программе задана Вперед последовательность команд:
1) А = В + С;
2) К = А + М;
3) Z = X + Y.
Предположим, что в процессоре имеется два блока для выполнения арифметических операций, которые могут работать параллельно. Как видно, команды 1 и 3 совершенно не зависят друг от друга. В команде 2 один из операндов (Л) – результат выполнения команды 1, значит, она может быть выполнена только после нее. В такой ситуации целесообразно изменить порядок выполнения. Сначала лучше выполнить команды 1 и 3 двумя параллельно работающими блоками, а затем команду 2, когда операнд А уже будет готов.
К устройствам подсистемы исполнения с изменением последовательности относятся следующие узлы.
Таблица назначения регистров. Устройство задает соответствие между регистрами архитектуры х86, которые, как известно, указываются в командах в качестве источника одного из операндов и приемника результата, и внутренними регистрами процессора, применяемыми при исполнении МО.
Буфер переупорядочивания микроопераций. Он является ассоциативным запоминающим устройством, хранящим подготовленные к исполнению МО, из которых состоят команды программы. Это устройство называют также пулом команд (англ. pool – общий фонд, общий котел). Сюда заносятся подготовленные к исполнению МО вместе с операндами, для хранения которых в буфере есть 40 элементов, размером 256 бит. Каждый из элементов может хранить МО, два связанных с ней операнда, результат ее выполнения и несколько битов состояния.
Станция-резервуар. Устройство выполняет функции диспетчера, определяющего порядок выполнения МО, хранящихся в буфере переупорядочивания. Оно оценивает возможность изменения порядка исполнения МО и обеспечивает их выполнение в оптимальной с точки зрения производительности последовательности, направляя их в вычислительные блоки исполнительного устройства.
Набор исполнительных блоков
Для выполнения различных вычислений и действий с памятью в процессоре Р6 имеется целый набор исполнительных блоков.
Два блока для выполнения операций над целыми числами – ALU, один из которых выполняет собственно вычисления – арифметические и логические операции, а другой предназначен для выполнения операций условного перехода, связанных с вычислением адреса следующей команды. Двоичные числа, которые рассматривались в параграфе 3.1, являются целыми. Однако, если бы процессоры компьютеров работали только с целыми числами, то невозможно было бы выполнять реальные математические расчеты. Поэтому, кроме целых, в вычислительной технике используются также вещественные числа, или числа с плавающей точкой (ПТ). Принцип их формирования рассмотрим на простом примере. Числу 20,625 в двоичной системе счисления соответствует число 10100,101 = = 1 • 24 + 1 • 22 + 1 • 2-1 + 1 • 2-3. Его можно записать, выделив так называемые мантиссу – значащую часть и порядок:
10100,101 =0,10100101-25.
где мантисса – число 0,10100101; порядок – число 5.
Блок арифметики с плавающей точкой – FPU (Floating Point Unit) – выполняет операции над числами с ПТ.
Блок арифметики с плавающей точкой над множественными данными – SIMD FPU (Single Instruction – Multiple Data Floatingpoint Unit), т.е. одна команда арифметики с ПТ выполняется с множеством данных. Процессоры Pentium III и выше имеют в своем составе блок, исполняющий операции с ПТ сразу над несколькими числами. Эта технология имеет название SSE (Streaming SIMD Extensions – потоковое SIMD-расширение процессора). Набор таких команд был разработан фирмой Intel и впервые представлен в процессорах серии Pentium III как ответ на аналогичный набор 3DNow! фирмы AMD, который был представлен годом раньше. Технология SSE включает в архитектуру процессора восемь 128-битных регистров, содержимое каждого из которых трактуется как четыре последовательных числа с ПТ одинарной точности (32 бита).
Преимущество в производительности при использовании технологии SSE достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над разными данными.
Такая задача возникает, например, при 3D-моделировании, когда трехмерные тела должны отображаться на экране монитора с разных позиций просмотра. При этом отображение осуществляется с привязкой к базовой (мировой) системе координат, само же тело описывается местной системой координат. Чтобы отобразить его при перемещениях и вращениях, необходимо рассчитать координаты точек в базовой системе. Координаты вершин тела (например, параллелепипеда) при этом пересчитываются с помощью выражений типа:
где X, Y, Z, W – координаты нового положения точки тела в базовой (мировой) системе координат; а0, a1, а2, b0, b1, b2,
c0, cl, c2 – направляющие косинусы углов, образованных местными координатными осями повернутого тела относительно положения осей базовой системы координат; а3, b3, с3 – координаты точки (000) местной системы координат тела в базовой системе координат; d0, d1, d2. d3 – координаты вектора, определяющего перспективу; х, у, z – координаты точки тела в местной системе координат.
При определении координат для каждой точки необходимо выполнить вычисления типа:
Аналогичные выражения необходимо вычислить для Y, Z и W. Очевидно, что для вычисления одной координаты необходимо выполнить четыре команды умножения. С помощью команды умножения SIMD MULTIPLY эти четыре операции можно заменить одной, которая вычисляет одну из координат радиуса-вектора точки (в данном примере это координата X). Поэтому такие операции также называются векторными.
Для реализации векторной операции предварительно необходимо подготовить операнды – в один 128-битный регистр записать четыре 32-битных операнда с плавающей точкой – а0, a1, а2 и а3, в другой – х, у, z и 1. Для этого в составе набора SSE-команд имеются специальные команды перестановки (англ, shuffle – переставить, тасовать). Команда SIMD MULTIPLY будет выполнена за одну МО, т.е. за один такт. Для дальнейших вычислений понадобится команда разупаковки содержимого 128-битного регистра, хранящего результат операции SIMD MULTIPLY, по четырем обычным 32-битным регистрам.
Блок интерфейса памяти – МIU (Memory Interface Unit) – вычисляет адреса данных, используемых командами, и формирует запросы к кэш-памяти для загрузки/выгрузки этих данных.
5.1.5. Подсистема упорядоченного завершения
Эта подсистема обеспечивает выдачу результатов выполнения команд в заданном исходной программой порядке. Подсистема состоит из следующих устройств.
Блок завершения. Устройство выдает результаты исполнения команд в той последовательности, в которой они поступили на исполнение, т.е. до ее изменения.
Регистровый файл. Устройство хранит результаты операций в том виде, в котором они хранились бы в регистрах процессора серии Intel х86 в результате выполнения команд программы.
Буфер переупорядочивания памяти. Устройство управляет порядком записи данных в память для предотвращения записи неверных данных из-за изменения порядка выполнения команд.