- •8. Процессор
- •8.1. Базовые концепции
- •Ir← [[pc]]
- •8.2. Пересылка данных между регистрами
- •8.3. Выполнение арифметической или логической операции
- •8.4. Выборка слова из памяти
- •8.5. Сохранение слова в памяти
- •9. Конвейерная обработка команд
- •9.1. Базовые концепции
- •9.1.1. Роль кэш-памяти
- •9.1.2. Производительность конвейерной обработки команд
- •9.2. Очередь команд и упреждающая выборка
- •9.3. Конвейерная обработка и система команд
- •9.3.1. Режимы адресации
- •9.3.2. Коды условий
- •9.4. Тракты данных и управление
9.1.1. Роль кэш-памяти
Каждая ступень конвейерного выполнения команды должна завершаться за один такт. Это условие соблюдается, если такт достаточно велик. В случае, когда блокам конвейера для решения задач требуется разное время, такт равен времени выполнения самой продолжительной задачи. Блок, работа которого завершилась раньше, «бездействует» до конца такта. Поэтому конвейеризация наиболее эффективна в том случае, когда для решения стоящих на разных ступенях задач необходимо примерно одинаковое время.
Особое значение это представляет для шага выборки команды, которому на рис. 9.2, а назначен один такт. Продолжительность такта должна быть достаточной для полного выполнения шага. Однако время доступа к основной памяти может в десять раз превышать время выполнения одной конвейерной ступени внутри процессора (например, на которой суммируются два числа). Поэтому в том случае, когда для выборки каждой команды требуется обращение к основной памяти, конвейерная обработка команд бесполезна.
Проблема доступа к памяти решается с помощью кэш-памяти. Если кэш находится на той же микросхеме, что и процессор, для доступа к ней требуется то же время, что и для выполнения других базовых операций внутри процессора. Поэтому только при наличии кэша становится возможным разделение процессов выборки и обработки команд на относительно равные шаги, которые можно осуществлять на разных ступенях конвейера. При этом продолжительность такта выбирается в соответствии с тем временем, в течение которого выполняется самый продолжительный шаг.
9.1.2. Производительность конвейерной обработки команд
Конвейерный процессор на рис. 9.2 обрабатывает команду за один такт, благодаря чему он выполняет программы в четыре раза быстрее, чем обычный последовательный процессор. Повышение производительности, которое может быть получено при реализации конвейерной обработки, прямо пропорционально количеству ступеней конвейера. Однако это значение может быть достигнуто только в том случае, если команды программы выполняются безо всяких задержек. Но на практике так не бывает.
В силу различных причин одной из ступеней конвейерной обработки может не хватить выделенного ей диапазона времени. Например, в 4-ступенчатом конвейере, изображенном на рис. 9.2, б, на ступени E, которой выделен один такт, выполняется арифметическая или логическая операция. Для большинства операций этого вполне достаточно, но некоторым, в частности делению, требуется больше времени. Рассмотрим пример, который проиллюстрирован на рис. 9.3. Для совершения операции, задаваемой командой I2, нужно три такта: от 4 до 6. Поэтому выполнение операции записи на тактах 5 и 6 откладывается — данные, которые должны быть обработаны этой командой, еще не готовы. Информация в буфере В2 должна оставаться неприкосновенной, пока не завершатся операции, производимые на ступени выполнения. Это означает, что ступень 2, а вместе с ней и ступень 1, блокируются до конца операции и не могут принимать новые команды, поскольку нельзя перезаписать информацию в буфере Bl. Таким образом, как показано на рисунке, выполнение шагов D4 и F5 должно быть отложено.
Рис. 9.3. Результаты выполнения операции, занимающей более одного такта
Работа конвейера, который вы видите на рис. 9.3, приостанавливается на два такта. Его нормальное функционирование возобновляется во время такта 7 . Обстоятельства, в силу которых приостанавливается работа конвейера, называют конфликтами.
Мы рассмотрели пример конфликта по данным. Это ситуация, когда либо исходный, либо результирующий операнд команды не доступен в положенное время. В результате операция, которой он нужен, откладывается, а работа конвейера приостанавливается.
Еще одна причина останова конвейера может заключаться в задержке поступления очередной команды. Возможная причина такой задержки — промах при попытке выборки команды из кэш-памяти. Конфликты этого типа называются конфликтами по управлению. На рис. 9.4 показано, как отсутствие команды в КЭШе отражается на работе конвейера. Команда I1 выбирается из кэша во время такта 1 и выполняется обычным образом. Далее, на такте 2, производится выборка команды I2, а при обращении к кэшу происходит промах. Из-за этого работа блока выборки команд приостанавливается до получения команды I2. Мы полагаем, что команда I2 поступает и загружается в буфер Bl в конце такта 5. С этого момента возобновляется нормальная работа конвейера.
а
б
Рис. 9.4. Останов конвейера, вызванный промахом при обращении к кэшу на шаге F2:
шаги при выполнении команды на последовательных тактах (а); действия, выполняемые на ступенях конвейера во время последовательных тактов (б)
Рис. 9.4, б— это альтернативное изображение происходящего в конвейере в случае промаха при обращении к кэш-памяти. Показано, какие операции выполняются во время каждого такта на ступенях конвейера. Обратите внимание: во время тактов 3-5 простаивает блок декодирования, во время тактов 4-6 — блок выполнения, а во время тактов 5-7 — блок записи. Периоды простоя иногда называют остановом, конвейера или пузырями. Образовавшись в результате задержки на одной ступени, пузырь спускается вниз, пока не достигнет последнего блока.
Различают также структурные конфликты. Они возникают, когда двум командам требуется одновременный доступ к аппаратному ресурсу. Структурные конфликты наиболее вероятны при обращении к памяти. Предположим, что одной из находящихся в конвейере команд требуется доступ к памяти на ступени выполнения или записи, а другой — на ступени выборки. Если команды и данные расположены в одном и том же кэше, они не могут извлекаться из кэша одновременно. Поэтому пока одна команда не получит из кэша необходимую информацию, другая не сможет продолжить работу. Во избежание таких задержек многие процессоры оборудуются раздельными кэшами команд и данных.
Пример структурного конфликта приведен на рис. 9.5. Показано, как на 4-ступенчатом конвейере выполняется команда
Load R2,X(R1)
На шаге Е2 такта 4 вычисляется адрес памяти X+[R1], по которому происходит обращение к памяти на такте 5. Прочитанный из памяти операнд на такте 6 записывается в регистр R2. Это означает, что шаг выполнения этой команды занимает два такта (4 и 5). В результате конвейер приостанавливается на один такт, поскольку обеим командам, I2 и I3, на такте 6 требуется доступ к регистровому файлу. И хотя в наличии имеются и команды и данные, конвейер приостанавливается из-за того, что единственный аппаратный ресурс, регистровый файл, не способен одновременно обрабатывать две операции. Если бы у регистрового файла было два входных порта, он смог бы обработать за один прием две операции записи, и конвейер бы не остановился. В общем случае для предотвращения структурных конфликтов нужно, чтобы в микросхеме процессора было достаточное количество аппаратных ресурсов.
Рис. 9.5. Воздействие команды загрузки на работу конвейера
Важно понимать, что конвейерная обработка команд не приводит к ускорению выполнения каждой отдельной команды. Скорость команд остается прежней, но зато на единицу времени приходится большее их количество. При этом, как только на одной из ступеней конвейера возникает затор и работа не завершается за один такт, весь конвейер останавливается в ожидании завершения процесса. Если описанные ситуации возникают достаточно часто, производительность компьютера снижается.
Важнейшей задачей разработчиков процессоров является выявление конфликтов, которые могут привести к приостановке процессора, и поиск путей их устранения. Следующие разделы содержат подробную информацию о конфликтах различных типов, а также технологиях, позволяющих снизить их отрицательное воздействие на производительность. К вопросу производительности мы вернемся в разделе 9.8.