Здесь нет возврата к традиционным векторным машинам. Обработка разных элементов одного массива, к которой сводится задача, должна быть в целом асинхронной, по разным ветвям одного, а если надо, — по разным алгоритмам. Именно последнее замечание свидетельствует о возможности реализации и первого способа распараллеливания. Вместе с тем, необходимо обеспечить возможность синхронизации ВС при обработке общих данных или другой реализации частично упорядоченных работ.
Для решения отдельной задачи за минимальное время традиционные
симметричные ВС требуют формирования в очереди "к процессору"
большого числа, в общем случае взаимосвязанных, процессов отдельных программ,
выполняющихся под управлением операционной системы. С увеличением числа
процессоров в ВС растет сложность программирования. Число процессов
ограничено особенностями алгоритмов, отраженными в его
Значительный вес обрабатываемой информации, организованной в массивы, определил применение векторных ВС с синхронно работающими процессорами при выполнении общей команды. Этот способ обработки расширил возможность распараллеливания по данным, но ограничил ее локальным применением, хотя и такое применение оказывается достаточно эффективным для построения специализированных систем. При этом обработка однородных данных по разным ветвям алгоритма затруднена.
Ряд архитектур ВС основан на совмещении указанных способов параллельной
обработки.
Известен достаточный опыт экспериментального программирования задач повышенной сложности на основе подобной технологии.
Из сказанного выше следует вывод: необходимо на основе симметричной ВС
построить ВС, в наибольшей степени приспособленную к распределению
элементов больших массивов для обработки разными процессорами по
идентичным алгоритмам. Обработка должна в общем случае производиться по
разным ветвям. Должна быть синхронизация обращений к общим данным.
Выполнение разных ветвей одной программы делает возможным выполнение
разных программ разными процессорами. Тип таких ВС получил название
Тогда можно представить абстрактно общую архитектуру многопроцессорной ВС, соответствующую современным представлениям о параллельном вычислительном процессе.
Отметим лишь некоторые черты такой архитектуры, которые должны быть обязательно восполнены при реализации — с помощью процедур ОС или микропрограммно — в системе команд процессора на симметричной ВС.
"Идеальная" структура ВС
(рис 12.1) Структура ВС
Память процессора ППi содержит область для хранения стеков
вычислительного процесса, в том числе — стеков подпрограмм и вложенных
циклов. В других областях этой памяти хранятся модификаторы, дескрипторы
массивов и локальные величины. Через коммутатор К процессоры связаны с
оперативной памятью данных (ОПД), состоящей из P модулей Sp, p =
0, ..., P-1, с независимым доступом. Модули объединены в блоки, внутри
каждого из которых адресация осуществляется по принципу
Микропрограммирование, как и расширение набора операций на основе более простых, позволяет создать достаточно широкий набор сложных операций, определяющих систему команд ВС, ее машинный язык.
Экспериментальное программирование позволило сформировать
Среди этих команд (в трехадресной интерпретации с использованием индексных регистров) мы отметим следующие.
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, заносится в память закрытых адресов (распределенных
между модулями ОП).
Среди более сложных команд, которые могут быть реализованы с помощью развитого механизма дескрипторов, следует отметить следующие команды.
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. Выполнение команды
| №k | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | |||||||
| 1 | D15 | D25 | 007 | ||||
| 2 | ЗАКРА | D27 | |||||
| 3 | x | 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 на процессоре 0
— xa8a9a14, на процессоре 1 — xa10a11a15 ит.д.
Выход за пределы массивов при повторном выполнении команды 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | ЗАГ | <r> | <i> | DA7 | DA5 | ||
| 1 | DA7 | 020 | |||||
| 2 | x | <r> | -2 $$\pi$$ /R | $$\alpha$$ | |||
| 3 | ЗАГ | <k> | l1 | l2 | |||
| 4 | ЗАГ | DX4 | DX0 | ||||
| 5 | ЦИКЛ | DA2 | |||||
| 6 | x | <k> | $$\alpha$$ | $$\beta$$ | |||
| 7 | COS | ||||||
| 8 | x | DX4 | |||||
| 9 | + | l1 | l1 | ||||
| 10 | М+ | $$\beta$$ | |||||
| 11 | x | 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | ЗАГ | $$\alpha$$ | D14 | D10 | D24 | D20 | |
| 1 | ЦИКЛ | D12 | |||||
| 2 | x | 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 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 производится выход из
подпрограммы.
Здесь нет возврата к традиционным векторным машинам. Обработка разных элементов одного массива, к которой сводится задача, должна быть в целом асинхронной, по разным ветвям одного, а если надо, — по разным алгоритмам. Именно последнее замечание свидетельствует о возможности реализации и первого способа распараллеливания. Вместе с тем, необходимо обеспечить возможность синхронизации ВС при обработке общих данных или другой реализации частично упорядоченных работ.
Для решения отдельной задачи за минимальное время традиционные
симметричные ВС требуют формирования в очереди "к процессору"
большого числа, в общем случае взаимосвязанных, процессов отдельных программ,
выполняющихся под управлением операционной системы. С увеличением числа
процессоров в ВС растет сложность программирования. Число процессов
ограничено особенностями алгоритмов, отраженными в его
Значительный вес обрабатываемой информации, организованной в массивы, определил применение векторных ВС с синхронно работающими процессорами при выполнении общей команды. Этот способ обработки расширил возможность распараллеливания по данным, но ограничил ее локальным применением, хотя и такое применение оказывается достаточно эффективным для построения специализированных систем. При этом обработка однородных данных по разным ветвям алгоритма затруднена.
Ряд архитектур ВС основан на совмещении указанных способов параллельной
обработки.
Известен достаточный опыт экспериментального программирования задач повышенной сложности на основе подобной технологии.
Из сказанного выше следует вывод: необходимо на основе симметричной ВС
построить ВС, в наибольшей степени приспособленную к распределению
элементов больших массивов для обработки разными процессорами по
идентичным алгоритмам. Обработка должна в общем случае производиться по
разным ветвям. Должна быть синхронизация обращений к общим данным.
Выполнение разных ветвей одной программы делает возможным выполнение
разных программ разными процессорами. Тип таких ВС получил название
Тогда можно представить абстрактно общую архитектуру многопроцессорной ВС, соответствующую современным представлениям о параллельном вычислительном процессе.
Отметим лишь некоторые черты такой архитектуры, которые должны быть обязательно восполнены при реализации — с помощью процедур ОС или микропрограммно — в системе команд процессора на симметричной ВС.
"Идеальная" структура ВС
(рис 12.1) Структура ВС
Память процессора ППi содержит область для хранения стеков
вычислительного процесса, в том числе — стеков подпрограмм и вложенных
циклов. В других областях этой памяти хранятся модификаторы, дескрипторы
массивов и локальные величины. Через коммутатор К процессоры связаны с
оперативной памятью данных (ОПД), состоящей из P модулей Sp, p =
0, ..., P-1, с независимым доступом. Модули объединены в блоки, внутри
каждого из которых адресация осуществляется по принципу
Микропрограммирование, как и расширение набора операций на основе более простых, позволяет создать достаточно широкий набор сложных операций, определяющих систему команд ВС, ее машинный язык.
Экспериментальное программирование позволило сформировать
Среди этих команд (в трехадресной интерпретации с использованием индексных регистров) мы отметим следующие.
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, заносится в память закрытых адресов (распределенных
между модулями ОП).
Среди более сложных команд, которые могут быть реализованы с помощью развитого механизма дескрипторов, следует отметить следующие команды.
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. Выполнение команды
| №k | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | |||||||
| 1 | D15 | D25 | 007 | ||||
| 2 | ЗАКРА | D27 | |||||
| 3 | x | 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 на процессоре 0
— xa8a9a14, на процессоре 1 — xa10a11a15 ит.д.
Выход за пределы массивов при повторном выполнении команды 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | ЗАГ | <r> | <i> | DA7 | DA5 | ||
| 1 | DA7 | 020 | |||||
| 2 | x | <r> | -2 $$\pi$$ /R | $$\alpha$$ | |||
| 3 | ЗАГ | <k> | l1 | l2 | |||
| 4 | ЗАГ | DX4 | DX0 | ||||
| 5 | ЦИКЛ | DA2 | |||||
| 6 | x | <k> | $$\alpha$$ | $$\beta$$ | |||
| 7 | COS | ||||||
| 8 | x | DX4 | |||||
| 9 | + | l1 | l1 | ||||
| 10 | М+ | $$\beta$$ | |||||
| 11 | x | 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 0 | ЗАГ | $$\alpha$$ | D14 | D10 | D24 | D20 | |
| 1 | ЦИКЛ | D12 | |||||
| 2 | x | 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 | КОП | I1 | A1 | I2 | A2 | I3 | A3 |
|---|---|---|---|---|---|---|---|
| 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 производится выход из
подпрограммы.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.