Архитектура параллельных вычислительных систем

Оптимальное программирование в архитектуре управления каждым тактом

Разбить на страницы
Показывать лекцию целиком

Расчет нейросети

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

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

Рассмотрим пример распараллеливания типичного фрагмента обработки нейросети в режиме распознавания. Он демонстрирует способ оптимальной реализации на процессоре, где АЛУ содержит несколько исполнительных устройств (ИУ) различной специализации, функций нейрокомпьютера. Максимальная загрузка всех устройств возможна тогда, когда в каждом линейном участке программы предусмотрена обработка не одного, а нескольких нейронов сети. Покажем это на фрагменте алгоритма имитации работы нейронов в режиме распознавания, т.е. в режиме, требующем максимальной производительности нейрокомпьютера.

Программирование трехадресных команд

В режиме распознавания в простейшей модели нейрона решается задача суммирования взвешенных, в соответствии с регулируемыми на этапе обучения весами {wi},i = 1, ..., n, синапсов — значений синапсических сигналов {xi} и сравнение полученной суммы с порогом h. Если сумма превышает порог, происходит возбуждение нейрона с величиной y:$$y = \left\{ \begin{array}{ll} \Delta = \sum\limits_{i=1}^n w_i x_i - h, \t{ при } \Delta > 0, \\ 0, \t{ при } \Delta \leqslant 0. \\ \end{array} \right.$$

Для n = 3 запишем в трехадресных командах программу одновременной обработки двух нейронов. Это двукратное повторение одной и той же последовательности команд, отличающейся используемыми адресами (табл. 7.1).

КОПA1A2A3
1x <w11> <x11> r1
2x <w12> <x12> r2
3x <w13> <x13> r3
4+ r1 r2 r4
5+ r3 r4 r5
6- r5 <h1> r6
7> r6 r7
8if... r7 r6 <y1>
0
9x <w21> <x21> r8
10x <w22> <x22> r9
11x <w23> <x23> r10
12+ r8 r9 r11
13+ r10 r11 r12
14- r12 <h2> r13
15> r13 r14
16if... r14 r13 <y2>
0

Очевидно, программа совместной обработки трех нейронов будет содержать трехкратное повторение такого же участка и т.д.

Компоновка "длинных" команд

Выше было показано, что при решении задач параллельного программирования для полного задания информации о частичной упорядоченности работ целесообразно использовать квадратные (размер m равен числу трехадресных команд линейного участка) нуль-единичные матрицы следования S, дополненные столбцами весов — времен выполнения работ.

Такая матрица для нашего примера представлена в таблице 7.2, где кроме весов указаны также поздние сроки $$\tau$$ начала выполнения команд (для суммы всех времен выполнения работ Т = 56 ) и объемы $$\theta$$ последующих работ. Эти значения найдены по приведенным выше алгоритмам. Если при совместном анализе двух команд ( i -й и j -й, i>j ) первый или второй адрес "нижней" команды совпадает с третьим адресом "верхней" команды, то элемент матрицы S на пересечении i -й строки и j -го столбца полагается равным единице $$\alpha _{ij} = 1$$, в противном случае он равен нулю.

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

В приведенной матрице отражены и транзитивные связи.

T $$\tau$$ $$\theta$$
1 5 38 18
2 5 38 18
3 5 41 15
4 1 1 3 43 13
5 1 1 1 1 3 46 10
6 1 1 1 1 1 3 49 7
7 1 1 1 1 1 1 2 52 4
8 1 1 1 1 1 1 1 2 54 2
9     5 38 18
10 5 38 18
11 5 41 15
12 1 1 3 43 13
13 1 1 1 1 3 46 10
14 1 1 1 1 1 3 49 7
15 1 1 1 1 1 1 2 52 4
16 1 1 1 1 1 1 1 2 54 2

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

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

Такты1234567891011121314151617181920
15 4 3 2 1 0 Исключаем строку и столбец из матрицы S
25 4 3 2 1 0 Исключаем ...
3 5 4 3 2 1 0 Исключаем ...
4 3 2 1 0 Исключаем ...
5 3 2 1 0 Исключаем ...
6 3 2 1 0 Исключаем ...
7 2 1 0 Исключаем ...
8 2 1 0 И
9 5 4 3 2 1 0 Исключаем ...
10 5 4 3 2 1 0 Исключаем ...
11 5 4 3 2 1 0 Исключаем ...
12 3 2 1 0 Исключаем ...
13 3 2 1 0 Исключаем ...
14 3 2 1 0 Исключаем ...
15 2 1 0 Искл.
16 2 1 0

"Назначенные" работы (трехадресные команды) и такты, в которые они назначены, соответствуют "длинным" командам. Как видно из таблицы — диаграммы, программа изобилует пропусками тактов, NOP 'ами.

Предположим наличие средств синхронизации, аналогичное использованию битов значимости. Т.е. предположим, что регистры СОЗУ имеют биты значимости, "взводящиеся" в начале выполнения тех команд, в которых предусмотрена запись в эти регистры. Тогда считывание из этих регистров невозможно до окончания выполнения тех операций, по которым в них производится запись. Отсюда следует возможность ликвидации всех NOP 'ов в программе. В данном примере окончательный вид формируемой программы представлен в таблице 7.4.

++xxЛОГЛОГ
1 1 2
2 9 10
3 3 11
44 12
55 13
6 7 15
7 8 16

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

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

Пример оптимизированной компоновки "длинных" командных слов для ВС с синхронными ИУ

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

Рассмотрим еще один, более конкретный пример компоновки "длинного" командного слова для ВС, разрабатываемой в 1970-е годы. Проект, основанный на архитектуре "в остаточных классах", не получил должного освещения в годы "холодной войны", тем более, что авторы сами перестали настаивать на его воплощении. Но это был, по-видимому, первый в мире опыт реализации принципа "длинного" командного слова.

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

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

Предположим, что инструкции, назначенные для выполнения одновременно (в один машинный такт), выполняются назначенными для этого ИУ синхронно за одинаковое и равное для всех операций число машинных тактов t0 = 2.

Обмен выполняется за время t1 = 1.

Предположим, что в ВС для уплотнения записи программы используются элементы адресного распараллеливания, а именно:

  • командное слово не выполняется, если хоть один операнд его инструкции, представленный адресом СОЗУ, совпадает хоть с одним результатом предыдущих t0-1 командных слов;
  • внутри командного слова инструкции обладают приоритетом, убывающим слева направо.
  • Блокировка выполнения инструкции осуществляется в соответствии с адресным способом распараллеливания в том случае, если в ней в качестве операнда фигурирует адрес, являющийся в еще не выполненной инструкции более старшего приоритета адресом результата. Если выполнение второй основной инструкции задерживается, то вместе с ней задерживается выполнение и инструкции обмена. Таким образом, будем считать, что пропуск необходимого числа тактов производится автоматически.

    Пусть необходимо написать оптимальную программу счета величин

    $$f = b{}^2 /x{}^2 + a/b{}^2$$

    $$g = af - t{}^3 (d - c)$$ (7.1)

    Программа до оптимизации, написанная "в линеечку", представлена на рис. 7.1.

    (рис 7.1) Исходная последовательная программа

    В позициях R1 и R2 указываются первый и второй адреса операндов. Это адреса СОЗУ. R3 — адрес результата в СОЗУ, A — адрес считывания или записи в ОП. Использован набор инструкций, содержание которых ясно из их записи.

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

    (рис 7.2) Граф-схема алгоритма

    В графе G можно найти длину Tкр критического пути. Опыт подсказывает: практические возможности распараллеливания линейного участка программы таковы, что правомерно считать достаточным количество ИУ для выполнения оптимизированной программы за время Tкр. Значит, мы заранее можем для данного линейного участка считать заданным ограничение времени его выполнения T = Tкр. При необходимости легко предусмотреть в алгоритме динамическую коррекцию этого значения. Это позволяет использовать значения поздних сроков окончания выполнения работ и сформулировать более эффективное при данном применении решающее правило, приведенное ниже:

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

    На рис. 7.3 представлена диаграмма выполнения работ (инструкций), иллюстрирующая нахождение поздних сроков окончания их выполнения при T = Tкр = 12.

    (рис 7.3) Диаграмма выполнения работ

    На рис. 7.4 представлена расширенная матрица следования S*, где для j -й инструкции, j = 1, ..., 19, указано время tj ее выполнения, поздний срок окончания выполнения $$\tau _{2j}(12)$$, а также значение $$\theta _{j}$$ — суммарное время выполнения всех инструкций, которым данная инструкция предшествует. Эти значения отыскиваются в результате введения транзитивных связей в матрицу S, что также показано на рисунке.

    (рис 7.4) Расширенная матрица следования

    Имитируя изменение текущего времени t и определяя состояние вычислительного процесса (на рис. 7.5 отражено изменение матрицы S в процессе компоновки программы), начнем формирование оптимизированной программы с первого командного слова.

    (рис 7.5) Матрица следования после первого шага компоновки команд

  • t = 0, R = {1, 2, 3, 10, 11, 12}, $$\{ \tau _{2j\in R}(12)\} = \{ 3, 1, 1, 3, 5, 5\}$$, $$\{ \theta _{j\in R}\} = \{ 11, 15, 13, 10, 8, 8\}$$. После переупорядочения (по неубыванию значений $$\tau _{2j}(12)$$, а для равных указанных значений — по невозрастанию значений $$\{ \theta _{j\in R}\} = \{ 2, 3, 1, 10, 11, 12\}$$. В первое командное слово записываем инструкцию 2. Ее номер заносим в множество $$\alpha$$ — множество назначенных, но не выполненных инструкций; каждая инструкция в нем снабжена счетчиком времени выполнения, который уменьшается при моделировании изменения времени. Равенство счетчика нулю свидетельствует о выполнении инструкции. Т.к. в командное слово записана инструкция обмена, и в R отсутствует информация об основных инструкциях, которые можно записать в это же слово, то после перебора всех элементов R полагаем t = 1 и переходим к заполнению следующего командного слова. Исключаем из матрицы S строку и столбец, соответствующие инструкции 2, т.к. к новому моменту времени она будет выполнена.

  • t = 1, R = {1, 3, 4, 10, 11, 12}. После упорядочения по $$\tau _{2j\in R}$$ и $$\theta _{j\in R}$$ R = {3, 4, 1, 10, 11, 12}. Запишем во второе командное слово инструкцию 3. После исключения ее номера из R вновь найдем инструкцию 4, готовую к выполнению. Ее записываем в это же командное слово. Так как инструкция обмена в командное слово уже записана, а основных в R больше нет, перейдем к заполнению третьего командного слова. Положим t = 2 и исключаем из матрицы S строку и столбец, соответствующие выполненной к этому моменту времени инструкции 3 (рис. 7.5). Назначенные для выполнения, но не выполненные к данному моменту времени инструкции (отмеченные в $$\alpha$$ будем отмечать знаком *.

  • t = 2, R = {1, 5, 10, 11, 12}. После упорядочения по $$\tau _{2j\in R}$$ и $$\theta _{j \in R}$$ R = {5, 1, 10, 11, 12}. Запишем в третье командное слово инструкции 5 и 1. Положим t = 3, преобразуем матрицу следования S, исключив из нее строки и столбцы, соответствующие назначенным инструкциям.

  • t = 3, после упорядочения R = {5, 10, 11, 12}. Запишем в четвертое командное слово последовательно инструкции 10, 13. Положим t = 4, исключим из S строки и столбцы, соответствующие выполненным к данному моменту времени инструкциям 5 и 10 (рис. 7.6).

    (рис 7.6) Матрица следования после второго шага компоновки команд

  • $$t = 4, R = \{ 6, 7, 11, 12\} ,\{ \tau _{2j\in R}(12)\} = \{ 5, 5, 5,5\} , \{ \theta _{j\in R\} }\} = \{ 10, 10, 8, 8\}$$. После упорядочения R = {6, 7, 11, 12}. Запишем в пятое командное слово инструкции 6, 7, 11. Полагаем t = 5, исключаем из S строки и столбцы, соответствующие выполненным к этому моменту времени инструкциям 13 и 11.

  • t = 5, R = {12, 14}. Инструкции 12 и 14 запишем в шестое командное слово. Положим t = 6, исключаем из матрицы S строки и столбцы, соответствующие выполненным к этому моменту времени инструкциям 6, 7 и 12 (рис. 7.7).

    (рис 7.7) Матрица следования после третьего шага компоновки команд

  • t = 6, R = {8, 15}. Инструкции 8 и 15 записываем в седьмое командное слово. Т.к. инструкция обмена в ней не записана и существуют инструкции, находящиеся в процессе выполнения, продолжим компоновать седьмое командное слово, положив t = 7. Исключим из S строку и столбец, соответствующие инструкции 14 (рис. 7.8).

    (рис 7.8) Матрица следования после четвёртого шага компоновки команд

  • $$t = 7, R = \varnothing$$. Продолжим (в соответствии с приоритетом при выполнении!) попытку заполнения седьмого командного слова. Положим t = 8, исключим из S строки и столбцы, соответствующие инструкциям 8 и 15 (рис. 7.9).

    (рис 7.9) Матрица следования после пятого шага компоновки команд

  • t = 8, R = {9, 16, 17}. В седьмое командное слово записываем инструкцию обмена 9. Положим t = 9, исключим из матрицы S строку и столбец, соответствующие инструкции 9.

  • t = 9, R = {16, 17}. В восьмое командное слово запишем инструкции 16 и 17. Так как инструкция обмена не записана и $$\alpha \ne \varnothing$$, продолжим попытку заполнения восьмого командного слова. Положим t = 10. К этому моменту времени не заканчивается выполнение ранее назначенных инструкций, матрица следования сохраняет прежний вид (рис. 7.10).

    (рис 7.10) Матрица следования после шестого шага компоновки команд

    Положим t = 11. К этому моменту времени выполняются инструкции 16 и 17. Исключим из матрицы S строки и столбцы, соответствующие этим инструкциям (рис. 7.11).

    (рис 7.11) Матрица следования после седьмого шага компоновки команд

  • t = 11, R = {18}. Запишем инструкцию 18 в девятое командное слово. Полагаем t = 12. К этому моменту нет инструкций, выполнение которых закончено, а $$R = \varnothing$$. Полагаем t = 13, продолжаем попытку заполнения девятого командного слова. К этому моменту заканчивается выполнение инструкции 18. Исключим строку и столбец, соответствующие этой инструкции, из матрицы S.

  • t = 13, R = {19}. Инструкцию обмена 19 запишем в девятое командное слово. Матрица следования исчерпана, составление программы (рис. 7.12) заканчивается, через один такт t = 14 заканчивается и ее выполнение.

    (рис 7.12) Программа в окончательном виде

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

    (рис 7.13) Временная диаграмма выполнения программы

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

  • Страницы:

    Расчет нейросети

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

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

    Рассмотрим пример распараллеливания типичного фрагмента обработки нейросети в режиме распознавания. Он демонстрирует способ оптимальной реализации на процессоре, где АЛУ содержит несколько исполнительных устройств (ИУ) различной специализации, функций нейрокомпьютера. Максимальная загрузка всех устройств возможна тогда, когда в каждом линейном участке программы предусмотрена обработка не одного, а нескольких нейронов сети. Покажем это на фрагменте алгоритма имитации работы нейронов в режиме распознавания, т.е. в режиме, требующем максимальной производительности нейрокомпьютера.

    Программирование трехадресных команд

    В режиме распознавания в простейшей модели нейрона решается задача суммирования взвешенных, в соответствии с регулируемыми на этапе обучения весами {wi},i = 1, ..., n, синапсов — значений синапсических сигналов {xi} и сравнение полученной суммы с порогом h. Если сумма превышает порог, происходит возбуждение нейрона с величиной y:$$y = \left\{ \begin{array}{ll} \Delta = \sum\limits_{i=1}^n w_i x_i - h, \t{ при } \Delta > 0, \\ 0, \t{ при } \Delta \leqslant 0. \\ \end{array} \right.$$

    Для n = 3 запишем в трехадресных командах программу одновременной обработки двух нейронов. Это двукратное повторение одной и той же последовательности команд, отличающейся используемыми адресами (табл. 7.1).

    КОПA1A2A3
    1x <w11> <x11> r1
    2x <w12> <x12> r2
    3x <w13> <x13> r3
    4+ r1 r2 r4
    5+ r3 r4 r5
    6- r5 <h1> r6
    7> r6 r7
    8if... r7 r6 <y1>
    0
    9x <w21> <x21> r8
    10x <w22> <x22> r9
    11x <w23> <x23> r10
    12+ r8 r9 r11
    13+ r10 r11 r12
    14- r12 <h2> r13
    15> r13 r14
    16if... r14 r13 <y2>
    0

    Очевидно, программа совместной обработки трех нейронов будет содержать трехкратное повторение такого же участка и т.д.

    Компоновка "длинных" команд

    Выше было показано, что при решении задач параллельного программирования для полного задания информации о частичной упорядоченности работ целесообразно использовать квадратные (размер m равен числу трехадресных команд линейного участка) нуль-единичные матрицы следования S, дополненные столбцами весов — времен выполнения работ.

    Такая матрица для нашего примера представлена в таблице 7.2, где кроме весов указаны также поздние сроки $$\tau$$ начала выполнения команд (для суммы всех времен выполнения работ Т = 56 ) и объемы $$\theta$$ последующих работ. Эти значения найдены по приведенным выше алгоритмам. Если при совместном анализе двух команд ( i -й и j -й, i>j ) первый или второй адрес "нижней" команды совпадает с третьим адресом "верхней" команды, то элемент матрицы S на пересечении i -й строки и j -го столбца полагается равным единице $$\alpha _{ij} = 1$$, в противном случае он равен нулю.

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

    В приведенной матрице отражены и транзитивные связи.

    T $$\tau$$ $$\theta$$
    1 5 38 18
    2 5 38 18
    3 5 41 15
    4 1 1 3 43 13
    5 1 1 1 1 3 46 10
    6 1 1 1 1 1 3 49 7
    7 1 1 1 1 1 1 2 52 4
    8 1 1 1 1 1 1 1 2 54 2
    9     5 38 18
    10 5 38 18
    11 5 41 15
    12 1 1 3 43 13
    13 1 1 1 1 3 46 10
    14 1 1 1 1 1 3 49 7
    15 1 1 1 1 1 1 2 52 4
    16 1 1 1 1 1 1 1 2 54 2

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

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

    Такты1234567891011121314151617181920
    15 4 3 2 1 0 Исключаем строку и столбец из матрицы S
    25 4 3 2 1 0 Исключаем ...
    3 5 4 3 2 1 0 Исключаем ...
    4 3 2 1 0 Исключаем ...
    5 3 2 1 0 Исключаем ...
    6 3 2 1 0 Исключаем ...
    7 2 1 0 Исключаем ...
    8 2 1 0 И
    9 5 4 3 2 1 0 Исключаем ...
    10 5 4 3 2 1 0 Исключаем ...
    11 5 4 3 2 1 0 Исключаем ...
    12 3 2 1 0 Исключаем ...
    13 3 2 1 0 Исключаем ...
    14 3 2 1 0 Исключаем ...
    15 2 1 0 Искл.
    16 2 1 0

    "Назначенные" работы (трехадресные команды) и такты, в которые они назначены, соответствуют "длинным" командам. Как видно из таблицы — диаграммы, программа изобилует пропусками тактов, NOP 'ами.

    Предположим наличие средств синхронизации, аналогичное использованию битов значимости. Т.е. предположим, что регистры СОЗУ имеют биты значимости, "взводящиеся" в начале выполнения тех команд, в которых предусмотрена запись в эти регистры. Тогда считывание из этих регистров невозможно до окончания выполнения тех операций, по которым в них производится запись. Отсюда следует возможность ликвидации всех NOP 'ов в программе. В данном примере окончательный вид формируемой программы представлен в таблице 7.4.

    ++xxЛОГЛОГ
    1 1 2
    2 9 10
    3 3 11
    44 12
    55 13
    6 7 15
    7 8 16

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

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

    Пример оптимизированной компоновки "длинных" командных слов для ВС с синхронными ИУ

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

    Рассмотрим еще один, более конкретный пример компоновки "длинного" командного слова для ВС, разрабатываемой в 1970-е годы. Проект, основанный на архитектуре "в остаточных классах", не получил должного освещения в годы "холодной войны", тем более, что авторы сами перестали настаивать на его воплощении. Но это был, по-видимому, первый в мире опыт реализации принципа "длинного" командного слова.

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

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

    Предположим, что инструкции, назначенные для выполнения одновременно (в один машинный такт), выполняются назначенными для этого ИУ синхронно за одинаковое и равное для всех операций число машинных тактов t0 = 2.

    Обмен выполняется за время t1 = 1.

    Предположим, что в ВС для уплотнения записи программы используются элементы адресного распараллеливания, а именно:

  • командное слово не выполняется, если хоть один операнд его инструкции, представленный адресом СОЗУ, совпадает хоть с одним результатом предыдущих t0-1 командных слов;
  • внутри командного слова инструкции обладают приоритетом, убывающим слева направо.
  • Блокировка выполнения инструкции осуществляется в соответствии с адресным способом распараллеливания в том случае, если в ней в качестве операнда фигурирует адрес, являющийся в еще не выполненной инструкции более старшего приоритета адресом результата. Если выполнение второй основной инструкции задерживается, то вместе с ней задерживается выполнение и инструкции обмена. Таким образом, будем считать, что пропуск необходимого числа тактов производится автоматически.

    Пусть необходимо написать оптимальную программу счета величин

    $$f = b{}^2 /x{}^2 + a/b{}^2$$

    $$g = af - t{}^3 (d - c)$$ (7.1)

    Программа до оптимизации, написанная "в линеечку", представлена на рис. 7.1.

    (рис 7.1) Исходная последовательная программа

    В позициях R1 и R2 указываются первый и второй адреса операндов. Это адреса СОЗУ. R3 — адрес результата в СОЗУ, A — адрес считывания или записи в ОП. Использован набор инструкций, содержание которых ясно из их записи.

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

    (рис 7.2) Граф-схема алгоритма

    В графе G можно найти длину Tкр критического пути. Опыт подсказывает: практические возможности распараллеливания линейного участка программы таковы, что правомерно считать достаточным количество ИУ для выполнения оптимизированной программы за время Tкр. Значит, мы заранее можем для данного линейного участка считать заданным ограничение времени его выполнения T = Tкр. При необходимости легко предусмотреть в алгоритме динамическую коррекцию этого значения. Это позволяет использовать значения поздних сроков окончания выполнения работ и сформулировать более эффективное при данном применении решающее правило, приведенное ниже:

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

    На рис. 7.3 представлена диаграмма выполнения работ (инструкций), иллюстрирующая нахождение поздних сроков окончания их выполнения при T = Tкр = 12.

    (рис 7.3) Диаграмма выполнения работ

    На рис. 7.4 представлена расширенная матрица следования S*, где для j -й инструкции, j = 1, ..., 19, указано время tj ее выполнения, поздний срок окончания выполнения $$\tau _{2j}(12)$$, а также значение $$\theta _{j}$$ — суммарное время выполнения всех инструкций, которым данная инструкция предшествует. Эти значения отыскиваются в результате введения транзитивных связей в матрицу S, что также показано на рисунке.

    (рис 7.4) Расширенная матрица следования

    Имитируя изменение текущего времени t и определяя состояние вычислительного процесса (на рис. 7.5 отражено изменение матрицы S в процессе компоновки программы), начнем формирование оптимизированной программы с первого командного слова.

    (рис 7.5) Матрица следования после первого шага компоновки команд

  • t = 0, R = {1, 2, 3, 10, 11, 12}, $$\{ \tau _{2j\in R}(12)\} = \{ 3, 1, 1, 3, 5, 5\}$$, $$\{ \theta _{j\in R}\} = \{ 11, 15, 13, 10, 8, 8\}$$. После переупорядочения (по неубыванию значений $$\tau _{2j}(12)$$, а для равных указанных значений — по невозрастанию значений $$\{ \theta _{j\in R}\} = \{ 2, 3, 1, 10, 11, 12\}$$. В первое командное слово записываем инструкцию 2. Ее номер заносим в множество $$\alpha$$ — множество назначенных, но не выполненных инструкций; каждая инструкция в нем снабжена счетчиком времени выполнения, который уменьшается при моделировании изменения времени. Равенство счетчика нулю свидетельствует о выполнении инструкции. Т.к. в командное слово записана инструкция обмена, и в R отсутствует информация об основных инструкциях, которые можно записать в это же слово, то после перебора всех элементов R полагаем t = 1 и переходим к заполнению следующего командного слова. Исключаем из матрицы S строку и столбец, соответствующие инструкции 2, т.к. к новому моменту времени она будет выполнена.

  • t = 1, R = {1, 3, 4, 10, 11, 12}. После упорядочения по $$\tau _{2j\in R}$$ и $$\theta _{j\in R}$$ R = {3, 4, 1, 10, 11, 12}. Запишем во второе командное слово инструкцию 3. После исключения ее номера из R вновь найдем инструкцию 4, готовую к выполнению. Ее записываем в это же командное слово. Так как инструкция обмена в командное слово уже записана, а основных в R больше нет, перейдем к заполнению третьего командного слова. Положим t = 2 и исключаем из матрицы S строку и столбец, соответствующие выполненной к этому моменту времени инструкции 3 (рис. 7.5). Назначенные для выполнения, но не выполненные к данному моменту времени инструкции (отмеченные в $$\alpha$$ будем отмечать знаком *.

  • t = 2, R = {1, 5, 10, 11, 12}. После упорядочения по $$\tau _{2j\in R}$$ и $$\theta _{j \in R}$$ R = {5, 1, 10, 11, 12}. Запишем в третье командное слово инструкции 5 и 1. Положим t = 3, преобразуем матрицу следования S, исключив из нее строки и столбцы, соответствующие назначенным инструкциям.

  • t = 3, после упорядочения R = {5, 10, 11, 12}. Запишем в четвертое командное слово последовательно инструкции 10, 13. Положим t = 4, исключим из S строки и столбцы, соответствующие выполненным к данному моменту времени инструкциям 5 и 10 (рис. 7.6).

    (рис 7.6) Матрица следования после второго шага компоновки команд

  • $$t = 4, R = \{ 6, 7, 11, 12\} ,\{ \tau _{2j\in R}(12)\} = \{ 5, 5, 5,5\} , \{ \theta _{j\in R\} }\} = \{ 10, 10, 8, 8\}$$. После упорядочения R = {6, 7, 11, 12}. Запишем в пятое командное слово инструкции 6, 7, 11. Полагаем t = 5, исключаем из S строки и столбцы, соответствующие выполненным к этому моменту времени инструкциям 13 и 11.

  • t = 5, R = {12, 14}. Инструкции 12 и 14 запишем в шестое командное слово. Положим t = 6, исключаем из матрицы S строки и столбцы, соответствующие выполненным к этому моменту времени инструкциям 6, 7 и 12 (рис. 7.7).

    (рис 7.7) Матрица следования после третьего шага компоновки команд

  • t = 6, R = {8, 15}. Инструкции 8 и 15 записываем в седьмое командное слово. Т.к. инструкция обмена в ней не записана и существуют инструкции, находящиеся в процессе выполнения, продолжим компоновать седьмое командное слово, положив t = 7. Исключим из S строку и столбец, соответствующие инструкции 14 (рис. 7.8).

    (рис 7.8) Матрица следования после четвёртого шага компоновки команд

  • $$t = 7, R = \varnothing$$. Продолжим (в соответствии с приоритетом при выполнении!) попытку заполнения седьмого командного слова. Положим t = 8, исключим из S строки и столбцы, соответствующие инструкциям 8 и 15 (рис. 7.9).

    (рис 7.9) Матрица следования после пятого шага компоновки команд

  • t = 8, R = {9, 16, 17}. В седьмое командное слово записываем инструкцию обмена 9. Положим t = 9, исключим из матрицы S строку и столбец, соответствующие инструкции 9.

  • t = 9, R = {16, 17}. В восьмое командное слово запишем инструкции 16 и 17. Так как инструкция обмена не записана и $$\alpha \ne \varnothing$$, продолжим попытку заполнения восьмого командного слова. Положим t = 10. К этому моменту времени не заканчивается выполнение ранее назначенных инструкций, матрица следования сохраняет прежний вид (рис. 7.10).

    (рис 7.10) Матрица следования после шестого шага компоновки команд

    Положим t = 11. К этому моменту времени выполняются инструкции 16 и 17. Исключим из матрицы S строки и столбцы, соответствующие этим инструкциям (рис. 7.11).

    (рис 7.11) Матрица следования после седьмого шага компоновки команд

  • t = 11, R = {18}. Запишем инструкцию 18 в девятое командное слово. Полагаем t = 12. К этому моменту нет инструкций, выполнение которых закончено, а $$R = \varnothing$$. Полагаем t = 13, продолжаем попытку заполнения девятого командного слова. К этому моменту заканчивается выполнение инструкции 18. Исключим строку и столбец, соответствующие этой инструкции, из матрицы S.

  • t = 13, R = {19}. Инструкцию обмена 19 запишем в девятое командное слово. Матрица следования исчерпана, составление программы (рис. 7.12) заканчивается, через один такт t = 14 заканчивается и ее выполнение.

    (рис 7.12) Программа в окончательном виде

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

    (рис 7.13) Временная диаграмма выполнения программы

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

  • Вернуться к учебному плану