Технология ММХ основана на отображении регистров ММХ на регистры FPU (см. рис. 4.6). Главным образом это сделано для сохранения с существующим программным обеспечением.
Из рис. 4.6. видно, что ММХ-регистры отображены на поля мантиссы в FPU-регистрах. Значение, записываемое в ММХ-регистр, автоматически появляется в младших битах (биты 63-0) соответствующих FPU-регистров. При этом в поле порядка (биты 78-64) и знаковый бит (бит 79) заносятся единицы. Значение поля TOS (Top Of Stack) устанавливается в нуль после выполнения каждой ММХ-команды. Значение мантиссы, записываемое в FPU-регистр с помощью FPU-команды, автоматически появляется в соответствующем ММХ-регистре.
Отображение ММХ-регистров фиксировано и не зависит от значения поля TOS (биты 11-13 в регистре состояния FPU). В обозначении MMn, n - указывает на физический номер регистра, а в STn - n указывает на относительный номер регистра (относительно поля TOS).
При TOS=0: ММ0 отображается на ST0, ММ1 - ST1 и т.д.
При TOS=2: ММ0 отображается на ST6, ММ1 - ST6, ММ2 - ST0 и т.д.
После выполнения любой ММХ-команды (кроме EMMS) значения всех полей регистра тегов устанавливается в 00. Команда EMMS устанавливает значения всех полей регистра тегов 11 (см. табл.4.1.). Значения регистра тегов не оказывает никакого влияния на ММХ-регистры или выполнения ММХ-команд.
Так как ММХ и FPU используют фактически и те же регистры, для сохранения и восстановления контекста ММХ используются команды FSAVE (Store FP state) и FRSTOR (Restore FP state). Если при попытке выполнить ММХ-команду бит TS в регистре CR0 установлен в единицу, то генерируется исключение Int7. Благодаря этому факту обеспечивается прозрачность управления контекстом MMX для операционной системы.
Тип команды
Регистр тегов
Поле TOS
Другие регистры
Поле порядка и знаковый бит ММn (79…64)
Поле мантисы ММn (63…00)
Чтение из ММХ- регистра
Все поля 00
Не изменяется
Не изменяется
Не изменяется
Запись из ММХ- регистра
Все поля 00
Не изменяется
Заполняется единицами
Переписывается
EMMS
Все поля 11
Не изменяются
Не изменяется
Не изменяется
Разработчики архитектуры компьютеров издавна прибегали к методам проектирования, известным под общим названием "совмещение операций", при котором аппаратура компьютера в любой момент времени выполняет одновременно более одной базовой операции. Этот общий метод включает два понятия: параллелизм и конвейеризацию. Хотя у них много общего и их зачастую трудно различать на практике, эти термины отражают два совершенно различных подхода. При параллелизме совмещение операций достигается путем воспроизведения в нескольких копиях аппаратной структуры. Высокая производительность достигается за счет одновременной работы всех элементов структур, осуществляющих решение различных частей задачи.
Конвейеризация (или конвейерная обработка) в общем случае основана на разделении подлежащей исполнению функции на более мелкие части, называемые ступенями, и выделении для каждой из них отдельного блока аппаратуры. Так обработку любой машинной команды можно разделить на несколько этапов (несколько ступеней), организовав передачу данных от одного этапа к следующему. При этом конвейерную обработку можно использовать для совмещения этапов выполнения разных команд. Производительность при этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько команд. Конвейерная обработка такого рода широко применяется во всех современных быстродействующих процессорах.
Для иллюстрации основных принципов построения процессоров мы будем использовать простейшую архитектуру, содержащую 32 целочисленных регистра общего назначения (R0,...,R31), 32 регистра плавающей точки (F0,...,F31) и счетчик команд PC. Будем считать, что набор команд нашего процессора включает типичные арифметические и логические операции, операции с плавающей точкой, операции пересылки данных, операции управления потоком команд и системные операции. В арифметических командах используется трехадресный формат, типичный для RISC-процессоров, а для обращения к памяти используются операции загрузки и записи содержимого регистров в память.
Выполнение типичной команды можно разделить на следующие этапы:
1. Выборка команды - IF (по адресу, заданному счетчиком команд, из памяти извлекается команда);
2. Декодирование команды / выборка операндов из регистров - ID;
3. Выполнение операции / вычисление эффективного адреса памяти - EX;
4. Обращение к памяти - MEM;
5. Запоминание результата - WB.
Работу конвейера можно условно представить в виде сдвинутых во времени схем процессора (рис. 4.7). Этот рисунок хорошо отражает совмещение во времени выполнения различных этапов команд.
Однако чаще для представления работы конвейера используются временные диаграммы (табл 4.2), на которых обычно изображаются выполняемые команды, номера тактов и этапы выполнения команд.
Конвейеризация увеличивает пропускную способность процессора (количество команд, завершающихся в единицу времени), но она не сокращает время выполнения отдельной команды. В действительности, она даже несколько увеличивает время выполнения каждой команды из-за накладных расходов, связанных с управлением регистровыми станциями. Однако увеличение пропускной способности означает, что программа будет выполняться быстрее по сравнению с простой неконвейерной схемой.
Тот факт, что время выполнения каждой команды в конвейере не уменьшается, накладывает некоторые ограничения на практическую длину конвейера. Кроме ограничений, связанных с задержкой конвейера, имеются также ограничения, возникающие в результате несбалансированности задержки на каждой его ступени и из-за накладных расходов на конвейеризацию. Частота синхронизации не может быть выше, а, следовательно, такт синхронизации не может быть меньше, чем время, необходимое для работы наиболее медленной ступени конвейера. Накладные расходы на организацию конвейера возникают из-за задержки сигналов в конвейерных регистрах (защелках) и из-за перекосов сигналов синхронизации. Конвейерные регистры к длительности такта добавляют время установки и задержку распространения сигналов. В предельном случае длительность такта можно уменьшить до суммы накладных расходов и перекоса сигналов синхронизации, однако при этом в такте не останется времени для выполнения полезной работы по преобразованию информации.
Конвейеризация эффективна только тогда, когда загрузка конвейера близка к полной, а скорость подачи новых команд и операндов соответствует максимальной производительности конвейера. Если произойдет задержка, то параллельно будет выполняться меньше операций и суммарная производительность снизится. Такие задержки могут возникать в результате возникновения конфликтных ситуаций.