Перейти на главную страницу
Оккам (OCCAM) - это новый язык программирования, разработанный для реализации параллельной обработки информации на транспьютерных сетях. Он позволяет программисту представить сложную программу в виде множества параллельно-последовательных процессов, взаимодействующих друг с другом посредством пересылки сообщений по каналам связи. Для каждого из параллельных процессов обычно используется отдельный процессор. Язык разработан в Англии специально для транспьютеров, но может быть использован и для параллельного программирования сетей ЭВМ /23.24/.
В Оккам поведение любого процесса прослеживается только по сообщениям, проходящим по его каналам связи. Внутренняя структура процесса для языка Оккам безразлична, также как и в рассмотренных операторах взаимодействия системы "Минимакс". и может быть скрытой. Оккам - процесс определяется только следующими фазами:
1)начало;
2)обработка, при которой в пределах языка Оккам контролируются и осуществляются следующие процедуры: 2.1) присваивание: изменение значения переменной, например присваивание ей значений констант или идентификаторов каналов связи; 2.2)ввод - получение значения из входного канала связи; 2.3) вывод - засылка значения в выходной канал связи (для осуществления двунаправленного ввода-вывода требуется двухсторонняя, дуплексная связь):
3) завершение процесса.
Ввод - вывод возможен только в паре: источник - потребитель и должен быть синхронизован. Два процесса обмениваются значениями только тогда, когда оба готовы к этому, и только в одну из сторон: один выводит значение - другой вводит это же значение.
В языке Оккам существенно упрощена синхронизация асинхронных параллельных процессов. Любой процесс (ветвь) между своим началом и завершением может только ожидать ввода требуемых для его продолжения значений из одного из входных каналов транспьютера. Вывод значений, подлежащих передаче другим процессам, осуществляется сразу же после их вычислений без дополнительной проверки события готовности к их приему в других процессах (ветвях).
Полагается, что параллельная программа составлена таким образом, что согласование синхронизации выполнено при программировании, и в этот момент времени обязательно уже имеется другой хотя бы один процесс, готовый к приему и ожидающий ввода.
С целью реализации этого принципа в языке Оккам отдельные процессы объединяются в сложные последовательно-параллельные процессы специальными процедурами их компоновки, которые называются конструкторы. Применяются следующие виды конструкторов:
1. Последовательный конструктор (SEQ) задает поочередное последовательное выполнение процессов и завершается с окончанием последнего процесса в последовательности. В этом случае каждый последующий процесс считается начатым и находится в режиме ожидания ввода значений от предыдущих процессов.
2. Параллельный конструктор (PAR) задает параллельное выполнение своих компонент и завершается лишь после окончания всех параллельных ветвей. Очевидно, что это не оптимальная организация, но существенно упрощающая синхронизацию. Она не оптимальна в том смысле, что в худшем случае время выполнения набора параллельные ветвей может оказаться равным времени их последовательного выполнения, если в большинстве ветвей ожидание ввода потребуется сразу же в их начале, а требуемые им значения будут вычисляться в других ветвях к моменту их завершения. Поэтому в конструктор PAR рекомендуется включать ветви программы, независимые по данным и управлению, аналогично ветвям Ярусно-параллельных форм (ЯПФ).
3.Альтернативный конструктор (ALT) выбирает для выполнения только один процесс из заданного их списка и завершается после завершения выбранного процесса. Применяется для ускорения выполнения ветвей программы, связанных между собой по данным или/и управлению. Первым отыскивается из списка самый ранний процесс, уже готовый к выполнению по выводу предыдущих процессов, а из оставшегося списка - второй самый ранний, ожидавший ввода значений от предыдущих процессов, и так далее.
4. Условный конструктор (IF) аналогичен ALТ, но в процессах вместо простого ожидания ввода дополнительно используются логические условия. Условия процессов, включенных в состав этого конструктора, проверяются последовательно, и тот процесс, условие начала или продолжения которого оказывается истинным, поступает на выполнение. Если все условия всех процессов списка IF ложны, то выполнение конструктора IF завершается.
5. Условный конструктор (WHILE) повторяет свой процесс до тех пор, пока результат проверки логического условия его начала или продолжения не приобретет значение ложности.
Конструкторы можно размножать и повторять сколько угодно раз. Размножение применяется с использованием конструктора PAR, a повторением можно проимитировать условные циклы.
С помощью конструкторов при программировании осуществляется иерархическая последовательно - параллельная декомпозиция сложных программ подобно рассмотренному нами ранее отечественному методу разбиения задачи на крупноблочные параллельные ветви с минимизацией участия МОС и управлении их взаимодействием.
Такой подход позволяет снизить затраты системных ресурсов на организацию выполнения параллельных программ по сравнению с рассмотренными нами МОС-ми МПВС "Минимакс" и "Микрос", в частности упростить операторы группового и индивидуального взаимодействия и тем самым уменьшить требуемый объем ЛОП транспьютеров.
Этот подход достаточно эффективен в специализированных МПВС с ПС и прежде всего в транспьютерных акселераторах МПС, так как в них прикладное программирование выполняется весьма редко, чаше всего только на этапе их проектирования, и поэтому разумно пойти на увеличение его трудоемкости. За счет этого, применив языки, подобные Оккам, или наш аппарат крупноблочных параллельных ветвей, можно существенно уменьшить затраты времени МОС на организацию взаимодействий ветвей и сэкономить расход памяти в ЭМ-ах. Последнее весьма актуально, так как из-за технологических ограничений емкость внутрикристальных встроенных ЛОП в ЭМ-ах пока невелика, например, в транспьютере Т800 до 4 Кбайт.
Достоинства языка Оккам:
1. Формальные структуры языка Оккам пригодны не только для параллельного программирования, но и для формального описания па-раллельных структур из соединенных между собой компьютеров.
2. Язык Оккам очень прост и краток, но в то же время с помощью названных пяти конструкторов он позволяет объединять множество примитивных процессов в мощные иерархические параллельно-последовательные управляющие структуры.
3. Он имеет встроенную возможность синхронизации асинхронных параллельных процессов, основанную на ожидании процессом ввода по его входному каналу требуемых для его продолжения значений поименованных переменных. Он позволяет обойтись без семафоров, очередей процессов, планировщика и обслуживания прерываний.
4. Он пригоден на всех уровнях поддерживаемой им иерархической управляющей структуры. Например, его конструкции пригодны и для составления локальных программ в каждом из транспьютеров вычислительной сети, и для описания главной глобальной программы всего параллельного вычислительного процесса в транспьютерной сети. Именованные локальные процессы ЭМ-ин естественно через описанные каналы связи входят в состав глобального процесса.
5. Логика работы его не зависит от того, реализуется ли он на одном процессоре или на нескольких. Компилятор Оккама может реализовать режим разделения времени, и поэтому все указанные в тексте программы параллельные процессы получают доступ к одному и тому же процессору. Поэтому все программы на Оккаме предварительно транслируются и отлаживаются на ЭВМ общего назначения в режиме СРВ, а после этого дополняются необходимыми конструкциями, которые описывают способы их параллельной загрузки в транспьютерную сеть и расположения локальных именованных процессов в разных ЛОП разных транспьютеров.
6. Система параллельного программирования Оккам снабжена отладочными и оценочными средствами: экранным редактором, синтаксическим анализатором, средствами структурного редактирования. программами для оценки ожидаемой производительности параллельной программы и требуемой памяти.
Основные, примитивы и конструкции языка Оккам Конструкции:
1.Последовательная конструкция SEQ:
SEQ {база FOR количество }
: Р1
: •
: —> со сдвигом на один символ и пробел
:
Процессы Р1, Р2,. . . выполняются последовательно
PAR {база FOR количество}
: Р1
: Р2
: •
:
Процессы Р1, Р2,. . . выполняются параллельно.
ALT {база FOR количество }
: Р1
: Р2
: •
Выполняется первым любой из составляющих процессов, готовый по уже поступившим значениям из входного канала связи. Если таких процессов несколько, они выполняются последовательно, как в SEQ.
4.Условные конструкции, по которым может быть выполнен не более, чем один из составляющих процессов.
WHILE <условие>
:
: процесс
Процесс повторяется до тех пор, пока результат проверки логического условия не приобретет значения ложности.
IF <условие>
:
: процесс
Процесс, кроме обычного ожидания ввода по входному каналу, блокируется до тех пор, пока условие не приобретет значения истинности.
1.Объявление переменной (переменных):
VAR имя 1, имя 2,...:
2.Объявление массива переменных:
VAR имя [размер]:
3.Объявление каналов связи:
CHAN имя1, имя2. ...:
массива каналов
CHAN имя [размер]:
4.Объявление процессов:
PROC имя(<параметры>)=
В качестве параметров указывается объявление имен используемых процессом каналом.
5. Присваивание, которое изменяет значение переменной:
a:=b+с
chan 1 ? а
Переменной а присваивается значение, полученное из канала
chan 1.
chan 2! b+с
8. : - завершает примитивы объявления и текст программы (завершение процесса).
Полезные подпрограммы:
1.Ввод (чтение) из одного канала и сразу же вывод(запись) в другой
канал (транзитная передача):
chan 1? x
chan 2! х
2. Если при вводе из одного канала и выводе в другой канал процесс использует промежуточную переменную, хранимую в ОП, необходимо объявить ее имя и применить последовательный конструктор:
VAR x:
SEQ
chan.in ? х
3.Параллельное чтение (ввод) из двух входных каналов с присваиванием считанных из этих каналов значений объявленным переменным:
VAR for-vote, against-vote:
PAR
Against ? against-vote
4.Полезно применение конструкции ALT для реализации повторений :
ALT 1=[O FOR 100] | групповое
inp[l] ? х | транзитное
oup ! х : | взаимодействие
Этот процесс читает значение из первого доступного (передающего) канала в массиве входных каналов inp[l], присваивает его переменной х и передает в канал oup , и так далее, пока не обслужит все доступные каналы с номерами от 0 до 100. Завершается после обслуживания доступных к этому моменту каналов (передающих какие-либо значения по наличии стартовых посылок: 11 в каждом передаваемом байте).
3.3.9.Программирование в транспьютерной сети на языке ОККАМ матричного волнового процессора.
Напомним суть двумерного волнового алгоритма умножения двух матриц. Одна матрица поступает в квадратный матричный процессор слева по столбцам, другая сверху - по строкам. По мере продвижения векторов данных вправо и вниз они попарно встречаются в нужных транспьютерах, их компоненты перемножаются и суммируются с накоплением частичных сумм в каждом транспьютере. После того, как все элементы исходных матриц волна за волной за n шагов (nхn: размер матриц) будут загружены в матрицу транспьютеров и пройдут ее, в каждом из них накопятся суммы произведений пар элементов как результирующие элементы искомой матрицы. На каждом волновом фронте каждый транспьютер выполняет одинаковую задачу - чтение
данных из двух входных каналов связи левого и верхнего, вычислительный процесс их перемножения и прибавления с накоплением к предыдущей частичной сумме и дальнейшую передачу использованной пары исходных данных в другие (выходные) каналы вниз и вправо.
Программа транспьютерной сети составляется как иерархическая двухуровневая /24/.
На нижнем уровне в каждом транспьютере выполняется следующая локальная программа на языке Оккам:
РROС mult(CHAN up, down. left, right)=
V
Определяется, что подчиненный процесс А может повторяться n-раз на фронте каждой волны. где 0 соответствует начальной установке
AR ass,a,b:
SEQ
ass:=0
S
выполняются последовательно.
ass:=аss+а*b II
PAR
down!a III
right!b:
Заметим, что подчиненные процессы, составляющие какую-либо конструкцию, обязательно располагаются под наименованием этой конструкции так, что их конструкции сдвинуты на один символ и пробел. Эти сдвиги один из основных элементов синтаксиса языка.
На втором высшем уровне иерархии программы транспьютерной сети должны выполняться главная (глобальная) организующая программа на языке Оккам, т.е. структурная программа, которая в нашем примере должна установить связи между транспьютерами и вызывать указанный выше локальный PROC mult... nxn раз на каждой из n волн.
СHAN vertical[ n*(n+1)]:
CHAN horizontal [n*(n+1):
PAR I=[0 FOR n]
PAR J=[0 FOR n]
mult( vertical [ ( n*1+J],
vertical[(n*1)+j+l),
horisontal[(n*l)+J],
horisontal [(n*(I+1))+j]):
Этот сравнительно простой текст несет в себе большую смысловую нагрузку .
Вначале объявлены два массива каналов в матрице транспьютеров, каждый из которых содержит по n(n+1) каналов связи: между n транспьютерами в n строкам, или в n столбцах; по (n-1)-му каналу связи: между элементами строк, или между элементами столбцов, а также по одному входному и выходному каналу в каждом элементе первой и последней строки или первого или последнего столбца. Выходные каналы нижней строки и правого столбца могут использоваться для контроля прохождения всех элементов исходных матриц через транспьютерную сеть и обнаружения сбоев.
Иерархическая структура программы поддерживается в ОККАМЕ тем, что именованные процессы(например mult) могут быть использованы в тексте как и любые другие процессы. В нашем примере на верхнем уровне в глобальной программе указано с помощью двух конструкций РАД, что процесс mult нижнего уровня реализуется в каждой IJ ячейке. При этом соответствие между общими наименованиями каналов связи в транспьютерной сети на глобальном уровне и частными наименованиями четырех каналов в локальной программе ij-го транспьютера устанавливается по месту занимаемому ими в описании параметров процесса mult, например, vertical[(n*i)+j] - это канал up в ij-ом транспьютере.
Номера каналов в глобальной программе вычисляются по принципу их сквозной нумерации, начиная с левого верхнего угла матрицы. Принцип составления формул для вычисления их номеров графически отображен на рис.3.6.5.
R глобальной программе процесс mult инициализируется ( начинается) параллельно и одновременно по всем парам
Vertical[(n*i)+J] и horisontal[(n*i)+j]
входных каналов каждого ij-го транспьютера. Однако в связи с тем. что процесс А по локальным программам транспьютеров выполняется в транспьютерах
последовательно по i от 0 до n и, видимо, со сдвигом во времени, равным такту ot, процесс передачи исходных операндов вправо и вниз развивается во времени по мере их использования в предыдущих (левой и верхней) соседних ячейках. Поэтому процесс mult в следующей ячейке может выполниться и завершиться только после появления в обоих ее входных каналах up и left обоих исходных данных И(а), И(Ь), а до того он будет приостановлен из -за отсутствия передач данных хотя бы от одного соседа слева или сверху.
Следовательно, несмотря на заложенную в глобальной программе потенциальную возможность одновременного выполнения вычислений:
асc := асc + a*b
во всех NxN ячейках, эти вычисления по матрице будут развиваться последовательно по мере продвижения волновых Фронтов по направлению главной диагонали, начиная с левого верхнего угла, синхронно с загрузкой столбцов данных слева и строк данных сверху. Причем, по мере продвижения одного за другим n волновых Фронтов в каждой ij-ой ячейке локальный процесс А последовательно повторится n раз со сдвигом во времени, равным конвейерному такту t, что и определяется предыдущей конструкцией:
SEQ1=[0 FOR n]
| A:
В транспьютерах фирмы Инмос(типа Т...) и в языке ОККАМ отсутствуют буферные памяти, встроенные в каналы связи (адаптеры последовательный интерфейсов) между транспьютерами. В то же время при программировании в транспьютерных сетях потоковых и волновых архитектур требуется создавать в каналах входные очереди, которые должны ожидать других еще не готовых операндов. Например, напомним, что в волновом алгоритме умножения двух матриц требуется вводить в вертикальные каналы ячеек, расположенных выше главной диагонали, и в горизонтальные каналы ячеек, расположенных ниже главной диагонали, дополнительные буферы одного из входных операндов, емкости которых линейно возрастают от 0 до n-1 вправо от главной диагонали в вертикальных каналах и вниз от главной диагонали в горизонтальных каналах.
Такие буферы можно ввести программно в локальные программы транспьютеров /24/. Для этого необходимо модифицировать текст программы процесса А, введя в процесс I перед процессом II соответствующие подпрограммы, имитирующие буферные линии задержкм(FIFO-буфер), емкости которых должны линейно зависить по каналу up? от номера столбца 1, а по каналу left? от номера строки J с учетом местоположения ij-й ячейки относительно главной диагонали.
Принцип составления программы FIFO-буфера с емкостью n ячеек ОЗУ. имитирующей линию задержки, состоит в следующем.
Такой FIFO - буфер можно рассматривать как цепочку последовательно соединенных ячеек ОЗУ (Рис. 3.6.6.).
Рис.3.6.6.
На рис.3.6.6. приняты следующие обозначения:
X - переменная, продвигающаяся по линии задержки с конвейерным тактом t:
Cli] - обозначение условного канала связи между (i-1)-й и 1-й ячейками ОЗУ, соответствующего передаче слова значения переменной к из одной ячейки ОЗУ в другую через регистр процессора в транспьютере под управлением УУ.
Если подпрограмма, имитирующая буфер, поименована следующим образом:
=>,
WHILE TRUE
: процесс,
:
которая повторяет выполнение подчиненного процесса, пока условие не станет ложным. Ложным считается нулевое содержимое ячейки, и тогда оно не будет продвигаться. Кроме того по процедуре buffer после считывания из ячейки значения 0 ее содержимое обнуляется.
PROC buffer =
СНАN с[п+1]:
PAR i=[О FOR n]
WHILE TRUE
VAR x:
SEQ
с[i]?x
Программный буфер можно ввести между двумя внешними каналами ввода-вывода транспьютера. В этом случае имена внешних каналов транспьютера указываются в качестве параметров буфера:
bufferCcl.c2) ,
где с1 - имя входного внешнего канала,
с2 - имя выходного внешнего канала ( Рис.3.6.7).
ввод в вывод из
буфер буфера
С1 С2
внешний (n-2) ячейки внешний
входной выходной
канал (п-1) внутренних ложных канал
каналов
Рис.3.6.7
PROC buffег (СНАN С.1n,С.out) = CHAN С[ n-1]:
WHILE TRUE
PAR
SEQ буфер
С.1n?х
C[O]!x
VAR x: буфер
SEQ
C[1]?x
VAR x:
SEQ Вывод из
C[n-2]?x буфера
C.out!x:
Она дополнена двумя дополнительными процессами ввода из внешнего канала и вывода во внешний выходной канал.
3.3.11. Учет в программах на языке Оккам событий синхронизации параллельный асинхронных вычислительных процессов.
Как указано выше, синхронизация параллельных процессов в языке Оккам существенно упрощена тем, что любой процесс между своим началом и завершением может приостанавливаться по ожиданию ввода требуемого для его продолжения значения из одного из входных каналов транспьютера. Вывод значений, требуемых другим процессам для их продолжения, осуществляется в выходные каналы сразу же после их вычисления в транспьютере. Однако в некоторых случаях требуется блокировка (приостановка) одного процесса по инициативе другого. Наиболее простой способ такой блокировки в Оккаме это прекращение передачи данных из одного канала в другой, которые связывают два подпроцесса блокируемого процесса. Это можно осуществить по специальному сигналу останова, ожидаемому с выхода третьего входного канала транспьютера. В качестве третьего канала может быть использован любой свободный из четырех последовательных дуплексных каналов транспьютера или пятый его канал stop, специально предназначенный для передачи сигналов о свершении событий синхронизации /24/.
Напишем текст программы на Оккаме, по которой данные копируются из одного канала С1 в другой С2 в стыке двух подпроцессов до тех пор, пока не поступит управляющий сигнал (ANY) останова из третьего канала под именем stop:
VAR running:
SEQ
WHILE running
VAR x:
ALT
running: = FALSE
C1?x
C2!x: II
В противном случае, если сигнал ANY не получен, по ALT всегда выполняется II второй процесс копирования значения из канала C1. в C2. По присвоению условию ложного значения конструкция WHILE приводит к завершения процесса после передачи значения переменное! к из канала C1 в канал С2. В противном случае, если сигнал ANY не получен, то пo ALT всегда выполняется II процесс копирования значения из канала C1 в С2. Тем самым какой-то большой процесс, в который встроена эта транслирующая конструкция, может быть либо приостановлен, либо продолжен.
Такие методы синхронизации достаточно просты и удобны при создании и программировании специализированный параллельных систем.
Однако при этом вся сложность организации синхронизации асинхронных процессов в основном переносится на этап прикладного программирования, что существенно повышает его сложность и трудоемкость. По-видимому такой подход, являющийся удовлетворительным в специализированный системам, не приемлим в ВС общего назначения и в особенности в системам автоматического программирования интеллектуальный ВС пятого поколения. В настоящее время проводятся большие исследовательские работы по повышению степени автоматизации системы параллельного программирования, и отечественные МОС системы "Минимакс" и "Микрос", например КОСМОС, являются одними из первый в мире систем автоматизации параллельного программирования.
В связи с высокой степенью однородности удалось для МПВС с ПС получить на основе теории массового обслуживания сравнительно простые выражения для инженерный оценок значений показателей эффективности с учетом введения резервных ЭМ-ин и затрат на восстановление работоспособности прикладной подсистемы /17/.
Формулы показателей производительности, надежности и живучести:
1.Среднее значение производительности с учетом ненадежности ЭМ-ин
где - номинальная производительность одной ЭМ-ны:
N - общее количество ЭМ-ин в МПВС с ПС;
- интенсивность отказов одной ЭМ-ны;
- интенсивность восстановления одной ЭМ-ны одним
восстанавливающим устройством;
Для каждого из параллельных процессов обычно используется отдельный процессор. Язык разработан в Англии специально для транспьютеров, но может быть использован и для параллельног
14 10 2014
1 стр.
Работа предлагает постановку задачи оценки параллельного программирования. Рассматривается ряд подходов к оценке сложности параллельных программ
15 12 2014
1 стр.
Блеза Паскаля. Первоначально этот язык был создан для обучения программированию. Однако благодаря заложенным в нем большим возможностям структурного программирования он стал широко
25 09 2014
6 стр.
Рассматривается система, позволяющая быстро создавать и публиковать информационные web-сервисы без использования языков программирования, а также автоматически генерировать их сема
12 10 2014
1 стр.
Язык программирования С++ (история, стандарт, обратная совместимость с С, место среди других языков программирования)
09 10 2014
1 стр.
Оборудование: О. И. Мельникова, Бонюшкина А. Ю. Начала программирования на языке Qbasic
10 10 2014
1 стр.
Представление информации может осуществляться с помощью языков, которые являются знаковыми системами. Каждая знаковая система строится на основе определенного алфавита и правил вып
25 09 2014
1 стр.
В настоящее время в области научно-технических расчетов превалируют три модели параллельного программирования: модель передачи сообщений (мпс), модель с общей памятью
14 12 2014
15 стр.