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

SPMD-технология на базе симметричной ВС

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

Архитектура

Анализ задач, требующих вмешательства супер-ЭВМ, показывает, что все такие задачи — так называемые задачи "большой размерности", которые сводятся к обработке больших массивов данных. Для их решения целесообразно применять второй способ распараллеливания. Их сложность может быть как полиномиальной, так и экспоненциальной. В сведении к обработке больших массивов данных кроется серьезное обобщение. Действительно, очевидность такого положения демонстрируется не только на традиционных задачах - векторных, матричных (обработки сигналов и изображений, картографии, геодезии и др.), конечно-разностных (во всем диапазоне сводимых к ним), моделирования поведения среды. Она проявляется на задачах, моделирующих многоканальный доступ к данным, на задачах одновременного управления множеством объектов, использования общих баз данных (в серверах), баз знаний, обработки нейросетей. Она же подтверждается на тех задачах, для которых сегодня считается трудным определение целесообразной стратегии распараллеливания. Это задачи оптимального планирования и исследования операций, по сложности известные как NP-сложные задачи, подкласс задач экспоненциальной сложности. Большая часть таких задач решается методом "ветвей и границ", т.е. перебором вариантов. Можно считать, что каждый вариант условно (да и фактически) определяет элемент некоторого динамически развиваемого массива. Значит, в распределении вариантов при решении таких задач — путь к реализации второго способа распараллеливания.

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

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

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

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

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

Из сказанного выше следует вывод: необходимо на основе симметричной ВС построить ВС, в наибольшей степени приспособленную к распределению элементов больших массивов для обработки разными процессорами по идентичным алгоритмам. Обработка должна в общем случае производиться по разным ветвям. Должна быть синхронизация обращений к общим данным. Выполнение разных ветвей одной программы делает возможным выполнение разных программ разными процессорами. Тип таких ВС получил название SPMD: "Single Program — Multiplе Data" ( SPMD-технология ).

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

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

"Идеальная" структура ВС SPMD-технологии приведена на рис.12.1. Программа находится в памяти команд (ПК), откуда сегментами считывается в буферы команд БКi процессоров Пi, i = 0, ..., N-1. БКi — активное устройство, способное считывать следующий сегмент программы на фоне выполнения предыдущего по входящей в сегмент команде.

(рис 12.1) Структура ВС

Память процессора ППi содержит область для хранения стеков вычислительного процесса, в том числе — стеков подпрограмм и вложенных циклов. В других областях этой памяти хранятся модификаторы, дескрипторы массивов и локальные величины. Через коммутатор К процессоры связаны с оперативной памятью данных (ОПД), состоящей из P модулей Sp, p = 0, ..., P-1, с независимым доступом. Модули объединены в блоки, внутри каждого из которых адресация осуществляется по принципу интерливинга. Память закрытых адресов (ПЗА) служит для синхронизации вычислений методом управления потоком данных: считывание по отмеченным в нем адресам ОПД (и, следовательно, вычислительный процесс) задерживается до выполнения записи по этим адресам. Конфликт при одновременной попытке двух и более процессоров закрыть один адрес разрешается в пользу одного процессора, а попытка повторного закрытия адреса воспринимается как попытка считывания по нему. Блок C предназначен для синхронизации Пi в необходимых случаях — для одновременного начала выполнения программы с некоторой команды.

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

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

Среди этих команд (в трехадресной интерпретации с использованием индексных регистров) мы отметим следующие.

ЗАГ — ЗАГрузка дескрипторного элемента или модификатора; адреса загружаемых дескрипторных элементов или модификаторов указываются в позициях I1, I2, I3. В позициях A1, A2, A3 могут быть указаны адреса ЛОП или ОП.

ЗАГД — ЗАГрузить Дескриптор; по адресам ( I1 ), ( I2 ), ( I3 ) в памяти каждого процессорного элемента засылаются по восемь дескрипторных элементов, хранящихся в ОП, соответственно, с адресов ( A1 ), ( A2 ), ( A3 ). Таким образом, по одной команде можно загрузить до трех дескрипторов в ЛОП каждого ПЭ. При загрузке каждого дескриптора выполняются операции (D5(k)):= (D7(k)):= (D0(k))+ i(D1(k)), k = 1, 2, 3. Эта начальная загрузка может производиться при первом выполнении основной части программы.

ВЗЯТЬД — ВЗЯТЬ Дескриптор; выбирается дескриптор Dw в составе всех восьми элементов из массива дескрипторов, которому соответствует дескриптор D. Выбираемый дескриптор определяется значением дескрипторного элемента D7 = (I1). Он заносится по адресу D* = (I2) в ЛОП. При первом выполнении команды i -м ПЭ w = i. При j -м выполнении команды этим же ПЭ w = i + Nj. При выполнении команды сначала проверяется условие принадлежности выбираемого дескриптора массиву таких дескрипторов, (D7)<= (D3)? При выполнении этого условия дескриптор Dw на данном ПЭ формируется. Выполняется операция (D7):= (D7) + (D6), что при следующем выполнении данной команды позволит выбрать дескриптор, номер которого на N превышает номер выбранного. При невыполнении условия управление передается по исполнительному третьему адресу без модификации D7. Данная команда позволяет распределять обработку записей в базах данных, базах знаний и нейросетях. Для другого применения этой команды можно указывать в позиции I1 адрес дескрипторного элемента D4, что обеспечивает последовательную выборку дескрипторов из массива дескрипторов при повторном выполнении команды в цикле. (Дескриптор занимает восемь регистров, т.е. номер дескрипторного элемента может определяться тремя младшими разрядами его адреса.)

ПРАД — ПРоверка АДреса; адреса, записанные в дескрипторных элементах в позициях I1 и I2, сравниваются соответственно с адресами, записанными в дескрипторных элементах D3 дескрипторов массивов. Команда допускает одновременно два сравнения (для двух массивов), но может быть предусмотрено лишь одно. Если ( (I1)) >(D3(1) ) ( (I2)) >(D3(2) ) (верхний индекс указывает на номер анализируемого дескриптора массива), осуществляется переход на выполнение команды, номер которой указан по третьему адресу. В противном случае выполняется следующая команда. Данная команда контролирует переадресацию или начальное назначение элемента массива за пределами массива.

ИЗМАД — ИЗМенить АДрес; выполняются операции ( D7(1)) = (I1) := (D7(1))+(D6(1)), (D7(2)) = (I2) := (D7(2))+(D6(2)). D7(1) пишется в позиции I1, D7(2) пишется в позиции I2. Выполнение операции сопровождается анализом, не превышает ли вновь найденное значение адреса значение адреса последнего элемента массива, указанного соответственно в дескрипторных элементах D3(1) и D3(2) ; если превышает, управление передается по третьему исполнительному адресу.

УЗАП — Условная ЗАПись; считывает по адресу, указанному в D7, и записывает по третьему исполнительному адресу, но лишь в том случае, если (D7) =(D3). Команда позволяет при совместной обработке массива записать единственный окончательный результат, полученный одним ПЭ. Если указанное равенство не выполняется, выполняется следующая команда.

ЗАКРА — ЗАКРыть Адрес; значение адреса, записанное в дескрипторном элементе D7, заносится в память закрытых адресов (распределенных между модулями ОП).

СИНХ — команда синхронизации. По данной команде ПЭ посылает в блок синхронизации сигнал. Обратный сигнал, по которому ПЭ приступает к выполнению следующей команды, приходит в том случае, если все ПЭ при выполнении данной команды в своих программах послали свои сигналы. Выполнение команды повторяется до получения обратного сигнала.

Среди более сложных команд, которые могут быть реализованы с помощью развитого механизма дескрипторов, следует отметить следующие команды.

ПОИСК1 — Поиск по образцу с фиксацией места совпадения. Позволяет продолжить поиск следующих совпадений.

ПОИСК2 — Поиск по образцу с восстановлением при совпадении на начало массива.

ДОПОЛМ — ДОПОЛнение Массива новым элементом, после дополнения корректируется дескриптор.

СБОРМ — СБОРка Массива; на основе дескрипторов двух массивов формируется массив-объединение со своим дескриптором.

ИСКЛ — ИСКЛючение из массива; из массива, заданного своим дескриптором по исполнительному первому адресу, исключается элемент, который равен образцу, заданному по исполнительному второму адресу. (Команда применяется, например, при исключении из списка ссылки на удаляемый элемент.)

ТАБЛ — вход в ТАБЛицу, адрес которой указан в первом исполнительном адресе команды; таблица состоит из строк соответствия вида "запрос-ответ" .

ЭТАЛОН — "запрос" задается по первому исполнительному адресу, "ответ" записывается по третьему исполнительному адресу.

ЗАПТАБ — ЗАПисать в ТАБлицу; в таблице, адрес которой указан по третьему исполнительному адресу, во всех строках, "ответы" которых совпадают с образцом, заданным по первому исполнительному адресу, сменить "ответы" на заданный по второму исполнительному адресу. (Команда применяется, например, при смене варианта связывания переменных в логическом программировании.)

СТЕГ — Сравнение ТЕГов; тег кода, заданного по первому исполнительному адресу, сравнивается с константой, заданной по второму адресу. В случае неравенства управление передается по третьему адресу.

М+ (М- — команды изменения значений индексных регистров — модификаторов; одновременно могут изменяться до трех модификаторов, адреса которых указываются в позициях I1, I2 , I3. В позициях A1, A2, A3 указываются адреса ЛОП, ОП или константы переадресации.

ЦИКЛ — команда начала цикла; по первому исполнительному адресу указывается граничное значение параметра цикла — количество повторений. Если необходимо, все данные внешнего прерываемого цикла записываются в стек циклов.

КЦ — Конец Цикла; параметр цикла изменяется на единицу, по достижении максимального значения управление передается следующей команде; при этом, если необходимо, восстанавливаются данные внешнего цикла из стека циклов. Если параметр цикла не достиг максимального значения, управление передается команде, следующей за командой ЦИКЛ.

Программирование

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

Векторная операция свертки

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

Найдем способом "пирамиды" произведение элементов массива $$\{ a_{\nu }\}$$, $$\nu = 0,\dots ,k-1$$. Пусть для наглядности N = 4. Для k = 10 схема счета приведена на рис. 12.2. Введены вершины a10,...,a17, соответствующие промежуточным результатам, и вершина a18, соответствующая результату счета. У каждой вершины, обозначающей операцию, указан номер выполняющего ее процессора. Это закрепление операций за процессорами в программе жестко не планируется, так как программа не зависит ни от числа процессоров, ни от числа элементов в массиве. Однако при организации программы порядок использования процессоров предусматривается и для известного их числа может быть предсказан.

(рис 12.2) Схема свёртки способом пирамиды

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

Сформируем в ПП i, i = 0,...,N-1, дескриптор D1 массива {a0, a2, a4,...,a2k-4}, содержащий восемь (максимальное количество) дескрипторных элементов, D1 = {D10,...,D17}. В D10 содержится адрес a0 первого элемента массива, D11 содержит шаг h = 2 переадресации (предполагаем, что элементы массива $$\{ a_{\nu }\}$$ в памяти расположены в смежных ячейках), D12 — количество k-1 элементов, D13 — адрес последнего ( a2k-4 ) элемента массива. Элемент D14 служит для организации автоматической переадресации при последовательном обращении к данному массиву. В D14 хранится адрес a0+jh для выборки элемента массива при j -м ( j = 0,1,...) обращении к нему ( j может быть параметром цикла). После выполнения обращения этот адрес увеличивается на шаг h, т.е. выполняется операция (D14) := (D14)+(D11). Следующая группа дескрипторных элементов предназначена для автоматического распределения элементов массива между процессорами. В D15 содержится адрес a0+ih, где i — номер процессора. Таким образом, каждый процессор формирует собственное значение D15, располагая адресом регистра в своей памяти, содержащего значение i, для начального обращения к "своему" элементу массива. В D16 содержится значение Nh, используемое для переадресации к следующему "своему" элементу массива с учетом числа процессоров. В D17 содержится текущее значение адреса a0+ih+jNh = (D15)+j(D16), используемое для автоматической переадресации при последовательном ( j = 0,1,...) обращении к дескриптору. При этом предполагается начальное обращение (при j = 0 ) к "своему" элементу массива и последующее изменение адреса элемента на величину Nh, хранимую в D16.

Сформируем дескриптор D2 = {D20,...,D27} для массива {ak,...,a2k-2} = {a10,...,a18}. Отличие элементов этого дескриптора от элементов дескриптора D1 определяется другими значениями адресов первого и последнего элементов массива, а также шагом h = 1.

В табл.12.1 представлена программа счета.

По команде 0 производится синхронизация системы для одновременного выполнения следующей команды. По данной команде каждый процессор посылает в блок C сигнал. Обратный сигнал, по которому процессор приступает к выполнению следующей команды, приходит в том случае, если все процессоры при выполнении данной команды послали сигнал в C. Выполнение команды СИНХ повторяется до получения сигнала от C.

kКОПI1A1I2A2I3A3
0СИНХ
1ПРАД D15 D25 007
2ЗАКРА D27
3x D17 D17 001 D27
4УЗАП D27 D23 M
5ИЗМАД D17 D27 001
6БП 002
7В

По команде 1 (ПРоверка АДреса) адрес, записанный в дескрипторном элементе D15, сравнивается с адресом, записанным в дескрипторном элементе D13, а адрес, записанный в дескрипторном элементе D25, сравнивается с адресом, записанным в D23. (Команда допускает одновременно два сравнения, но может быть предусмотрено лишь одно.) Если (D15) > (D13) или (D25) > (D23), производится переход на выполнение команды, номер которой указан по третьему адресу. В противном случае выполняется следующая команда. С помощью команды ПРАД в данном случае проверяется, принадлежат ли адреса, на которые первоначально "смотрит" процессор, множеству адресов элементов массива. В примере при N > 9 результат проверки положителен для процессоров i = 0,1,...,8. Это позволяет автоматически исключать остальные процессоры из счета; на них выполняется переход на конец программы. При N = 4 все процессоры приступают к выполнению следующей команды.

По команде 2 (ЗАКРыть Адрес) адрес, записанный в дескрипторном элементе D27, заносится в ПЗА. При первом выполнении на процессоре 0 (D27) = a10, на процессоре 3 (D27) = a13.

По команде 3 выполняется операция умножения двух элементов массива. При первом выполнении команды на i -м процессоре и при данном значении k в дескрипторном элементе D17 находится адрес a0+2i, в D27 — адрес a10+i. Так как по A2 задано смещение, то сформируется адрес a0+2i+1. Таким образом, на процессоре 0 сформируется исполнительный вид команды xa0a1a10, на процессоре 1 — xa2a3a11 ит.д. После выполнения команды и записи результатов в память адреса a10,...,a13 исключаются из ПЗА. Очевидно, что при N > [k/2] в исполнительном виде команды 3, сформированной на процессорах [k/2],...,N-1, используются ранее закрытые другими процессорами адреса. Попытка выполнения этой команды, точнее, считывание по закрытым адресам, будет циклически возобновляться до тех пор, пока процессоры, закрывшие адреса, не выполнят умножение и не зашлют по этим адресам промежуточные результаты. Так реализуется управление потоком данных.

По команде 4 (Условная ЗАПись) в случае (D27) = (D23) производится считывание по адресу, указанному в дескрипторном элементе D27, и запись по третьему адресу команды ( M — модификатор, в котором указан адрес результата произведения всех элементов массива). Напомним, что в D23 указан адрес того элемента расширенного массива, в котором при счете способом "пирамиды" образуется окончательный результат.

По команде 5 (ИЗМенение АДреса) выполняются операции (D17) := (D17)+(D16) ; (D27) := (D27)+(D26). В данном примере (D16) = 8, (D26) = 4. Выполнение каждой операции сопровождается анализом — не превосходит ли вновь найденное значение адреса последнего элемента массива, указанное соответственно в дескрипторных элементах D13 и D23. Если превосходит, управление передается на окончание выполнения программы.

Команда 6 — команда Быстрого Перехода на выполнение команды2, т.е. на повторное выполнение цикла попарного умножения элементов массива. В нашем примере следующий исполнительный вид команды 3 на процессоре 0xa8a9a14, на процессоре 1xa10a11a15 ит.д.

Выход за пределы массивов при повторном выполнении команды 5 приведет к окончанию счета на процессорах 1, 2 и 3. Процессор 0 по команде 4 произведет запись окончательного результата по адресу, указанному в модификаторе 0. Третье выполнение команды 5 на процессоре 0 приведет к окончанию счета и на нем.

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

Распараллеливание по опорному одномерному массиву

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

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

Пусть заданы R комплексных чисел Xr = Xr(1) + iXr(2), r = 0,...,R-1. Они преобразуются в R комплексных чисел$$\begin{gathered} A_r = \sum\limits_{k = 0}^{R - 1} {X_k \exp \left( { - \frac{{2\pi irk}} {R}} \right) = A_r^{(1)} + iA_r^{(2)} } = \\ = \sum\limits_{k = 0}^{R - 1} X_k^{(1)} \cos \left( { - \frac{{2\pi rk}} {R}} \right) + i\sum\limits_{k = 0}^{R - 1} {X_k^{(1)} \sin } \left( { - \frac{{2\pi rk}} {R}} \right), \end{gathered}$$ где Ar(1) и Ar(2)коэффициенты Фурье.

Заданные коэффициенты и коэффициенты Фурье находятся в ОПД по адресам x и a:

x) X0(1), X0(2), X1(1), X1(2),..., XR-1(1), XR-1(2) ;

a) A0(1), A0(2), A1(1), A1(2),..., AR-1(1), AR-1(2).

Организуем параллельный процесс на основе динамического распределения рассчитываемых коэффициентов Фурье между процессорами. В этом случае будем считать распределяемый массив {Aj(1), Aj(2)}, j = 0,...,R-1, состоящий из пар коэффициентов Фурье, опорным.

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

DX = {DX0, DX1, DX2, DX3, DX4} = {x, 2, R, x+2R-2, x},

DA = {DA0, DA1, DA2, DA3, DA4, DA5, DA6, DA7} =

= {a, 2, R, a+2R-2, a, a+2i, 2N, a+2i}

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

В табл. 12.2 представлена программа счета. Пропущены некоторые команды начального формирования дескрипторных элементов, в том числе команды, соответствующие операции (DA5) := (DA0)+i(DA1).

kКОПI1A1I2A2I3A3
0ЗАГ <r> <i> DA7 DA5
1ПРАД DA7 020
2x <r> -2 $$\pi$$ /R $$\alpha$$
3ЗАГ <k> l1 l2
4ЗАГ DX4 DX0
5ЦИКЛ DA2
6x <k> $$\alpha$$ $$\beta$$
7COS
8x DX4
9+ l1 l1
10М+ $$\beta$$
11x DX4 0001
12+ l2 l2
13М+ <k> 0001 DX4 DX1
14КЦ
15ЗАП l1 DA7
16ЗАП l2 DA7 0001
17ИЗМАД DA7 020
18М+ <r> <N>
19БП 002
20В

Команды 0-4 встречались ранее. Предполагаем, что для формирования значений r, k, l1, l2 в ПП i достаточно пользоваться операцией загрузки, применяемой для формирования модификаторов и дескрипторных элементов. При этом первоначально r присваивается значение номера процессора. При переводе в вещественные они сохраняют фактические значения.

Процессор i приступает к счету Ai, если при выполнении команды1 ( DA7 ) не превосходит ( DA3 ).

По команде 5 (ЦИКЛ) формируется цикл на ( DA2) = R повторений.

По командам 6-12 формируются очередные слагаемые накапливаемых в l1 и l2 значений Ar(1) и Ar(2). Предполагаем, что если в команде не указан адрес операнда, то операндом является содержимое сумматора.

По команде 13 увеличивается значение k и значение дескрипторного элемента DX4 для перехода к счету следующих слагаемых, образующих Ar(1) и Ar(2).

По команде 14 Конец Цикла изменяется значение счетчика цикла, и если оно не превышает значение, указанное в команде ЦИКЛ, управление передается на повторное выполнение рабочей части цикла.

По командам 15 и 16 найденные значения Ar(1) и Ar(2) записываются в память.

По команде 17 выполняется операция (DA7) := (DA7)+(DA6). Если после этого (DA7) > (DA3), управление передается на выход из процедуры. В противном случае, по команде 18 значение r увеличивается на N в соответствии с распределением рассчитываемых значений Ar между процессорами.

По команде 19 осуществляется переход на счет нового значения Ar.

Распараллеливание по двумерному опорному массиву

Построим программу умножения матриц C=A x B размерности k, где каждый элемент матрицы-результата C находится:$$C_{\mu \nu}=\sum_{\rho=0}^{k-1}a_{\mu\rho}b_{\rho\nu},$$ где $$\mu$$ — номер строки матрицы C ; $$\nu$$ — номер столбца.

Представим множество элементов C одномерным массивом, обусловленным расположением подряд строк этой матрицы:$$C = \{c_{00},\ldots,c_{0,k-1},c_{10},\ldots,c_{k-1,k-1}\} = \{c_0^*,\ldots,c_{k^2-1}^*\}.$$

Пусть каждый процессор П i, i = 0,...,N-1, считает элементы c{i+jN}* этого массива, j = 0,1,....

Для построения подпрограммы нахождения скалярного произведения строки A и столбца $$B\{ a_{\rho }\} \times\{ b_{\rho }\}$$, $$\rho =0,\dots ,k-1$$, сформируем дескрипторы с дескрипторными элементами, необходимыми для организации счета только одним процессором:

D1 = {D10, D11, D12, D13, D14} = {a0, 1, k, a0+k-1, a0},

$$D_{2} = \{ D_{20}, D_{21}, D_{22}, D_{23}, D_{24}\} = \{ b_{0}, k, \infty , \infty , b_{0}\}$$.

Указаны начальные значения D{14} и D{24}, а неиспользуемые значения D{22} и D{23} полагаются заведомо большими.

Так как мы условились распределять считаемые элементы массива C между процессорами, то сформируем на каждом процессоре дескриптор подмассива Ci закрепленных за ним элементов:

$$D_{0} = \{ D_{C0}, D_{C1}, D_{C2}, D_{C3}, D_{C4}\} = \{ c_{00}+i, N, \infty , c_{00}+k^{2}-1, c_{00}+i\}$$

(указано начальное значение DC4, значение DC2 не используется).

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

kКОПI1A1I2A2I3A3
0ЗАГ $$\alpha$$ D14 D10 D24 D20
1ЦИКЛ D12
2x D1 D2
3+ $$\alpha$$ $$\alpha$$
4КЦ
5ЗАП $$\alpha$$ D3
6В

Использование в командах 2 и 5 адресов дескрипторов, которые, в отличие от адресов модификаторов и дескрипторных элементов, обладают специальным признаком, приводит к автоматической переадресации, производимой при выполнении этих же команд в цикле. Так, при выполнении команды 2, если (D14) не превосходит (D13), а (D24) не превосходит (D23), формируются исполнительные адреса A*1 = A1+(D14), A*2 = A2+(D24), после чего выполняются операции (D14) := (D14)+(D11) ; (D24) := (D24)+(D21). Это обусловило необходимость восстановления значений D14 и D24 по команде 0. Аналогично, при выполнении команды 5 готовится запись при следующем обращении к подпрограмме, (D34) := (D34)+N.

Пусть матрице A соответствует дескриптор массива первых элементов ее строк, то есть дескриптор первого столбца

DA = {DA0, DA1, DA2, DA3, DA4} = {a00, k, k, a00+(k-1)k, a00}

(указано начальное значение D{A4} ). Матрица B представлена дескриптором массива первых элементов ее столбцов, то есть дескриптором первой строки

DB = {DB0,...,DB7} = {b00, 1, k, b00+k-1, b00, b00+i, N, b00+i}

(указаны начальные значения DB4 и DB7 ). Программа умножения матриц (пропущены команды формирования и восстановления дескрипторов) представлена в табл. 12.4.

kКОПI1A1I2A2I3A3
10ПРАД DB7 017
11ПРАД DA7 020
12ЗАГ D10 DA4 D13 DA4 D20 DB7
13М+ D13 <k-1>
14БПВ1 000
15ИЗМАД DB7 017
16БП 012
17М- DB7 DB2
18М+ DA4 DA1
19БП 010
20В

По команде 10, выполняющейся первый раз при (DB7) = b00+i, адрес, записанный в DB7, сравнивается с адресом последнего элемента массива, записанным в DB3. Если адрес указывает на принадлежность элемента массиву, выполняется следующая команда. В противном случае управление передается на выполнение команды 17.

По команде 11 производится аналогичная проверка принадлежности элемента используемой строки матрицы A, адрес которого указан в DA4, массиву первых элементов ее строк. Если (DA4) > (DA3), управление передается на выполнение команды 20 — выход из подпрограммы.

По командам 12—13 формируются дескрипторные элементы дескрипторов D1 и D2 для скалярного умножения очередной строки матрицы A на очередной столбец матрицы B — для получения очередного элемента матрицы C.

По команде 14 производится обращение с возвратом в рамках одной задачи (без использования ОС) к процедуре счета скалярного произведения (см. табл. 12.3).

По команде 15 производится изменение адреса начального элемента столбца — переход к следующему столбцу с учетом предполагаемого закрепления элементов матрицы C за процессорами, а именно, производится операция (DB7) := (DB7)+(DB6), где (DB6) = N. Если после изменения адреса новое его значение превышает максимальное, записанное в DB3, осуществляется переход на выполнение команды 17. В~противном случае по команде 16 управление передается на выполнение команды 12 — на подготовку счета и счет очередного элемента C.

Команды 17 и 18 выполняются в случае, если измененный на значение N адрес (DB7) первого элемента столбца B превышает значение (DB3) = b00+k-1. Чтобы получить "координаты" того элемента C, к счету которого необходимо перейти, т.е. чтобы получить адреса первого элемента столбца и первого элемента строки, на пересечении которых он находится, необходимо выполнить следующие действия: последовательно вычитать шаг (DB2), т.е. значение k, из вновь полученного адреса столбца B и прибавлять шаг ( DA1 ), т.е. это же значение k, к ранее использованному адресу первого элемента строки A (первоначально — к значению a00 ) до тех пор, пока значение ( DB7 ) не станет меньше или равно значению ( DB3 ). По данным командам изменяются значения ( DB7 ) и ( DA4 ). Затем по команде 19 управление передается на выполнение команды 10, по которой в случае недостаточности коррекции дескрипторного элемента DB7 управление вновь передается на выполнение команды 17. Если коррекция элемента DB7 произведена успешно, по команде 11 может быть выяснено, что скорректированное значение ( DA4 ) превосходит значение ( DA3 ). Это означает, что следующий элемент матрицы C, к счету которого пытается приступить процессор, принадлежит несуществующей строке, то есть процессор закончил выполнение своей доли работы. По команде 20 производится выход из подпрограммы.

Страницы:

Архитектура

Анализ задач, требующих вмешательства супер-ЭВМ, показывает, что все такие задачи — так называемые задачи "большой размерности", которые сводятся к обработке больших массивов данных. Для их решения целесообразно применять второй способ распараллеливания. Их сложность может быть как полиномиальной, так и экспоненциальной. В сведении к обработке больших массивов данных кроется серьезное обобщение. Действительно, очевидность такого положения демонстрируется не только на традиционных задачах - векторных, матричных (обработки сигналов и изображений, картографии, геодезии и др.), конечно-разностных (во всем диапазоне сводимых к ним), моделирования поведения среды. Она проявляется на задачах, моделирующих многоканальный доступ к данным, на задачах одновременного управления множеством объектов, использования общих баз данных (в серверах), баз знаний, обработки нейросетей. Она же подтверждается на тех задачах, для которых сегодня считается трудным определение целесообразной стратегии распараллеливания. Это задачи оптимального планирования и исследования операций, по сложности известные как NP-сложные задачи, подкласс задач экспоненциальной сложности. Большая часть таких задач решается методом "ветвей и границ", т.е. перебором вариантов. Можно считать, что каждый вариант условно (да и фактически) определяет элемент некоторого динамически развиваемого массива. Значит, в распределении вариантов при решении таких задач — путь к реализации второго способа распараллеливания.

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

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

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

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

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

Из сказанного выше следует вывод: необходимо на основе симметричной ВС построить ВС, в наибольшей степени приспособленную к распределению элементов больших массивов для обработки разными процессорами по идентичным алгоритмам. Обработка должна в общем случае производиться по разным ветвям. Должна быть синхронизация обращений к общим данным. Выполнение разных ветвей одной программы делает возможным выполнение разных программ разными процессорами. Тип таких ВС получил название SPMD: "Single Program — Multiplе Data" ( SPMD-технология ).

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

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

"Идеальная" структура ВС SPMD-технологии приведена на рис.12.1. Программа находится в памяти команд (ПК), откуда сегментами считывается в буферы команд БКi процессоров Пi, i = 0, ..., N-1. БКi — активное устройство, способное считывать следующий сегмент программы на фоне выполнения предыдущего по входящей в сегмент команде.

(рис 12.1) Структура ВС

Память процессора ППi содержит область для хранения стеков вычислительного процесса, в том числе — стеков подпрограмм и вложенных циклов. В других областях этой памяти хранятся модификаторы, дескрипторы массивов и локальные величины. Через коммутатор К процессоры связаны с оперативной памятью данных (ОПД), состоящей из P модулей Sp, p = 0, ..., P-1, с независимым доступом. Модули объединены в блоки, внутри каждого из которых адресация осуществляется по принципу интерливинга. Память закрытых адресов (ПЗА) служит для синхронизации вычислений методом управления потоком данных: считывание по отмеченным в нем адресам ОПД (и, следовательно, вычислительный процесс) задерживается до выполнения записи по этим адресам. Конфликт при одновременной попытке двух и более процессоров закрыть один адрес разрешается в пользу одного процессора, а попытка повторного закрытия адреса воспринимается как попытка считывания по нему. Блок C предназначен для синхронизации Пi в необходимых случаях — для одновременного начала выполнения программы с некоторой команды.

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

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

Среди этих команд (в трехадресной интерпретации с использованием индексных регистров) мы отметим следующие.

ЗАГ — ЗАГрузка дескрипторного элемента или модификатора; адреса загружаемых дескрипторных элементов или модификаторов указываются в позициях I1, I2, I3. В позициях A1, A2, A3 могут быть указаны адреса ЛОП или ОП.

ЗАГД — ЗАГрузить Дескриптор; по адресам ( I1 ), ( I2 ), ( I3 ) в памяти каждого процессорного элемента засылаются по восемь дескрипторных элементов, хранящихся в ОП, соответственно, с адресов ( A1 ), ( A2 ), ( A3 ). Таким образом, по одной команде можно загрузить до трех дескрипторов в ЛОП каждого ПЭ. При загрузке каждого дескриптора выполняются операции (D5(k)):= (D7(k)):= (D0(k))+ i(D1(k)), k = 1, 2, 3. Эта начальная загрузка может производиться при первом выполнении основной части программы.

ВЗЯТЬД — ВЗЯТЬ Дескриптор; выбирается дескриптор Dw в составе всех восьми элементов из массива дескрипторов, которому соответствует дескриптор D. Выбираемый дескриптор определяется значением дескрипторного элемента D7 = (I1). Он заносится по адресу D* = (I2) в ЛОП. При первом выполнении команды i -м ПЭ w = i. При j -м выполнении команды этим же ПЭ w = i + Nj. При выполнении команды сначала проверяется условие принадлежности выбираемого дескриптора массиву таких дескрипторов, (D7)<= (D3)? При выполнении этого условия дескриптор Dw на данном ПЭ формируется. Выполняется операция (D7):= (D7) + (D6), что при следующем выполнении данной команды позволит выбрать дескриптор, номер которого на N превышает номер выбранного. При невыполнении условия управление передается по исполнительному третьему адресу без модификации D7. Данная команда позволяет распределять обработку записей в базах данных, базах знаний и нейросетях. Для другого применения этой команды можно указывать в позиции I1 адрес дескрипторного элемента D4, что обеспечивает последовательную выборку дескрипторов из массива дескрипторов при повторном выполнении команды в цикле. (Дескриптор занимает восемь регистров, т.е. номер дескрипторного элемента может определяться тремя младшими разрядами его адреса.)

ПРАД — ПРоверка АДреса; адреса, записанные в дескрипторных элементах в позициях I1 и I2, сравниваются соответственно с адресами, записанными в дескрипторных элементах D3 дескрипторов массивов. Команда допускает одновременно два сравнения (для двух массивов), но может быть предусмотрено лишь одно. Если ( (I1)) >(D3(1) ) ( (I2)) >(D3(2) ) (верхний индекс указывает на номер анализируемого дескриптора массива), осуществляется переход на выполнение команды, номер которой указан по третьему адресу. В противном случае выполняется следующая команда. Данная команда контролирует переадресацию или начальное назначение элемента массива за пределами массива.

ИЗМАД — ИЗМенить АДрес; выполняются операции ( D7(1)) = (I1) := (D7(1))+(D6(1)), (D7(2)) = (I2) := (D7(2))+(D6(2)). D7(1) пишется в позиции I1, D7(2) пишется в позиции I2. Выполнение операции сопровождается анализом, не превышает ли вновь найденное значение адреса значение адреса последнего элемента массива, указанного соответственно в дескрипторных элементах D3(1) и D3(2) ; если превышает, управление передается по третьему исполнительному адресу.

УЗАП — Условная ЗАПись; считывает по адресу, указанному в D7, и записывает по третьему исполнительному адресу, но лишь в том случае, если (D7) =(D3). Команда позволяет при совместной обработке массива записать единственный окончательный результат, полученный одним ПЭ. Если указанное равенство не выполняется, выполняется следующая команда.

ЗАКРА — ЗАКРыть Адрес; значение адреса, записанное в дескрипторном элементе D7, заносится в память закрытых адресов (распределенных между модулями ОП).

СИНХ — команда синхронизации. По данной команде ПЭ посылает в блок синхронизации сигнал. Обратный сигнал, по которому ПЭ приступает к выполнению следующей команды, приходит в том случае, если все ПЭ при выполнении данной команды в своих программах послали свои сигналы. Выполнение команды повторяется до получения обратного сигнала.

Среди более сложных команд, которые могут быть реализованы с помощью развитого механизма дескрипторов, следует отметить следующие команды.

ПОИСК1 — Поиск по образцу с фиксацией места совпадения. Позволяет продолжить поиск следующих совпадений.

ПОИСК2 — Поиск по образцу с восстановлением при совпадении на начало массива.

ДОПОЛМ — ДОПОЛнение Массива новым элементом, после дополнения корректируется дескриптор.

СБОРМ — СБОРка Массива; на основе дескрипторов двух массивов формируется массив-объединение со своим дескриптором.

ИСКЛ — ИСКЛючение из массива; из массива, заданного своим дескриптором по исполнительному первому адресу, исключается элемент, который равен образцу, заданному по исполнительному второму адресу. (Команда применяется, например, при исключении из списка ссылки на удаляемый элемент.)

ТАБЛ — вход в ТАБЛицу, адрес которой указан в первом исполнительном адресе команды; таблица состоит из строк соответствия вида "запрос-ответ" .

ЭТАЛОН — "запрос" задается по первому исполнительному адресу, "ответ" записывается по третьему исполнительному адресу.

ЗАПТАБ — ЗАПисать в ТАБлицу; в таблице, адрес которой указан по третьему исполнительному адресу, во всех строках, "ответы" которых совпадают с образцом, заданным по первому исполнительному адресу, сменить "ответы" на заданный по второму исполнительному адресу. (Команда применяется, например, при смене варианта связывания переменных в логическом программировании.)

СТЕГ — Сравнение ТЕГов; тег кода, заданного по первому исполнительному адресу, сравнивается с константой, заданной по второму адресу. В случае неравенства управление передается по третьему адресу.

М+ (М- — команды изменения значений индексных регистров — модификаторов; одновременно могут изменяться до трех модификаторов, адреса которых указываются в позициях I1, I2 , I3. В позициях A1, A2, A3 указываются адреса ЛОП, ОП или константы переадресации.

ЦИКЛ — команда начала цикла; по первому исполнительному адресу указывается граничное значение параметра цикла — количество повторений. Если необходимо, все данные внешнего прерываемого цикла записываются в стек циклов.

КЦ — Конец Цикла; параметр цикла изменяется на единицу, по достижении максимального значения управление передается следующей команде; при этом, если необходимо, восстанавливаются данные внешнего цикла из стека циклов. Если параметр цикла не достиг максимального значения, управление передается команде, следующей за командой ЦИКЛ.

Программирование

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

Векторная операция свертки

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

Найдем способом "пирамиды" произведение элементов массива $$\{ a_{\nu }\}$$, $$\nu = 0,\dots ,k-1$$. Пусть для наглядности N = 4. Для k = 10 схема счета приведена на рис. 12.2. Введены вершины a10,...,a17, соответствующие промежуточным результатам, и вершина a18, соответствующая результату счета. У каждой вершины, обозначающей операцию, указан номер выполняющего ее процессора. Это закрепление операций за процессорами в программе жестко не планируется, так как программа не зависит ни от числа процессоров, ни от числа элементов в массиве. Однако при организации программы порядок использования процессоров предусматривается и для известного их числа может быть предсказан.

(рис 12.2) Схема свёртки способом пирамиды

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

Сформируем в ПП i, i = 0,...,N-1, дескриптор D1 массива {a0, a2, a4,...,a2k-4}, содержащий восемь (максимальное количество) дескрипторных элементов, D1 = {D10,...,D17}. В D10 содержится адрес a0 первого элемента массива, D11 содержит шаг h = 2 переадресации (предполагаем, что элементы массива $$\{ a_{\nu }\}$$ в памяти расположены в смежных ячейках), D12 — количество k-1 элементов, D13 — адрес последнего ( a2k-4 ) элемента массива. Элемент D14 служит для организации автоматической переадресации при последовательном обращении к данному массиву. В D14 хранится адрес a0+jh для выборки элемента массива при j -м ( j = 0,1,...) обращении к нему ( j может быть параметром цикла). После выполнения обращения этот адрес увеличивается на шаг h, т.е. выполняется операция (D14) := (D14)+(D11). Следующая группа дескрипторных элементов предназначена для автоматического распределения элементов массива между процессорами. В D15 содержится адрес a0+ih, где i — номер процессора. Таким образом, каждый процессор формирует собственное значение D15, располагая адресом регистра в своей памяти, содержащего значение i, для начального обращения к "своему" элементу массива. В D16 содержится значение Nh, используемое для переадресации к следующему "своему" элементу массива с учетом числа процессоров. В D17 содержится текущее значение адреса a0+ih+jNh = (D15)+j(D16), используемое для автоматической переадресации при последовательном ( j = 0,1,...) обращении к дескриптору. При этом предполагается начальное обращение (при j = 0 ) к "своему" элементу массива и последующее изменение адреса элемента на величину Nh, хранимую в D16.

Сформируем дескриптор D2 = {D20,...,D27} для массива {ak,...,a2k-2} = {a10,...,a18}. Отличие элементов этого дескриптора от элементов дескриптора D1 определяется другими значениями адресов первого и последнего элементов массива, а также шагом h = 1.

В табл.12.1 представлена программа счета.

По команде 0 производится синхронизация системы для одновременного выполнения следующей команды. По данной команде каждый процессор посылает в блок C сигнал. Обратный сигнал, по которому процессор приступает к выполнению следующей команды, приходит в том случае, если все процессоры при выполнении данной команды послали сигнал в C. Выполнение команды СИНХ повторяется до получения сигнала от C.

kКОПI1A1I2A2I3A3
0СИНХ
1ПРАД D15 D25 007
2ЗАКРА D27
3x D17 D17 001 D27
4УЗАП D27 D23 M
5ИЗМАД D17 D27 001
6БП 002
7В

По команде 1 (ПРоверка АДреса) адрес, записанный в дескрипторном элементе D15, сравнивается с адресом, записанным в дескрипторном элементе D13, а адрес, записанный в дескрипторном элементе D25, сравнивается с адресом, записанным в D23. (Команда допускает одновременно два сравнения, но может быть предусмотрено лишь одно.) Если (D15) > (D13) или (D25) > (D23), производится переход на выполнение команды, номер которой указан по третьему адресу. В противном случае выполняется следующая команда. С помощью команды ПРАД в данном случае проверяется, принадлежат ли адреса, на которые первоначально "смотрит" процессор, множеству адресов элементов массива. В примере при N > 9 результат проверки положителен для процессоров i = 0,1,...,8. Это позволяет автоматически исключать остальные процессоры из счета; на них выполняется переход на конец программы. При N = 4 все процессоры приступают к выполнению следующей команды.

По команде 2 (ЗАКРыть Адрес) адрес, записанный в дескрипторном элементе D27, заносится в ПЗА. При первом выполнении на процессоре 0 (D27) = a10, на процессоре 3 (D27) = a13.

По команде 3 выполняется операция умножения двух элементов массива. При первом выполнении команды на i -м процессоре и при данном значении k в дескрипторном элементе D17 находится адрес a0+2i, в D27 — адрес a10+i. Так как по A2 задано смещение, то сформируется адрес a0+2i+1. Таким образом, на процессоре 0 сформируется исполнительный вид команды xa0a1a10, на процессоре 1 — xa2a3a11 ит.д. После выполнения команды и записи результатов в память адреса a10,...,a13 исключаются из ПЗА. Очевидно, что при N > [k/2] в исполнительном виде команды 3, сформированной на процессорах [k/2],...,N-1, используются ранее закрытые другими процессорами адреса. Попытка выполнения этой команды, точнее, считывание по закрытым адресам, будет циклически возобновляться до тех пор, пока процессоры, закрывшие адреса, не выполнят умножение и не зашлют по этим адресам промежуточные результаты. Так реализуется управление потоком данных.

По команде 4 (Условная ЗАПись) в случае (D27) = (D23) производится считывание по адресу, указанному в дескрипторном элементе D27, и запись по третьему адресу команды ( M — модификатор, в котором указан адрес результата произведения всех элементов массива). Напомним, что в D23 указан адрес того элемента расширенного массива, в котором при счете способом "пирамиды" образуется окончательный результат.

По команде 5 (ИЗМенение АДреса) выполняются операции (D17) := (D17)+(D16) ; (D27) := (D27)+(D26). В данном примере (D16) = 8, (D26) = 4. Выполнение каждой операции сопровождается анализом — не превосходит ли вновь найденное значение адреса последнего элемента массива, указанное соответственно в дескрипторных элементах D13 и D23. Если превосходит, управление передается на окончание выполнения программы.

Команда 6 — команда Быстрого Перехода на выполнение команды2, т.е. на повторное выполнение цикла попарного умножения элементов массива. В нашем примере следующий исполнительный вид команды 3 на процессоре 0xa8a9a14, на процессоре 1xa10a11a15 ит.д.

Выход за пределы массивов при повторном выполнении команды 5 приведет к окончанию счета на процессорах 1, 2 и 3. Процессор 0 по команде 4 произведет запись окончательного результата по адресу, указанному в модификаторе 0. Третье выполнение команды 5 на процессоре 0 приведет к окончанию счета и на нем.

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

Распараллеливание по опорному одномерному массиву

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

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

Пусть заданы R комплексных чисел Xr = Xr(1) + iXr(2), r = 0,...,R-1. Они преобразуются в R комплексных чисел$$\begin{gathered} A_r = \sum\limits_{k = 0}^{R - 1} {X_k \exp \left( { - \frac{{2\pi irk}} {R}} \right) = A_r^{(1)} + iA_r^{(2)} } = \\ = \sum\limits_{k = 0}^{R - 1} X_k^{(1)} \cos \left( { - \frac{{2\pi rk}} {R}} \right) + i\sum\limits_{k = 0}^{R - 1} {X_k^{(1)} \sin } \left( { - \frac{{2\pi rk}} {R}} \right), \end{gathered}$$ где Ar(1) и Ar(2)коэффициенты Фурье.

Заданные коэффициенты и коэффициенты Фурье находятся в ОПД по адресам x и a:

x) X0(1), X0(2), X1(1), X1(2),..., XR-1(1), XR-1(2) ;

a) A0(1), A0(2), A1(1), A1(2),..., AR-1(1), AR-1(2).

Организуем параллельный процесс на основе динамического распределения рассчитываемых коэффициентов Фурье между процессорами. В этом случае будем считать распределяемый массив {Aj(1), Aj(2)}, j = 0,...,R-1, состоящий из пар коэффициентов Фурье, опорным.

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

DX = {DX0, DX1, DX2, DX3, DX4} = {x, 2, R, x+2R-2, x},

DA = {DA0, DA1, DA2, DA3, DA4, DA5, DA6, DA7} =

= {a, 2, R, a+2R-2, a, a+2i, 2N, a+2i}

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

В табл. 12.2 представлена программа счета. Пропущены некоторые команды начального формирования дескрипторных элементов, в том числе команды, соответствующие операции (DA5) := (DA0)+i(DA1).

kКОПI1A1I2A2I3A3
0ЗАГ <r> <i> DA7 DA5
1ПРАД DA7 020
2x <r> -2 $$\pi$$ /R $$\alpha$$
3ЗАГ <k> l1 l2
4ЗАГ DX4 DX0
5ЦИКЛ DA2
6x <k> $$\alpha$$ $$\beta$$
7COS
8x DX4
9+ l1 l1
10М+ $$\beta$$
11x DX4 0001
12+ l2 l2
13М+ <k> 0001 DX4 DX1
14КЦ
15ЗАП l1 DA7
16ЗАП l2 DA7 0001
17ИЗМАД DA7 020
18М+ <r> <N>
19БП 002
20В

Команды 0-4 встречались ранее. Предполагаем, что для формирования значений r, k, l1, l2 в ПП i достаточно пользоваться операцией загрузки, применяемой для формирования модификаторов и дескрипторных элементов. При этом первоначально r присваивается значение номера процессора. При переводе в вещественные они сохраняют фактические значения.

Процессор i приступает к счету Ai, если при выполнении команды1 ( DA7 ) не превосходит ( DA3 ).

По команде 5 (ЦИКЛ) формируется цикл на ( DA2) = R повторений.

По командам 6-12 формируются очередные слагаемые накапливаемых в l1 и l2 значений Ar(1) и Ar(2). Предполагаем, что если в команде не указан адрес операнда, то операндом является содержимое сумматора.

По команде 13 увеличивается значение k и значение дескрипторного элемента DX4 для перехода к счету следующих слагаемых, образующих Ar(1) и Ar(2).

По команде 14 Конец Цикла изменяется значение счетчика цикла, и если оно не превышает значение, указанное в команде ЦИКЛ, управление передается на повторное выполнение рабочей части цикла.

По командам 15 и 16 найденные значения Ar(1) и Ar(2) записываются в память.

По команде 17 выполняется операция (DA7) := (DA7)+(DA6). Если после этого (DA7) > (DA3), управление передается на выход из процедуры. В противном случае, по команде 18 значение r увеличивается на N в соответствии с распределением рассчитываемых значений Ar между процессорами.

По команде 19 осуществляется переход на счет нового значения Ar.

Распараллеливание по двумерному опорному массиву

Построим программу умножения матриц C=A x B размерности k, где каждый элемент матрицы-результата C находится:$$C_{\mu \nu}=\sum_{\rho=0}^{k-1}a_{\mu\rho}b_{\rho\nu},$$ где $$\mu$$ — номер строки матрицы C ; $$\nu$$ — номер столбца.

Представим множество элементов C одномерным массивом, обусловленным расположением подряд строк этой матрицы:$$C = \{c_{00},\ldots,c_{0,k-1},c_{10},\ldots,c_{k-1,k-1}\} = \{c_0^*,\ldots,c_{k^2-1}^*\}.$$

Пусть каждый процессор П i, i = 0,...,N-1, считает элементы c{i+jN}* этого массива, j = 0,1,....

Для построения подпрограммы нахождения скалярного произведения строки A и столбца $$B\{ a_{\rho }\} \times\{ b_{\rho }\}$$, $$\rho =0,\dots ,k-1$$, сформируем дескрипторы с дескрипторными элементами, необходимыми для организации счета только одним процессором:

D1 = {D10, D11, D12, D13, D14} = {a0, 1, k, a0+k-1, a0},

$$D_{2} = \{ D_{20}, D_{21}, D_{22}, D_{23}, D_{24}\} = \{ b_{0}, k, \infty , \infty , b_{0}\}$$.

Указаны начальные значения D{14} и D{24}, а неиспользуемые значения D{22} и D{23} полагаются заведомо большими.

Так как мы условились распределять считаемые элементы массива C между процессорами, то сформируем на каждом процессоре дескриптор подмассива Ci закрепленных за ним элементов:

$$D_{0} = \{ D_{C0}, D_{C1}, D_{C2}, D_{C3}, D_{C4}\} = \{ c_{00}+i, N, \infty , c_{00}+k^{2}-1, c_{00}+i\}$$

(указано начальное значение DC4, значение DC2 не используется).

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

kКОПI1A1I2A2I3A3
0ЗАГ $$\alpha$$ D14 D10 D24 D20
1ЦИКЛ D12
2x D1 D2
3+ $$\alpha$$ $$\alpha$$
4КЦ
5ЗАП $$\alpha$$ D3
6В

Использование в командах 2 и 5 адресов дескрипторов, которые, в отличие от адресов модификаторов и дескрипторных элементов, обладают специальным признаком, приводит к автоматической переадресации, производимой при выполнении этих же команд в цикле. Так, при выполнении команды 2, если (D14) не превосходит (D13), а (D24) не превосходит (D23), формируются исполнительные адреса A*1 = A1+(D14), A*2 = A2+(D24), после чего выполняются операции (D14) := (D14)+(D11) ; (D24) := (D24)+(D21). Это обусловило необходимость восстановления значений D14 и D24 по команде 0. Аналогично, при выполнении команды 5 готовится запись при следующем обращении к подпрограмме, (D34) := (D34)+N.

Пусть матрице A соответствует дескриптор массива первых элементов ее строк, то есть дескриптор первого столбца

DA = {DA0, DA1, DA2, DA3, DA4} = {a00, k, k, a00+(k-1)k, a00}

(указано начальное значение D{A4} ). Матрица B представлена дескриптором массива первых элементов ее столбцов, то есть дескриптором первой строки

DB = {DB0,...,DB7} = {b00, 1, k, b00+k-1, b00, b00+i, N, b00+i}

(указаны начальные значения DB4 и DB7 ). Программа умножения матриц (пропущены команды формирования и восстановления дескрипторов) представлена в табл. 12.4.

kКОПI1A1I2A2I3A3
10ПРАД DB7 017
11ПРАД DA7 020
12ЗАГ D10 DA4 D13 DA4 D20 DB7
13М+ D13 <k-1>
14БПВ1 000
15ИЗМАД DB7 017
16БП 012
17М- DB7 DB2
18М+ DA4 DA1
19БП 010
20В

По команде 10, выполняющейся первый раз при (DB7) = b00+i, адрес, записанный в DB7, сравнивается с адресом последнего элемента массива, записанным в DB3. Если адрес указывает на принадлежность элемента массиву, выполняется следующая команда. В противном случае управление передается на выполнение команды 17.

По команде 11 производится аналогичная проверка принадлежности элемента используемой строки матрицы A, адрес которого указан в DA4, массиву первых элементов ее строк. Если (DA4) > (DA3), управление передается на выполнение команды 20 — выход из подпрограммы.

По командам 12—13 формируются дескрипторные элементы дескрипторов D1 и D2 для скалярного умножения очередной строки матрицы A на очередной столбец матрицы B — для получения очередного элемента матрицы C.

По команде 14 производится обращение с возвратом в рамках одной задачи (без использования ОС) к процедуре счета скалярного произведения (см. табл. 12.3).

По команде 15 производится изменение адреса начального элемента столбца — переход к следующему столбцу с учетом предполагаемого закрепления элементов матрицы C за процессорами, а именно, производится операция (DB7) := (DB7)+(DB6), где (DB6) = N. Если после изменения адреса новое его значение превышает максимальное, записанное в DB3, осуществляется переход на выполнение команды 17. В~противном случае по команде 16 управление передается на выполнение команды 12 — на подготовку счета и счет очередного элемента C.

Команды 17 и 18 выполняются в случае, если измененный на значение N адрес (DB7) первого элемента столбца B превышает значение (DB3) = b00+k-1. Чтобы получить "координаты" того элемента C, к счету которого необходимо перейти, т.е. чтобы получить адреса первого элемента столбца и первого элемента строки, на пересечении которых он находится, необходимо выполнить следующие действия: последовательно вычитать шаг (DB2), т.е. значение k, из вновь полученного адреса столбца B и прибавлять шаг ( DA1 ), т.е. это же значение k, к ранее использованному адресу первого элемента строки A (первоначально — к значению a00 ) до тех пор, пока значение ( DB7 ) не станет меньше или равно значению ( DB3 ). По данным командам изменяются значения ( DB7 ) и ( DA4 ). Затем по команде 19 управление передается на выполнение команды 10, по которой в случае недостаточности коррекции дескрипторного элемента DB7 управление вновь передается на выполнение команды 17. Если коррекция элемента DB7 произведена успешно, по команде 11 может быть выяснено, что скорректированное значение ( DA4 ) превосходит значение ( DA3 ). Это означает, что следующий элемент матрицы C, к счету которого пытается приступить процессор, принадлежит несуществующей строке, то есть процессор закончил выполнение своей доли работы. По команде 20 производится выход из подпрограммы.

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