Московский государственный университет путей сообщения
Опубликован: 22.12.2006 | Доступ: свободный | Студентов: 2438 / 569 | Оценка: 4.07 / 4.02 | Длительность: 16:07:00
ISBN: 978-5-9556-0071-0
Специальности: Разработчик аппаратуры

Лекция 6: Оптимальное потактовое расписание выполнения работ в многофункциональном арифметическо-логическом устройстве

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >

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

Граф-схема непрерываемого участка программы

Рис. 6.2. Граф-схема непрерываемого участка программы

Формирование "длинных" командных слов, осуществляющих считывание, не представляет интереса. Здесь в еще большей степени все определяется конкретной структурой команды. Для краткости изложения мы даже можем считать, что считывание указывается во всех позициях команды, допуская одновременный "запуск" нескольких считываний. Напомним, что асинхронное выполнение считываний, обусловленное множеством возможных конфликтов при обращении процессоров многопроцессорной ВС к расслоенной оперативной памяти, в МВК "Эльбрус-3 (3М)" синхронизируется с помощью битов значимости тех регистров СОЗУ, в которые эти считывания производятся. Так что обработка считываемых данных будет правильной и возможной только по поступлении данных в эти регистры.

Выше говорилось, что компоновка командных слов производится на фоне имитации выполнения команд.

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

Значит, определение трехадресных команд, на основе которых может формироваться командное слово, производится в результате выявления в каждом такте команд i \in  1, \dots , N\}, ( Nдлина линейного участка), для которых имеет значение "истина" (\alpha _{i}=1) предикат

\alpha_1 = 1 \notag \\
\alpha_2 = A_{21} \vee A_{22} \neq A_{13} \notag \\
\dots \dots \dots \dots \dots \dots \notag \\
\alpha_i = A_{i1} \vee A_{i2} \neq A_{13} \vee A_{23} \vee \ldots \vee
A_{i-1,3}\notag \\
\dots \dots \dots \dots \dots \dots ( 6.11)

Выявленные команды со значением \alpha _{i} = 1, и использованные при компоновке командного слова, как бы начинают выполняться. Для имитации этого выполнения эти команды снабжаются счетчиком тактов выполнения. Этот счетчик сначала "взводится" — ему задается время выполнения команды. Затем, при имитации состояния системы в последующих тактах, значения таких счетчиков уменьшаются, и по достижении нулевого значения команда исключается из рассмотрения — из первоначально полученного текста в трехадресных командах. Это служит изменению результатов сравнения в (6.11) при анализе оставшихся команд, появлению новых команд, на основе которых могут формироваться командные слова, и т.д.

Алгоритм 1 компоновки "длинных" командных слов.

  1. Формируем группу команд считывания. Исключаем команды считывания из записи программы в трехадресных командах.
  2. Полагаем t = 0 ( t — модельное время, номер такта).
  3. Полагаем t := t +1. Приступаем к компоновке очередного командного слова. Если это слово — первое, переходим к выполнению шага 6.
  4. Уменьшаем на единицу значения всех счетчиков времени команд, ранее назначенных (условно) на выполнение, т.е. включенных в командные слова ранее.
  5. Исключаем из записи программы в трехадресных командах те команды, для которых значения счетчиков стали нулевыми.
  6. Пересчитываем для всех команд значения \alpha по (6.11).
  7. Выполняем непосредственно компоновку очередного командного слова, стремясь заполнить все его позиции:

    Записываем в первую позицию команду сложения, если такая есть среди команд со значением \alpha  = 1 и она ранее не была "назначена" (не имеет отличного от нуля значения счетчика). В случае успешной записи "взводим" ее счетчик тактов выполнения.

    То же пытаемся сделать с каждой позицией "длинного" командного слова.

    Возможно получение "пустых" командных слов, требующих пропуска такта (NOP — no operation) из-за неготовности операндов.

  8. Проверяем: есть среди команд в программе не назначенные команды? Если да — переходим к выполнению шага 2, если нет — компоновка "длинных" командных слов линейного участка закончена.

Пропустим формирование команд считывания в рассматриваемом примере. Эти команды отчеркнуты в таблице 1 как уже условно выполненные. Легко определить \alpha _{7} = \alpha _{8} = \dots  = \alpha _{17} = 1 (наглядно отображено графом). Тогда первое командное слово имеет вид

\begin{center}
1. \begin{tabular}{|c|c|c|c|c|}
\hline
10 & 13 & 7 & 9 & {17} \\
\hline
\end{tabular}
\end{center}

Здесь мы для краткости не переписываем всю команду, а ставим лишь номер ее трехадресного эквивалента в таблице 1.

Взводим счетчики числа тактов выполнения использованных ("назначенных") команд, как показано в той же таблице.

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

\begin{center}
2. \begin{tabular}{|c|c|c|c|c|}
\hline
14 & 15 & 8 & 12 & \phantom{10} \\
\hline
\end{tabular}
\end{center}

В третьем такте исключается команда 17, т.к. ее счетчик достигает нулевого значения. Появляется новое значение \alpha _{23} = 1. Формируемая "длинная" команда имеет вид

\begin{center}
3. \begin{tabular}{|c|c|c|c|c|}
\hline
16 & \phantom{10} & 11 & \phantom{10} & 23\\
\hline
\end{tabular}
\end{center}

В следующем такте исключим из программы (табл. 3.1) команды 10 и 13 (команда 17 исключена ранее, а команды 1—6 мы отказались рассматривать подробно). Новый вид используемой программы в трехадресных командах отобразим таблицей 6.2, из которой исключены строки, оставшиеся без изменения.

Таблица 6.2.
КОП A1 A2 A3 \alpha Счетчик (4-й такт) Счетчик (5-й такт)
7 x r4 r1 r7 1 2 1
8 x r5 r2 r8 1 3 2
9 : r6 r4 r9 1 4 3
11 \uparrow r4 2 r11 1 4 3
12 : r6 r2 r12 1 5 4
14 - r5 r2 r14 1 1 0
15 + r4 r5 r15 1 1 0
16 + r1 r2 r16 1 2 1
18 - r7 r8 r18
19 + r5 r9 r19
20 + r11 r1 r20 1 3 2
21 x r13 r5 r21 1 5 4
22 : r15 r16 r22
23 if... r17 r4 r23 1 0
r1
24 Зп r18 <A>
...

Появились две "не назначенные" команды со значением \alpha _{20} = \alpha _{21} = 1. Тогда следующее командное слово имеет вид

\begin{center}
4. \begin{tabular}{|c|c|c|c|c|}
\hline
20 & \phantom{10} & 21 & \phantom{10} & \phantom{10}\\
\hline
\end{tabular}
\end{center}

В следующем такте исключаются команды 14, 15 и 23. Новые значения \alpha и счетчиков отражены в таблице 6.3, где также исключены не изменившиеся строки.

Таблица 6.3.
КОП A1 A2 A3 \alpha Счетчик (5-й такт) Счетчик (6-й такт)
7 x r4 r1 r7 1 1 0
8 x r5 r2 r8 1 2 1
9 : r6 r4 r9 1 3 2
11 \uparrow r4 2 r11 1 3 2
12 : r6 r2 r12 1 4 3
15 + r4 r5 r15 1 1 0
16 + r1 r2 r16 1 1 0
18 - r7 r8 r18
19 + r5 r9 r19
20 + r11 r1 r20 1 2 1
21 x r13 r5 r21 1 4 3
22 : r15 r16 r22
24 Зп r18 <A>
...

Не появилось ни одной новой команды со значением \alpha  = 1. Значит, следующая команда — пропуск такта:

\begin{center}
5. \begin{tabular}{|c|c|c|c|c|}
\hline
\phantom{10} & \phantom{10} & \phantom{10} & \phantom{10} &
\phantom{10} \\
\hline
\end{tabular}
\end{center}

В следующем такте исключим из рассмотрения команды 7 и 16 и т.д.

Окончательно скомпонованная программа, начиная с шестого командного слова, представлена таблицей 6.4. "Пустые" команды — пропуски тактов — пропущены.

Таблица 6.4.
"+" "+" "x" ":" ЛОГ
6. 18 22
7. 27
8. 19
9. 28 21 25 24
10. 26
11. 29
12. 33
16. 30
17. 32 31
19. 34
21. 35
23. 36
25. 38 37
28. 39
34. 40
40. 41

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

  • Считать в такой структуре следует действительно сложные, но распараллеливаемые выражения.
  • Необходимо стремиться к одновременному счету многих независимых выражений. Хорошей основой для эффективного использования оборудования является счет условий и альтернативных операторов в условных выражениях, а также — сложных конструкций на базе таких выражений.
< Лекция 5 || Лекция 6: 12345 || Лекция 7 >