Опубликован: 08.11.2022 | Доступ: свободный | Студентов: 80 / 0 | Длительность: 06:05:00
Лекция 10:

Конвейеризация

< Лекция 9 || Лекция 10: 12 || Лекция 11 >

Машинный код RISC-процессоров, с точки зрения способа хранения команд в оперативной памяти, оказывается проще, чем у CISC-процессоров. Команды RISC-процессоров выполняются за одинаковое число тактов, а более простой машинный язык упрощает обнаружение и обработку конфликтов. Некоторые современные RISC-процессоры (например, процессоры семейства ARM), также как и CISC-процессоры, обнаруживают конфликты и могут переупорядочивать исполнение команд, минимизируя таким образом потерю производительности из-за конфликтов. Другие же RISC-процессоры вовсе не обрабатывают конфликты, например, процессоры семейства MIPS (название семейства этих процессоров расшифровывается как Microprocessor without Interlocked Pipelined Stages, то есть микропроцессор без блокировок на конвейере). Такие процессоры требуют, чтобы подготовленный для них машинный код не содержал потенциальных конфликтов при конвейеризации. Эту "бесконфликтность" машинного кода обеспечивает компилятор.

В таблице 10.1 представлен пример, показывающий, как может отличаться машинный код одной и той же программы для и CISC- и RISC-процессоров. В рамках этого примера представлен фрагмент программы на языке C, а также машинный код, порождённый для него под процессоры семейств ARM (CISC) и MIPS (RISC). В случае с MIPS-процессором компилятор в некоторых местах вынужден генерировать инструкции NOP для предотвращения конфликтов при конвейеризации, а процессор ARM справляется с конфликтами самостоятельно.

Таблица 10.1. Результаты трансляции для ARM и MIPS: обработка конфликтов процессором и компилятором
C-программа Трансляция для ARM Трансляция для MIPS
Результат Комментарий Результат Комментарий
int a,b; ldr r3, [fp, #-8]; ldr r2, [fp, #-12] Загрузка переменных: а - в регистр r3, b - в регистр r2. lw $3,8($fp); lw $2,12($fp) Загрузка переменных: а - в регистр $3, b - в регистр $2.
if (a>b) Nop Конфликт по данным: необходимо доп. время для окончания загрузки переменной b в регистр $2, чтобы использовать его в след. команде
cmp r3, r2 Сравнение регистров r3 и r2 slt $2,$2,$3 Если $2< $3, загрузить 1 в регистр $2, иначе загрузить 0 в регистр $2
ble .L2 Условный переход (если результат последнего сравнения был "\le ") на следующую за оператором if команду beq $2,$0,$L2 Условный переход (если $2 = $0) на следующую за оператором if команду. Спец. регистр $0 всегда содержит значение 0
Nop Конфликт по управлению: эта команда всегда попадает на конвейер до того, как становится известно, выполнит ли предыдущая команда переход
\{a = b;\} ldr r2, [fp, #-12] Загрузка переменной b в регистр r2 lw $2,12($fp) Загрузка переменной b в регистр 2
nop Конфликт по данным: необходимо доп. время для окончания загрузки переменной b в регистр $2, чтобы использовать его в след. команде
str r2, [fp, #-8] Выгрузка регистра r2 в переменную a sw $2,8($fp) Выгрузка регистра $2 в переменную a
b = 0; L2: Метка .L2 - адрес следующей за оператором if команды $L2: Метка $L2 - адрес следующей за оператором if команды
mov r2, #0; str r2, [fp, #-12] Загрузка 0 в регистр r2, а следом выгрузка из регистра r2 в переменную b sw $0,12($fp) Выгрузка из спец. регистра $0 (всегда содержит 0) в переменную b

ПАРАЛЛЕЛЬНОЕ ИСПОЛНЕНИЕ КОМАНД

Как уже многократно указывалось, повышение производительности современных процессоров осуществляется в значительной степени за счёт распараллеливания. Одним из популярных способов распараллеливания является конвейеризация. Но хотя конвейеризация и позволяет значительно ускорить исполнение программ, максимального эффекта она достигает лишь в идеальных ситуациях, когда конфликты не возникают, или когда удаётся переупорядочить команды таким образом, чтобы эти конфликты исчерпать. Для дальнейшего повышения производительности применяются (иногда в сочетании с конвейеризацией) более сложные решения.

В качестве первой техники параллельного исполнения команд процессором рассмотрим суперскалярность - возможность одновременно выполнять несколько машинных команд за счёт наличия в процессоре нескольких однотипных функциональных блоков (арифметико-логических устройств, математических сопроцессоров и т.д.) В семействе Intel x86 первым процессором, где была реализована суперскалярность, был процессор Intel Pentium (1993 год). Этот процессор содержал два арифметико-логических устройства, которые позволяли исполнять одновременно две соседние команды, если они не зависели друг от друга. При этом независимые команды одновременно обрабатывались двумя разными конвейерами. Для этого компиляторы стремились генерировать машинный код, соседние команды которого не зависели бы друг от друга.

Более продвинутой техникой параллельного исполнения машинных команд является внеочередное исполнение (Out of Order Execution). Эта техника позволяет исполнять команды программы не в порядке следования, а в порядке готовности к выполнению. При использовании внеочередного исполнения некоторое множество команд программы исполняется тогда, когда для всех этих команд готовы нужные им входные данные. Первой ЭВМ, в которой был реализован механизм внеочередного исполнения команд, был суперкомпьютер CDC 6600 компании Cray Research, созданный в 1963 году.

Приведём следующий пример. Пусть в программе подряд идут следующие команды:

(1) a = b / c 
(2) d = b + a 
(3) x = y * z 

Деление двух чисел (команда (1)) является сложной командой, которая выполняется существенно дольше, чем, например, сложение. Вспомните алгоритм деления "в столбик": в нём последовательно выполняется много операций и проверок. Процессор выполняет деление практически так же, но только в двоичной системе. В то же время, от результатов команды (1) зависит выполнение команды (2), а выполнение команды (3) не зависит. Поэтому можно приступить к выполнению команд (1) и (3) одновременно, а команду (2) начать выполнять после вычисления значения a.

Рассмотрим общий сценарий внеочередного исполнения команд в современных процессорах на примере распространённого известного процессора Intel Core i7. После выборки процессором очередной команды для исполнения эта команда делится на микрооперации - простые действия, такие как "сложить два числа", "записать значение в регистр", "выдать адрес ячейки на шину адреса" и подобные им. Микрооперации помещаются в специальный буфер переупорядочивания (Reorder Buffer), в котором они упорядочиваются так, чтобы, с одной стороны, не нарушить корректность программы, а с другой стороны оптимально загрузить блоки процессора. Причём в буфере находятся и переупорядочиваются одновременно микрооперации нескольких идущих подряд команд. Чтобы получить больше свободы для переупорядочивания команд, процессор выполняет переименование регистров: для разных микроопераций, работающих с одними и теми же регистрами, назначаются новые регистры. Получившиеся микрооперации выполняются шестью блоками процессора - тремя АЛУ и тремя блоками доступа к памяти. При обнаружении условного перехода одновременно начинают обрабатываться обе ветви then и else, то есть используется спекулятивное исполнение программы. Но после фактического вычисления условия фиксируются только результаты команд из выбранной в переходе ветки.

Компания Intel реализовала внеочередное исполнение команд задолго до запуска в производство современных многоядерных процессоров, в рамках процессоров Intel Pentium Pro в начале 2000-х годов. Было замечено, что блоки процессора выполняли микрооперации эффективно, но часто простаивали, ожидая результатов выборки машинных команд из оперативной памяти. Для того, чтобы оптимально загрузить эти блоки, была создана технология HyperThreading. Она выбирала машинные команды из оперативной памяти в двух параллельных потоках. Одноядерный процессор с применением технологии HyperThreading, фактически, начинает работать, как двухъядерный. Технология HyperThreading была запатентована сотрудником компании Sun Microsystems в 1994 году, но впервые была реализована в лишь 2002 году (Intel).

Вопросы

  1. Дайте определение конвейера.
  2. Дайте определение конфликта на конвейере.
  3. Перечислите виды конфликтов конвейера.
  4. Что такое зависимые команды?
  5. Что такое конфликт по ресурсам?
  6. Что такое конфликт по управлению?
  7. Перечислите способы преодоления конфликтов.
  8. Что такое статическое переупорядочивание команд при решении конфликтов?
  9. Расскажите про использование команды NOP для разрешения конфликтов.
  10. Что такое динамическое разрешение конфликтов?
  11. Какой подход используется при разрешении конфликтов на конвейерах CICS-процессоров и почему?
  12. Какой подход используется при разрешении конфликтов на конвейерах RICS-процессоров и почему?
  13. Зачем нужна система предсказания условных переходов?
  14. Как CISC-процессоры разрешают конфликты конвейера?
  15. Каковы особенности разрешения конфликтов в RISC-процессорах?
  16. Почему конвейеризация RISC-процессоров проще, чем CISC?
  17. Что такое суперскалярность?
  18. Что такое внеочередное исполнение машинных команд?
  19. Расскажите про технологию HyperThreading.

Литература

  1. Гуров В.В. Архитектура микропроцессоров / Интернет-университет информационных технологий, Интернет-Университет Информационных Технологий (ИНТУИТ), Бином. 2010. 272 с.
  2. Хорошевский В.Г. Архитектура вычислительных систем.: Учеб. пособие. 2-e изд., перераб. и доп. M.: Изд-во МГТУ им. H.Э. Баумана, 2008. 520 c.
  3. Таненбаум Э., Остин Т. Архитектура компьютера. 6-е изд. СПб.: Питер, 2013. 816 с.
  4. Patterson D. A., Ditzel D. R. The case for the reduced instruction set computer //ACM SIGARCH Computer Architecture News. 1980, vol. 8, No 6, P. 25-33.
< Лекция 9 || Лекция 10: 12 || Лекция 11 >
Наталья Ра
Наталья Ра

Здравствуйте! Когда появится возможность сдать экзамен на сертификат?