Скачиваний:
30
Добавлен:
01.05.2014
Размер:
1.67 Mб
Скачать

3.2.7. Введение задержек для увеличения производительности

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

Поэтому непосредственная реализация оставляет аппаратные средства недоиспользованными1. Было бы, очевидно, полезным, если бы удалось модифицировать таблицу занятости так, чтобы общая структура не изменилась, а общая производительность возросла.

Такой способ существует и, как это не парадоксально, позволяет снизить среднюю латентность к нижней границе, даваемой леммой 3.1, путем увеличения времени на одно вычисление. Это увеличение времени одного вычисления возникает как побочный эффект выборочных задержек некоторых меток в каждой строке таблицы занятости. Число меток в строке не изменяется. Каждая задержка передвигает метку на один период синхронизации вправо. Короче говоря, положение задержек выбирается так, чтобы каждая строка таблицы занятости соответствовала некоторому классу совместимости того цикла, которому должна по желанию разработчика соответствовать таблица занятости. Например, на рис. 3.16, а [96] приведена таблица занятости, у которой нижняя граница достижимой латентности равна 3; но оптимальный цикл (4) имеет среднюю латентность 4. Скрупулезное введение задержек приводит к таблице занятости с тем же числом меток в каждой строке и с почти удвоенным временем вычисления, но к такой, для которой цикл (1, 5) является правильной последовательностью инициации (рис. 3.16, б).

Этот цикл имеет среднюю латентность 3, равную теоретической нижней границе, и она на 25% короче цикла в ступени без задержки. В остальной части этого раздела описываются процедуры, связанные с разработкой таких модификаций.

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

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

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

Эта базовая методика введения задержек служит руководством для введения входных задержек в каждую строку исходной таблицы занятости.

Такие задержки могут вызывать входные или выходные задержки меток в других строках. Вопрос о том, требуются они или нет, зависит от факторов, не поддающихся учету внутри самой таблицы занятости, таких как зависимость входа одной ступени от выхода другой. Это, в свою очередь, зависит от того, каким образом функции, выполняемые ступенями, взаимодействуют на уровне исходной задачи. Например, на рис. 3.17, а показан фрагмент таблицы занятости, в котором метка на ступени 2 в момент времени iдолжна быть задержана на две единицы времени. Если ни одна из прочих меток, показанных на этом фрагменте, не зависит отданной, то таблица занятости после введения задержки будет выглядеть, как представлено на рис. 3.17, б.Необходимы только две единицы времени входной задержки на ступени 2, начинающейся в момент времениj. Вход первой из этих двух дополнительных задержек должен быть таким же, как для (2,i) на рис. 3,17, а.

Рассмотрим другой случай, когда метка (4,i+ 1), представляет вычисление, которому требуются выход метки (2,i) и другая информация, имеющаяся в конвейере в момент времениi. В этом случае будут необходимы дополнительные входные задержки для графы (4,i+1), а ее метка будет передвинута на две единицы вправо (рис. 3.17, в). Если метка (4,i+2) зависит от метки (4,i+1), то перемещение метки (4,i+1) вправо требует также перемещения вправо и метки (4,i+2) (плюс перемещения всех остальных меток, представляющих зависимые вычисления). Еще одна возможность показана для вычислений, зависящих от меток (1,i) и (2,i). Здесь выход метки (1,i) должен быть задержан на две единицы времени. Ясно, что помимо таблицы занятости разработчик должен точно знать ограничения, определяемые зависимостями в решаемой задаче.

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

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

Доказательство.Доказательство проводится путем следующего построения. Пусть метки в строках приходятся на индексыa(1), а(2), . . . и пусть с(1), с(2), ... - значения, входящие в класс совместимости (не обязательно в порядке возрастания). Начнем с первого элемента каждого множества. Еслиa(1) меньше, чем с(1), то вставим с(1)-a(1) входных задержек перед первой меткой в этой строке; все метки справа также передвинутся на

с(1)-a(1) позиций вправо. Еслиa(1) больше, чем с(1), то числоa(1)-с(1) складывается с каждым элементом класса совместимости по модулю р (р - период данного цикла), что создает новый, но эквивалентный класс, используемый в остальной части доказательства. Оставшиеся метки просматриваются затем слева направо. Еслиa(i) меньше, чем с(i), то эта метка задерживается наc(i)-a(i) синхроимпульсов, а все метки в этой строке, расположенные справа отi-й, передвигаются вправо. Если жеa(i) больше, чемc(i) то достаточно большое кратное периода цикла р добавляется кc(i) чтобы обратить это неравенство. Меткаa(i) задерживается затем на соответствующую разность•

Рассмотрим пример этой процедуры. В число максимальных классов совместимости цикла (1,5) входят классы {0,2,4} и {0,3}. В первой строке матрица на рис. 3.16, а стоят три метки в позициях {0, 2, 5} . При сравнении с классом {0, 2, 4} обнаруживаем, что первые два элемента уже совпадают с a(1) = 0 = с(1) иa(2) = 2 = с(2). Однако с(3) =4 меньше, чемa(3) = 5. Прибавление периода 6 к с(3) дает 10 - число, большее, чемa(3). Задержка а(3) на 5 периодов синхронизации дает первую строку матрицы на рис. 3.16.

В строке 2 индекс a(1) = 1 больше, чем с(1) из {0,2,4}. Поэтому мы встроим эквивалентный класс совместимости {1, 3, 5} и задерживаем вторую метку на один период синхронизации. Третья метка немедленно становится на свое место.

Третья строка матрицы на рис. 3.16,а приводится к классу {2, 4} путем применения единичной задержки ко второй метке. Заметим, что {2, 4} — не только подмножество {0, 2, 4} , но еще и класс совместимости.

Хотя возможны другие схемы задержек, схема на рис. 3.16, б обладает явным преимуществом, поскольку дает правильную вычислительную последовательность, независимо от того, какие межстроковые зависимости существуют. В действительности размещение задержек было выполнено в предположении, что вычисления, представляемые любой меткой в момент времени i+1 или в более поздний момент, требуют выходных данных всех ступеней, действующих в момент времениi. Таким образом, когда метка в графе (2, 2) задерживалась, метка в графе (3, 3) задерживалась эквивалентным образом так, что ее "работа" не начиналась, пока не завершится "работа" первой метки. Точно так же метка в (2, 4) передвигалась в (2, 5), чтобы учесть задержку метки в (3, 3). Никакие новые задержки уже не нужны, поскольку метка остается в той же позиции относительно метки (2, 2) после задержки. Задержка до метки в графе (3, 4) вызывает еще один эффект, а именно, введение выходной задержки после метки (1, 2) для сохранения ее результата еще на один период синхронизации. Хотя входные задержки показаны применительно к исходной метке в (1,5), эквивалентная реализация привела бы к выходным задержкам для метки (2, 5).

Процедура, описанная в теореме 3.4, позволяет разработчику теоретически выбрать любо и цикл, средняя латентность которого не меньше чем максимальное число меток в строках, и откорректировать затем таблицу занятости так, чтобы она допускала этот цикл как последовательность латентностей. Сюда относятся и постоянные циклы, в частности, постоянные циклы (L), гдеLравняется максимальному числу меток в строках таблицы занятости. Такие циклы совершенны (см. лемму 3.9), что приводит к таблицам занятости, у которых МАLдостигает границы, указанной в лемме 3.1, и у которых хотя бы одна ступень конвейера используется на 100%. Далее, как видно из предыдущих примеров, могут быть учтены даже зависимости между отдельными вычислениями, возможно, ценой дополнительных задержек.

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

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

Соседние файлы в папке Архитектура конвейерных ЭВМ