Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Организация ЭВМиС; Орлов С.А., Цилькер Б.Я

..pdf
Скачиваний:
435
Добавлен:
25.12.2020
Размер:
5.43 Mб
Скачать

Конвейеризация вычислений

391

 

 

взаимосвязью команд по данным (риск по данным);

неоднозначностью при выборке следующей команды в случае команд, изменяющих последовательность вычислений (риск по управлению).

Структурный риск (конфликт по ресурсам) имеет место, когда несколько команд, находящихся на разных ступенях конвейера, пытаются одновременно использовать один и тот же ресурс, чаще всего — память. Так, в типовом цикле команды (см. рис. 9.3) сразу три этапа (ВК, ВО и ЗР) связаны с обращением к памяти. Подобных конфликтов частично удается избежать за счет блочной организации основной памяти и использования кэш-памяти — имеется вероятность того, что команды будут обращаться либо к разным банкам ОП, либо одна из них станет обращаться к основной памяти, а другая — к кэш-памяти. С этих позиций кэш-память выгоднее разделять на кэш-память команд и кэш-память данных. Конфликты из-за одновременного обращения к памяти могут и не возникать, поскольку для многих команд этапы выборки операнда и записи результата не требуются. В целом, влияние структурного риска на производительность конвейера по сравнению с другими видами рисков сравнительно невелико.

Риск по данным, в противоположность структурному риску, — типичная и регулярно возникающая ситуация. Для пояснения сущности взаимосвязи команд по данным положим, что две команды в конвейере (i и j) предусматривают обращение к одной и той же переменной x, причем команда i предшествует команде j. В общем случае между i и j ожидаются три типа конфликтов по данным (рис. 9.4):

«чтение после записи» (ЧПЗ): команда j читает x до того, как команда i успела записать новое значение x, то есть команда j ошибочно получит старое значение x вместо нового.

«запись после чтения» (ЗПЧ): команда j записывает новое значение x до того, как команда i успела прочитать x, то есть команда i ошибочно получит новое значение x вместо старого.

«запись после записи» (ЗПЗ): команда j записывает новое значение x прежде, чем команда i успела записать в качестве x свое значение, и окончательно x ошибочно будет содержать значение, определенное командой i, а не командой j.

Возможен и четвертый случай, когда команда j читает x прежде команды i. Этот случай не вызывает никаких конфликтов, поскольку как i, так и j получат верное значение x.

Наиболее частый вид конфликтов по данным — ЧПЗ, поскольку операция чтения в цикле команды (этап ВО) предшествует операции записи (этап ЗР). По той же причине конфликты типа ЗПЧ большой проблемы не представляют. Сложности появляются, только если структура конвейера допускает запись прежде чтения или если команды в конвейере обрабатываются в последовательности, отличной от предписанной программой. Такое возможно, если командам в конвейере разрешается «догонять» предшествующие им команды, приостановленные из-за какого-то конфликта. Конфликт типа ЗПЗ также не вызывает особых проблем в конвейерах, где команды следуют в порядке, определенном программой, и могут производить запись только на этапе ЗР. В худшем случае, когда одна команда догоняет другую

392

Глава 9. Процессоры

 

 

из-за приостановки последней, имеет место конфликт по ресурсу — попытка одновременного доступа к одной и той же ячейке.

Рис. 9.4. Конфликты по данным: а — «чтение после записи»; б — «запись после чтения»; в — «запись после записи»

В борьбе с конфликтами по данным выделяют два аспекта: своевременное обнаружение потенциального конфликта и его устранение. Признаком возникновения конфликта по данным между двумя командами i и j служит невыполнение хотя бы одного из трех условий Бернстейна (Bernstein's Conditions):

для ЧПЗ: O(i) ∩ I( j) = ;для ЗПЧ: I(i) ∩ O( j) = ;для ЗПЗ: O(i) ∩ O( j) = .

Здесь O(k) — множество ячеек, изменяемых командой k; I(l ) — множество ячеек, читаемых командой l; — пустое множество; ∩ — операция пересечения множеств.

Условия можно распространить и на большее число команд: для трех команд подобных уравнений будет 9, для четырех команд — 18 (по три на каждую пару). Соблюдение соотношений является достаточным, но не необходимым условием, поскольку в ряде случаев конфликты могут и не возникать.

Для борьбы с конфликтами по данным применяются как программные, так и аппаратные методы.

Программные методы ориентированы на устранение самой возможности конфликтов еще на стадии компиляции программы. Оптимизирующий компилятор пытается создать такой объектный код, чтобы между командами, склонными к конфликтам, находилось достаточное количество нейтральных в этом плане команд программы. Если такое не удается, то между конфликтующими командами компилятор вставляет необходимое количество команд типа «Нет операции».

Фактическое разрешение конфликтов возлагается на аппаратные методы. Наиболее очевидным решением является остановка команды j на несколько тактов с тем, чтобы команда i успела завершиться или, по крайней мере, миновать ступень конвейера, на которой возникает конфликт. Соответственно задерживаются

Конвейеризация вычислений

393

 

 

и команды, следующие в конвейере за j-й командой. Данную ситуацию называют «пузырьком» в конвейере. Иногда приостанавливают только команду j, не задерживая следующие за ней команды. Это более эффективный прием, но его реализация усложняет конвейер.

Понятно, что остановки конвейера снижают его эффективность, и разработчики ВМ всячески стремятся сократить общее число остановок или хотя бы их длительность. Поскольку наиболее частые конфликты по данным — это ЧПЗ, основные усилия тратятся на противодействие именно этому типу конфликтов. Среди известных методов борьбы с ЧПЗ наибольшее распространение получил прием ускоренного продвижения информации (forwarding). Обычно между двумя соседними ступенями конвейера располагается буферный регистр, через который предшествующая ступень передает результат своей работы на последующую ступень, то есть передача информации возможна лишь между соседними ступенями конвейера. При ускоренном продвижении, когда для выполнения команды требуется операнд, уже вычисленный предыдущей командой, этот операнд может быть получен непосредственно из соответствующего буферного регистра, минуя все промежуточные ступени конвейера. С данной целью в конвейере предусматриваются дополнительные тракты пересылки информации (тракты опережения, тракты обхода), снабженные средствами коммутации трактов.

Наибольшие проблемы при создании эффективного конвейера обусловлены командами, изменяющими естественный порядок вычислений1. Простейший конвейер ориентирован на линейные программы. В нем ступень выборки извлекает команды из ячеек памяти с последовательными адресами, используя для этого счетчик команд (СК). Адрес очередной команды в линейной программе формируется автоматически, за счет прибавления к содержимому СК числа, равного длине текущей команды в байтах. Реальные программы практически никогда не бывают линейными. В них обязательно присутствуют команды управления, изменяющие последовательность вычислений: безусловный и условный переход, вызов процедуры, возврат из процедуры и т. п. Доля подобных команд в программе оценивается как 10–20% (по некоторым источникам она существенно больше). Выполнение команд, изменяющих последовательность вычислений (в дальнейшем будем их называть командами перехода), может приводить к приостановке конвейера на несколько тактов, из-за чего производительность процессора снижается. Приостановки конвейера при выполнении команд перехода обусловлены двумя факторами.

Первый фактор характерен для любой команды перехода и связан с выборкой команды из точки перехода (по адресу, указанному в команде перехода). То, что текущая команда относится к командам перехода, становится ясным только после прохождения ступени декодирования, что для конвейера, взятого в качестве примера, происходит спустя два такта от момента поступления команды на конвейер. За это время на первые ступени конвейера уже поступят новые команды, извлеченные в предположении, что естественный порядок вычислений не будет нарушен. В случае

1В фон-неймановской ВМ команды размещаются в ячейках памяти и извлекаются для выполнения в том же порядке, в каком они следуют в программе. Такую последовательность выполнения команд программы называют естественной.

394

Глава 9. Процессоры

 

 

перехода эти начальные ступени нужно очистить и загрузить в конвейер команду, расположенную по адресу перехода, для чего требуется исполнительный адрес последней. Поскольку в командах перехода обычно указаны лишь способ адресации и адресный код, исполнительный адрес предварительно должен быть вычислен, что и делается на третьей ступени конвейера. Таким образом, реализация перехода в конвейере требует определенных дополнительных операций, выполнение которых равносильно остановке конвейера, как минимум, на два такта.

Вторая причина нарушения ритмичности работы конвейера имеет отношение только к командам условного перехода. Для пояснения сути проблемы воспользуемся ранее приведеннымпримером(см.рис.9.3),несколькоизменивпостановкузадачи(рис.9.5).

Рис. 9.5. Влияние команды условного перехода на работу конвейера команд

Пусть команда 3 — это условный переход к команде 15. До завершения команды 3 невозможно определить, какая из команд (4-я или 15-я) должна выполняться следующей, поэтому конвейер просто загружает следующую команду в последовательности (команду 4) и продолжает свою работу. В варианте, показанном на рис. 9.3, переход не произошел, и получена максимально возможная производительность. На рис. 9.5 переход имеет место, о чем неизвестно до 7-го шага. В этой точке конвейер должен быть очищен от ненужных команд, выполнявшихся до данного момента. Лишь на шаге 8 на конвейер поступает нужная команда 15, из-за чего в течение тактов от 10 до 14 не будет завершена ни одна другая команда. Это и есть издержки из-за невозможности предвидения исхода команды условного перехода. Как видно, они существенно больше, чем для команд безусловного перехода (когда анализировать условие перехода нет нужды). Если же условие перехода не подтверждается, издержки вовсе отсутствуют.

Выборка команды из точки перехода

Для сокращения задержек, обусловленных выборкой команды из точки перехода, применяются несколько подходов:

Конвейеризация вычислений

395

 

 

манды;вычисление исполнительного адреса перехода на ступени декодирования ко-

использование буфера адресов перехода;хода;использование кэш-памяти для хранения команд, расположенных в точке пере-

использование буфера цикла.

При первом из перечисленных подходов в результате декодирования команды выясняется не только ее принадлежность к командам перехода, но также способ адресации и адресный код точки перехода. Это позволяет сразу же приступить к вычислению исполнительного адреса перехода, не дожидаясь передачи команды на третью ступень конвейера, и тем самым сократить время остановки конвейера с двух тактов до одного. Для реализации этой идеи в состав ступени декодирования вводятся дополнительные сумматоры, с помощью которых и вычисляется исполнительный адрес точки перехода.

Второй подход предполагает использование буфера адресов перехода (BTB, Branch Target Buffer), представляющего собой кэш-память небольшой емкости. В BTB хранятся исполнительные адреса точек перехода, которые были вычислены при выполнении нескольких последних команд, причем тех, что завершились переходом. В роли тегов выступают адреса соответствующих команд. Перед выборкой очередной команды ее адрес (содержимое счетчика команд) сравнивается с адресами команд, представленных в BTB. Для команды, найденной в буфере адресов перехода, исполнительный адрес точки перехода не вычисляется, а берется из BTB, благодаря чему выборка команды из точки перехода может быть начата на один такт раньше. Команда, ссылка на которую в BTB отсутствует, обрабатывается стандартным образом. Если это команда перехода, то полученный при ее выполнении исполнительный адрес точки перехода заносится в BTB, при условии, что команда завершилась переходом. При замещении информации в BTB обычно применяется алгоритм LRU, рассмотренный ранее применительно к кэш-памяти.

Применение BTB дает наибольший эффект, когда отдельные команды перехода в программе выполняются многократно, что типично для циклов. Обычно BTB используется не самостоятельно, а в составе других, более сложных схем компенсации конфликтов по управлению.

Кэш-память команд, расположенных в точке перехода (BTIC, Branch Target Instruc­ tion Cache), — это усовершенствованный вариант BTB, где в кэш-память помимо исполнительного адреса команды в точке перехода записывается также и код этой команды. За счет увеличения емкости BTIC позволяет при повторном выполнении команды перехода исключить не только этап вычисления исполнительного адреса точки перехода, но и этап выборки расположенной там команды. Преимущества данного подхода в наибольшей степени проявляются при многократном исполнении одних и тех же команд перехода, главным образом при реализации программных циклов.

Буфер цикла представляет собой маленькую быстродействующую память, входящую в состав первой ступени конвейера, где производится выборка команд.

396

Глава 9. Процессоры

 

 

В буфере сохраняются коды n последних команд в той последовательности, в которой производилась выборка команд. Когда имеет место переход, аппаратура сначала проверяет, нет ли нужной команды в буфере, и если это так, то команда извлекается из буфера. Стратегия наиболее эффективна при реализации циклов и итераций, чем и объясняется название буфера. Если буфер достаточно велик, чтобы охватить все тело цикла, выборку команд из памяти достаточно выполнить только один раз в первой итерации, поскольку необходимые для последующих итераций команды уже находятся в буфере.

По принципу использования буфер цикла похож на BTIC, с той разницей, что в нем сохраняется последовательность выполнения команд, а сам буфер меньше по емкости и дешевле.

Среди ВМ, где реализован буфер цикла, можно упомянуть некоторые вычислительные машины фирмы CDC (Star 100, 6600, 7600) и суперЭВМ CRAY-1. Специализированная версия буфера цикла имеется и в микропроцессоре Motorola 68010, где буфер используется для особых циклов, включающих в себя команду «Уменьшение и переход по условию».

Методы решения проблемы условного перехода

Несмотря на важность аспекта вычисления исполнительного адреса точки перехода, основные усилия проектировщиков ВМ направлены на решение проблемы условных переходов, поскольку именно последние приводят к наибольшим издержкам в работе конвейера. Для устранения или частичного сокращения этих издержек были предложены различные подходы, из которых наиболее актуальна идея предсказания перехода.

Предсказание переходов

Предсказание переходов на сегодняшний день рассматривается как один из наиболее эффективных способов борьбы с конфликтами по управлению. Идея заключается в том, что еще до момента выполнения команды условного перехода или сразу же после ее поступления на конвейер делается предположение о наиболее вероятном исходе такой команды (переход произойдет или не произойдет). Последующие команды подаются на конвейер в соответствии с предсказанием. Для иллюстрации вернемся к примеру (см. рис. 9.5), где команда 3 является командой условного перехода к команде 15. Пусть для команды 3 предсказано, что переход не произойдет. Тогда вслед за командой 3 на конвейер будут поданы команды 4, 5, 6 и т. д. Если предсказан переход, то после команды 3 на конвейер подаются команды 15, 16, 17, … При ошибочном предсказании конвейер необходимо вернуть к состоянию, с которого началась выборка «ненужных» команд (очистить начальные ступени конвейера), и приступить к загрузке, начиная с «правильной» точки, что по эффекту эквивалентно приостановке конвейера. Цена ошибки может оказаться достаточно высокой, но при правильных предсказаниях существенен и выигрыш — конвейер функционирует ритмично без остановок и задержек, причем выигрыш тем больше, чем выше точность предсказания. Термин «точность

Конвейеризация вычислений

397

 

 

предсказания» в дальнейшем будем трактовать как процентное отношение числа правильных предсказаний к их общему количеству. В работе [62] дается следующая оценка: чтобы снижение производительности конвейера из-за его остановок по причине конфликтов по управлению не превысило 10%, точность предсказания переходов должна быть выше 97,7%.

К настоящему моменту известно более двух десятков различных способов реализации идеи предсказания переходов [119, 167–169], отличающихся друг от друга исходной информацией, на основании которой делается прогноз, сложностью реализации и, главное, точностью предсказания. При классификации схем предсказания переходов обычно выделяют два подхода: статический и динамический, в зависимости от того, когда и на базе какой информации делается предсказание.

Количественные показатели эффективности большинства из приводимых в учебнике методов предсказания переходов базируются на результатах исследований, опубликованных в [61, 82, 87, 141, 149, 166].

Статическое предсказание переходов

Статическое предсказание переходов осуществляется на основе некоторой априорной информации о подлежащей выполнению программе. Предсказание делается на этапе компиляции программы и в процессе вычислений уже не меняется. Главное различие между известными механизмами статического прогнозирования заключается в виде информации, используемой для предсказания, и ее трактовке. Исходная информация может быть получена двумя путями: на основе анализа кода программы или в результате ее профилирования (термин «профилирование» поясняется ниже).

Известные стратегии статического предсказания для команд УП можно классифицировать следующим образом:

переход происходит всегда (ПВ); переход не происходит никогда (ПН);

предсказание определяется по результатам профилирования; предсказание определяется кодом операции команды перехода; предсказание зависит от направления перехода; при первом выполнении команды переход имеет место всегда.

В первом из перечисленных вариантов предполагается, что каждая команда условного перехода в программе обязательно завершится переходом, и, с учетом такого предсказания, дальнейшая выборка команд производится, начиная с адреса перехода. В основе второй стратегии лежит прямо противоположный подход: ни одна из команд условного перехода в программе никогда не завершается переходом, поэтому выборка команд продолжается в естественной последовательности.

Интуитивное представление, что обе стратегии должны приводить к верному предсказанию в среднем в 50% случаев, на практике не подтверждается. Так, по результатам экспериментов, приведенным в [141], предсказание об обязательном переходе оказалось правильным в среднем для 76% команд УП, а по данным [107] — 68%.

398

Глава 9. Процессоры

 

 

В других источниках встречаются и иные численные оценки точности прогноза при стратегии ПВ, в частности 60% и 71,9%. В то же время в работе [170] отмечается, что для ряда программ, связанных с целочисленной обработкой, процент правильных предсказаний может опускаться ниже 50%. Цифры свидетельствуют, что успешность стратегии ПВ существенно зависит от характера программы и методов программирования, что, естественно, можно рассматривать как недостаток. Тем не менее стратегия все же используется в ряде ВМ, в частности MIPS-X, SuperSPARC, микропроцессорах i486 фирмы Intel. Связано это, скорее всего, с простотой реализации и с тем, что для определенного класса программ стратегию можно считать достаточно эффективной.

Схожая ситуация характерна и для стратегии ПН, где предполагается, что ни одна из команд УП в программе никогда не завершается переходом. Несмотря на схожесть с ПВ, процент правильных исходов здесь обычно ниже, особенно в программах с большим количеством циклов. Стратегия ПН реализована в конвейерах микропроцессоров M68020 и MC88000, вычислительной машине VAX 11/780.

Сравнительная оценка стратегий ПВ и ПН показывает, что ни одна из них не имеет явных преимуществ над другой. Тем не менее анализ большого количества программ [110] показывает, что условные переходы имеют место более чем в 50% случаев, поэтому если стоимость реализации двух рассмотренных вариантов одинакова, то предпочтение следует отдать стратегии ПВ.

В третьем из перечисленных способов статического предсказания назначение командам УП наиболее вероятного исхода производится по результатам профилирования подлежащих выполнению программ. Под профилированием подразумевается выполнение программы при некотором эталонном наборе исходных данных, сопровождающееся сбором информации об исходах каждой команды условного перехода. Тем командам, которые чаще завершались переходом, назначается стратегия ПВ, а всем остальным — ПН. Выбор фиксируется в специальном бите кода операции команд УП. Некоторые компиляторы самостоятельно проводят профилирование программы и по его результатам устанавливают этот бит в формируемом объектном коде. При выполнении программы поведение конвейера команд определяется после выборки команды по состоянию упомянутого бита. Основной недостаток метода связан с тем, что изменение набора исходных данных для профилирования может существенно менять поведение одних и тех же команд условного перехода. Точность правильного предсказания, по данным исследований, достигает 75%. Стратегия используется в процессорах MIPS 4x00 и PowerPC 603.

При предсказании на основе кода операции команды перехода для одних команд предполагается, что переход произойдет, для других — его не случится. Например, для команды перехода по переполнению логично предположить, что перехода не будет. На практике назначение разным видам команд УП наиболее вероятного исхода чаще производится по результатам профилирования программ.

Эффективность предсказания зависит от характера программы. Этим, в частности, объясняется различие в выводах, полученных на основе разных исследований. Так, согласно [110] рассматриваемая стратегия приводит к успеху в среднем более чем в 75% случаев, а иные исследования [141] дают цифру 86,7%.

Конвейеризация вычислений

399

 

 

Достаточно логичным представляется предсказание исходя из направления перехода. Если адрес выполняемой команды УП (содержимое счетчика команд) больше указанного в этой команде адреса точки перехода, говорят о переходе «назад», и для такой команды назначается стратегия ПВ. Переход к адресу, превышающему адрес команды перехода, считается переходом «вперед», и такой команде назначается стратегия ПН. В основе рассматриваемого подхода лежит статистика по множеству программ, согласно которой большинство команд УП в программах используются для организации циклов, причем, как правило, переходы происходят к началу цикла (переходы «назад»). Согласно [93], для команд, выполняющих переход «назад», фактический переход имеет место в 85% случаев. Для переходов «вперед» эта цифра составляет 65%. Таким образом, для команд условного перехода «назад» логично принять, что переход происходит всегда. Среди ВМ, где описанная стратегия является основной, можно упомянуть MicroSPARC-2 и PA-7x00.

В последней из рассматриваемых статических стратегий при первом выполнении любой команды условного перехода делается предсказание, что переход обязательно будет. Предсказания на последующее выполнение команды зависят от правильности начального предсказания. Стратегию можно считать статической только частично, поскольку она однозначно определяет исход команды лишь при первом ее выполнении. Далее стратегия становится динамической. Точность прогноза в соответствии с данной стратегией выше, чем у всех предшествующих, что подтверждают результаты, приведенные в [141]. К сожалению, при больших объемах программ вариант практически нереализуем из-за того, что нужно отслеживать слишком мно­ го команд условного перехода.

Динамическое предсказание переходов

В динамических стратегиях решение о наиболее вероятном исходе команды УП принимается в ходе вычислений исходя из информации о предшествующих переходах (истории переходов), собираемой в процессе выполнения программы. В целом, динамические стратегии по сравнению со статическими обеспечивают более высокую точность предсказания. Прежде чем приступить к рассмотрению конкретных динамических механизмов предсказания переходов, остановимся на некоторых положениях, общих для всех динамических подходов.

Идея динамического предсказания переходов предполагает накопление информации о том, как завершались команды УП при их предшествующем исполнении. История переходов фиксируется в форме таблицы, каждый элемент которой состоит из m битов. Нужный элемент таблицы выбирается с помощью k-разрядной двоичной комбинации — шаблона (pattern). Этим объясняется общепринятое название таблицы предыстории переходов — таблица истории для шаблонов (PHT, Pattern History Table).

При описании динамических схем предсказания переходов их часто расценивают как один из видов автоматов Мура, при этом содержимое элементов PHT трактуется как информация, отображающая текущее состояние автомата. В работе [167] рассмотрены различные варианты подобных автоматов, однако реально интерес представляют лишь три варианта, которые условно обозначим A1, A2 и A3.

400

Глава 9. Процессоры

 

 

Автомат A1 имеет только два состояния, поэтому каждый элемент PHT состоит из одного бита (m = 1), значение которого отражает исход последнего выполнения команды условного перехода. Диаграмма состояний автомата A1 приведена на рис. 9.6.

Рис. 9.6. Диаграмма состояний автомата А1

Если команда завершилась переходом, то в соответствующий элемент PHT заносится единица, иначе — ноль. Очередное предсказание совпадает с итогом предыдущего выполнения команды. После исполнения очередной команды содержимое элемента корректируется в соответствии с ее итогом.

Два других автомата предполагают большее число состояний, поэтому в них используются PHT с многоразрядными элементами. Чаще всего ограничиваются двумя разрядами (m = 2) и, соответственно, автоматами с четырьмя состояниями.

В двухразрядном автомате A2 элементы PHT отражают исходы двух последних выполненных команд условного перехода и заполняются по схеме регистра сдвига. После исполнения очередной команды УП содержимое выделенного этой команде элемента PHT сдвигается влево на один разряд, а в освободившуюся позицию заносится единица (если переход был) или ноль (если перехода не было). При наличии в элементе PHT хотя бы одной единицы для очередного выполнения команды делается предсказание, что переход будет. При нулевом значении элемента PHT считается, что перехода не будет. Диаграмма состояний для такого автомата показана на рис. 9.7.

Рис. 9.7. Диаграмма состояний двухразрядного автомата А2