Контрольные точки в языке норма
Изучение непроцедурного языка Норма предназначеного для автоматизации решения сеточных задач на вычислительных системах с параллельной архитектурой, который позволяет исключить фазу программирования, необходимую при переходе от расчетных формул.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 28.10.2018 |
Размер файла | 20,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ИНСТИТУТ ПРИКЛАДНОЙ МАТЕМАТИКИ
им.М.В. Келдыша РАН
Контрольные точки в языке норма
Бугеря А.Б.
Москва, 2001
Аннотация
Рассматриваются вопросы определения и реализации контрольных точек языка Норма.
Непроцедурный язык Норма предназначен для автоматизации решения сеточных задач на вычислительных системах с параллельной архитектурой. Этот язык позволяет исключить фазу программирования, которая необходима при переходе от расчетных формул, заданных прикладным специалистом, к программе.
Контрольные точки предназначены для записи во время выполнения программы вычисленных величин и возможности начинать счет не заново, а с последней пройденной контрольной точки.
Abstract
The definition and implementation of control points for the Norma language is considered.
The nonprocedural Norma language is a tool aimed for automated solution of the grid-oriented problems on parallel computer systems. This language eliminates the programming phase that is necessary to pass from computational formulas, derived by an application specialist, to a computer program.
The control points may be used for writing the calculated variables during the calculation and then for the ability to start the calculations not from the begin of program, but from the last passed control point.
Введение
Возможность определения в программе на языке Норма [1] контрольных точек предназначена для восстановления вычислительного окружения и продолжения вычислений в случае сбоев оборудования или иных причин, приводящих к снятию программы с счета. Контрольные точки также могут послужить хорошим инструментом при организации счета, требующего много времени, на системе с ограниченным временем выполнения программ. При прохождении вычислительного процесса через контрольную точку все переменные, вычисленные на данный момент и требуемые для дальнейшего счета, сохраняются во внешнем файле. Если в дальнейшем при счете произойдет сбой, начинать вычисления сначала не требуется - все нужные данные для продолжения счета с контрольной точки имеются во внешнем файле. Контрольных точек в программе может быть несколько. Восстановление возможно с последней пройденной из них.
Синтаксис контрольных точек
<Контрольная точка> ::=
CONTROL POINT [(FORMATTED)] <Имя> <Описание>. |
CONTROL POINT [(FORMATTED)] <Где> <Имя раздела или функции>.
<Имя> ::= <Идентификатор>
<Описание> ::=
BEFORE <Список переменных> |
AFTER <Список переменных>
<Список переменных> ::=
<Переменная> {,<Переменная>} [IN ITERATION ON <Индекс с условием> {;<Индекс с условием>}]
<Индекс с условием> ::=
<Индекс итерации>[=<Число>{,<Число>}] |
<Индекс итерации> [EVERY <Число>]
<Индекс итерации > ::= <Идентификатор>
<Переменная> ::= <Идентификатор>
<Где> ::= IN PART | IN FUNCTION
<Имя раздела или функции> ::= <Идентификатор>
Семантика контрольных точек
Все контрольные точки делятся на 2 вида: контрольные точки в текущем разделе или функции (первая альтернатива в синтаксической нотации) и контрольные точки в разделе или функции, вызываемом из текущего (вторая альтернатива). В первом случае определяется собственно контрольная точка, ей дается имя и указывается место и условия ее постановки (см. ниже). Во втором случае только указывается, что вызываемый из текущего раздела другой раздел или функция имеют одну или несколько контрольных точек. В данном случае не указывается имя, и не определяются место и условия постановки контрольной точки. Имя генерируется на основе имени вызываемого раздела и порядкового номера вызова, место постановки - непосредственно перед вызовом раздела или функции, условий нет (ставится всегда).
Если контрольная точка организуется не в главном разделе, то во всех разделах, прямо или косвенно вызывающих данный, должны быть описаны контрольные точки по второй альтернативе. Такая цепочка контрольных точек должна продолжаться вплоть от главного раздела.
Рассмотрим определение места контрольной точки в программе. Так как язык НОРМА является непроцедурным (декларативным) языком, порядок выполнения операторов определяется компилятором. Для того чтобы указать в какой момент времени выполнения программы необходимо создать контрольную точку (обычно это имеет смысл после завершения каких-то достаточно больших вычислений), надо указать список переменных, после вычисления которых (или до) должна быть организована контрольная точка. программирование язык автоматизация вычислительный
После слова BEFORE (или AFTER) идет перечисление имен переменных (величин на сетке, скаляров), которое используется транслятором для определения места контрольной точки. Описание BEFORE <Список переменных> означает, что контрольную точку надо ставить до начала вычисления любой (хотя бы одной) переменной из списка, AFTER - после вычисления всех переменных из списка.
Местом вычисления переменной считается:
1. Оператор ASSUME или скалярный оператор, в котором переменной присваивается какое-то значение.
2. Вызов раздела, в котором переменная стоит после слова RESULT.
3. Итерация или сильно связанная компонента, в которой переменной присваивается какое-то значение.
Если присутствует конструкция IN ITERATION ON и список индексов, то это означает, что контрольную точку надо ставить в теле итерации с индексом из списка индексов, вложенной во все другие итерации из числа итераций с индексами из указанного списка индексов. Контрольная точка в теле этой итерации осуществляется по правилам, изложенным выше.
Контрольная точка будет определена на каждом шаге итерации, если у индекса отсутствуют условия, иначе контрольная точка будет определена только при заданных значениях индекса. Нулевое или отрицательное значение индекса недопустимо. Если присутствует условие EVERY <Число>, то контрольная точка будет создаваться при значениях индекса, кратному указанному числу (`на каждом n-ом шаге').
Параметр 'FORMATTED' означает, что файл, в который записываются значения переменных, должен иметь читаемый вид, т.е. можно было бы посмотреть значения сохраненных переменных. Если контрольная точка создается в распределенном разделе, то каждый процессор создает свой собственный файл, в который сохраняет свои переменные, Имя файла строится из имени раздела, в котором производится генерация контрольной точки и, если раздел распределенный, номеров процессоров. Расширение имени файла- '.cp'.
Если контрольная точка попадает после операции вывода или между двумя операциями ввода, то при восстановлении с этой контрольной точки будет пропущена операция вывода, или возможен неправильный ввод данных, о чем будет выдано соответствующее предупреждение.
Особенности организации контрольных точек во внешних разделах.
Если контрольная точка описана как контрольная точка во внешнем разделе или функции, то контрольная точка будет организована перед каждым вызовом этого раздела или функции, и будет создаваться информационный файл, в который записывается, кто вызывает этот внешний раздел и другие параметры вызова для правильного восстановления с контрольной точки во внешнем разделе. Если вызов внешнего раздела или функции попадает в сильно связанную компоненту, то контрольная точка организовываться не будет, о чем будет выдано соответствующее предупреждение. Информационный файл всегда неформатный, имеет имя внешнего раздела или функции, расширение - '.inf'. При заданном режиме 'reliability' (режим повышенной надежности, в этом случае по каждой контрольной точке создаются 2 одинаковых файла, см. ниже) второй информационный файл не нужен, т.к. если сбой произошел при создании информационного файла, при восстановлении он всегда будет создаваться заново.
Если контрольная точка во внешнем разделе или функции, и вызов внешнего раздела или функции производится в цикле, то внутри этого цикла на каждом витке создается файл, в который записываются переменные, вычисляемые в данном операторе и значения переменных цикла. Этот файл имеет имя - имя раздела, который вызывает раздел с контрольной точкой, расширение - '.cp1' (и '.cp2', если был задан режим надежность). При восстановлении с данной контрольной точки уже вычисленные в данном операторе переменные восстанавливаются, и выполненные витки цикла не производятся.
Режим повышенной надежности.
Так как возможен сбой при записи сохраняемых переменных в файл, и при этом теряется его предыдущее содержимое (если были контрольные точки до этого), т.е. восстановиться с предыдущей контрольной точки будет невозможно, то предусмотрено задание режима трансляции 'reliability', при котором используется back-файл. Вначале данные пишутся в основной файл, затем еще раз - в back-файл. Если произойдет сбой при записи в основной файл, предыдущий back-файл испорчен не будет; если при записи в back-файл -значит, основной записан до конца. Back-файл в отличие от основного файла имеет расширение '.cpb'.
Контрольные точки и модули на языке Фортран.
Программа на языке НОРМА может включать в себя отдельные внешние модули, написанные на языке Фортран. Это могут быть подпрограммы чтения данных, подпрограммы, реализующие косвенную адресацию и т.п. вычисления, которые описывать на языке НОРМА нецелесообразно. При организации в такой программе контрольных точек существует следующее ограничение. Если эти внешние модули используют какие-то данные, насчитанные ими же или другими внешними данными ранее, то при организации контрольной точки после того, как эти данные были вычислены, но до того, как использованы, выполнение программы при восстановлении с этой контрольной точки будет неправильным.
Транслятор языка НОРМА ничего не знает об этих данных, о том, что они требуются для дальнейшего счета и что необходимо их сохранять. Поэтому при восстановлении с контрольной точки вызовы, реализующие вычисление данных, выполнены не будут, данные не восстановлены, а модули, использующие эти данные, будут вызваны. Что, соответственно, приведет к неверному выполнению программы.
Для предотвращения описанной выше ситуации необходимо при использовании внешних модулей, написанные на языке Фортран, принять меры для сохранения используемых в них вычисленных ранее величин.
Структура организации контрольных точек в Фортран-программе.
В начале каждого не главного раздела генерируется блок анализа .inf файла. Этот файл должен быть создан вызывающим разделом при вызове данного раздела и содержать информацию о том, какие действия предпринимать: начинать счет или пытаться восстановиться с контрольной точки. Если анализ файла неудачен, или если в нем предписано начинать счет с начала раздела, то непосредственно следующий за этим блоком блок анализа файла с сохраненными величинами обходится, и попытка восстановиться с контрольной точки не производится. Если же в .inf файле предписано пытаться восстановиться с контрольной точки, или в случае главного раздела, начинает выполняться непосредственно следующий за данным блоком блок анализа файла с сохраненными величинами. И в этом, и во всех остальных блоках, генерируемых в распределенном разделе, успешность выполнения какой-либо операции проверяется при помощи вызова функции синхронизации.
В этом блоке делается попытка найти и прочитать файл с сохраненными величинами. Вначале анализируется основной файл. Из него считывается имя контрольной точки, и управление передается на блок восстановления переменных данной контрольной точки. Из блока восстановления переменных при неудачном восстановлении управление может вернуться обратно и тогда, как и в случае если файл с сохраненными величинами вообще не найден, или если из него не удалось прочитать даже имя контрольной точки, при заданном режиме 'reliability' все то же повторяется с back-файлом. Если режим 'reliability' задан не был, или если и с back-файла восстановиться не получается, счет начинается заново.
Генерация каждой контрольной точки состоит из 2-х блоков. Первым идет блок записи сохраняемых переменных. В начале проверяются условия постановки контрольной точки, если они есть. Если они не выполнены, управление передается на дальнейший счет. Иначе в файл с сохраняемыми величинами записывается имя контрольной точки, параметры вызова (в неглавных разделах) и сохраняемые величины. Если задан режим 'reliability', все то же повторяется с back-файлом. Следующий блок - блок восстановления сохраненных величин - обходится и счет продолжается.
На блок восстановления сохраненных величин возможно передача управления из начала программы - из блока анализа файла с сохраненными величинами. В этом блоке сохраненные величины считываются, и счет продолжается. В случае ошибки при считывании величин управление передается обратно в начало программы для анализа back-файла или счета заново.
Если генерируется контрольная точка во внешнем разделе или функции, то непосредственно после блоков генерации идет блок формирования inf-файла. Соответствующая команда для него (начинать счет заново в вызываемом разделе или пытаться восстановиться) формируется в блоках генерации.
После каждого распределенного раздела с контрольными точками генерируется функция синхронизации. Она служит для определения того, что все подзадачи выполнили какую-либо операцию успешно. Функция вызывается всеми подзадачами с признаком 'успех'/'неуспех' и возвращает 'неуспех', если хотя бы одна подзадача ее вызвала со значением `неуспех', и 'успех', если все подзадачи вызвали ее со значением `успех'.
Примеры генерации контрольных точек
Контрольная точка в главном разделе.
MAIN PART SUMMA.
! Вычисление сумм SumV(i) элементов V(i,j) матрицы, распределенной
! на процессорных элементах (1,1)(1,2);
! SumV(i) выводится в файл sumv<dat>.
BEGIN
so:(ts:(t=0..n);ijs:(is:(i=1..n);js:(j=1..n))).
VARIABLE a DEFINED ON ijs.
VARIABLE a1 INTEGER.
VARIABLE b,x,y,xy DEFINED ON is.
DOMAIN PARAMETERS n = 5.
Контрольная точка во внешнем разделе.
CONTROL POINT IN PART SUMV.
! Вычисление суммы
Oij:(Oi:(i=1..v);Oj:(j=1..w)).
VARIABLE V DEFINED ON Oij DOUBLE.
VARIABLE Vsum,Contr DEFINED ON Oi DOUBLE.
DOMAIN PARAMETERS v=30,w=40.
FOR Oij ASSUME V=j+(i-1)*w.
COMPUTE SUMV(V ON Oij RESULT Vsum ON Oi).
FOR Oi ASSUME
Contr=SUM((Oj)V).
OUTPUT Vsum(FILE='sumv',D20.10) ON Oi.
OUTPUT Contr(FILE='sumv',D20.10) ON Oi.
END PART.
PROGRAM SUMMA
INTEGER t,a1,CPCOMM0
REAL a(5,5),b(5),x(5),y(5),xy(5)
DOUBLE PRECISION V(30,40),Vsum(30),Contr(30)
CHARACTER CPFNAME0*15,CPSTR0*9
DOUBLE PRECISION RF1
Блок анализа файла с сохраненными величинами
WRITE(CPFNAME0,40005)
OPEN(1,FORM='UNFORMATTED',FILE=CPFNAME0,ERR=11,STATUS='OLD')
READ(1,ERR=11) CPSTR0
IF((CPSTR0.EQ.'SUMV0')) GOTO 5
11 CONTINUE
2 CONTINUE
CLOSE(1)
C +++ OПEPATOP 11 +++
DO 3 j=1,40
DO 3 i=1,30
V(i,j)=j+(i-1)*40
3 CONTINUE
C КОНТРОЛЬНАЯ ТОЧКА SUMV0
Блок записи сохраняемых переменных
OPEN(1,FORM='UNFORMATTED',STATUS='UNKNOWN',FILE=CPFNAME0)
CPSTR0='SUMV0'
WRITE(1) CPSTR0
WRITE(1) V
CLOSE(1)
GOTO 4
Блок восстановления сохраняемых переменных
5 CONTINUE
READ(1,ERR=2) V
CLOSE(1)
CPCOMM0=0
GOTO 6
Блок формирования inf-файла
4 CONTINUE
CPCOMM0=1
6 CONTINUE
C +++ OПEPATOP 12 +++
OPEN(1,FILE='SUMV.inf',FORM='UNFORMATTED',STATUS='UNKNOWN')
CPSTR0='SUMMA'
WRITE(1) CPSTR0,CPCOMM0,0,0,0,0,0,0,0,0
CLOSE(1)
CALL SUMV(V,Vsum)
C +++ OПEPATOP 13 +++
DO 8 i=1,30
RF1 = 0.0
DO 7 j=1,40
RF1 = RF1+(V(i,j))
7 CONTINUE
Contr(i)=RF1
8 CONTINUE
C +++ OПEPATOP 14 +++
OPEN(UNIT=8,FILE='sumv')
WRITE(8,40001)
WRITE(8,40002) (Vsum(i),i=1,30)
C +++ OПEPATOP 15 +++
WRITE(8,40003)
WRITE(8,40004) (Contr(i),i=1,30)
40001 FORMAT (1X,'Vsum=')
40002 FORMAT ((7(1X,4D20.10/),1X,2D20.10))
40003 FORMAT (1X,'Contr=')
40004 FORMAT ((7(1X,4D20.10/),1X,2D20.10))
40005 FORMAT ('SUMMA.cp')
CLOSE(8)
END
Контрольная точка в неглавном разделе.
PART SUMV.
! Распределенный раздел:
! Вычисление суммы Vsum на двух процессорных элементах.
V RESULT Vsum
BEGIN
Oij:(Oi:(i=1..v);Oj:(j=1..w)).
VARIABLE V DEFINED ON Oij DOUBLE.
VARIABLE Vsum DEFINED ON Oi DOUBLE.
DOMAIN PARAMETERS v=30,w=40.
DISTRIBUTION INDEX i=1..3,j=1..4.
CONTROL POINT bbb BEFORE Vsum.
FOR Oi ASSUME
Vsum=SUM((Oj)V).
END PART.
SUBROUTINE SUMV(V,Vsum)
TASK EXTERNAL sumv0
C ----- СТАРТ-ПРОГРАММА SUMV
DOUBLE PRECISION V(30,40),Vsum(30)
DOUBLE PRECISION RM1(10,10),RM2(10)
TASKID ITASKJ(3,4)
COMMON /ALARM0/IWAIT0
DATA IWAIT0 /0/
IF (IWAIT0.EQ.0) THEN
C ----- ОТСЫЛКА МАТРИЦЫ ИМЕН ПРОГРАММ
DO 22 IPRWWW=1,3
DO 22 JPRWWW=1,4
ITASKJ(IPRWWW,JPRWWW)=NEWTASK(sumv0,32*(IPRWWW-1)+JPRWWW)
22 CONTINUE
DO 23 IPRWWW=1,3
DO 23 JPRWWW=1,4
SEND(ITASKJ(IPRWWW,JPRWWW))ITASKJ
23 CONTINUE
END IF
C ОТСЫЛКА ФАКТИЧЕСКИХ ПАРАМЕТРОВ РАЗДЕЛА
C Отсылка исходных параметров в матрицу ПЭ по i,j
DO 26 IPRWWW=1,3
DO 26 JPRWWW=1,4
DO 27 IZzWWW=1,10
DO 27 JZzWWW=1,10
IIzWWW=IZzWWW+(IPRWWW-1)*10
JJzWWW=JZzWWW+(JPRWWW-1)*10
IF ((IIzWWW.LE.30).AND.(JJzWWW.LE.40)) THEN
RM1(IZzWWW,JZzWWW)=V(IIzWWW,JJzWWW)
END IF
27 CONTINUE
SEND(ITASKJ(IPRWWW,JPRWWW))RM1
26 CONTINUE
C ПРИЕМ РЕЗУЛЬТАТОВ
C Прием результатов от линейки ПЭ по i (j=1)
DO 28 IPRWWW=1,3
RECEIVE(ITASKJ(IPRWWW,1))RM2
DO 29 IZzWWW=1,10
IIzWWW=IZzWWW+(IPRWWW-1)*10
IF (IIzWWW.LE.30) THEN
Vsum(IIzWWW)=RM2(IZzWWW)
END IF
29 CONTINUE
28 CONTINUE
IWAIT0=1
RETURN
END
TASK PROGRAM sumv0
C +++++ ПРОГРАММА ДЛЯ ПЭ С НОМЕРАМИ i = 1..3 j = 1..4
INTEGER CPCOMM0,CPSYNCR0
DOUBLE PRECISION RFC
DOUBLE PRECISION V(10,10),Vsum(10),RABM0(10),PRABM0(10)
CHARACTER CPFNAME0*15,CPSTR0*9,CPSTR1*9
INTEGER CPVAR0(8),CPVAR1(8)
TASKID ITASKJ(3,4)
TASKID IVVVVJ,IWWWWJ
COMMON /NORMAMESSPASS/ITASKJ,IPRWWW,JPRWWW,IVVVVJ,IWWWWJ
C ----- ПРИЕМ МАТРИЦЫ ИМЕН ПРОГРАММ
IVVVVJ=MYTASKID()
IWWWWJ=PARENT()
RECEIVE(IWWWWJ)ITASKJ
C ----- ОПРЕДЕЛЕНИЕ КООРДИНАТ СВОЕЙ ЗАДАЧИ
DO 33 IPRWWW=1,3
DO 33 JPRWWW=1,4
IF(IVVVVJ.EQ.ITASKJ(IPRWWW,JPRWWW)) GOTO 34
33 CONTINUE
34 CONTINUE
32 CONTINUE
C ПРИЕМ ФАКТИЧЕСКИХ ПАРАМЕТРОВ РАЗДЕЛА
C Прием распределенных фактических параметров раздела
RECEIVE(IWWWWJ)V
IN00=1
IK00=10
JN00=1
JK00=10
IN01=1
IK01=10
JN03=1
JK03=10
Блок анализа inf-файла
WRITE(CPFNAME0,40001) IPRWWW,JPRWWW
OPEN(1,FORM='UNFORMATTED',FILE='SUMV.inf',ERR=2,STATUS='OLD')
READ(1,ERR=2) CPSTR1,CPCOMM0,CPVAR0
IF(((IPRWWW.ne.1).OR.(JPRWWW.ne.1))) GOTO 18
CPSYNCR0=KPSYNC0(1)
REWIND 1
WRITE(1) 1
CLOSE(1)
GOTO 19
18 CONTINUE
CLOSE(1)
CPSYNCR0=KPSYNC0(1)
19 CONTINUE
IF(((CPCOMM0.EQ.1).OR.(CPSYNCR0.EQ.0))) GOTO 3
Блок анализа файла с сохраненными величинами
OPEN(1,FORM='UNFORMATTED',FILE=CPFNAME0,ERR=20,STATUS='OLD')
READ(1,ERR=20) CPSTR0
IF((CPSTR0.EQ.'bbb')) GOTO 15
20 CONTINUE
2 CONTINUE
CPCOMM0=1
CLOSE(1)
CALL KPSYNC0(0)
3 CONTINUE
C +++ OПEPATOP 8 +++
DO 5 i=IN01,IK01
RABM0(i)=0.0
DO 5 j=JN03,JK03
RFC=V(i,j)
RABM0(i)=RABM0(i)+RFC
5 CONTINUE
C -----ВОЛНА-----
C --КРАЙНИЕ--
IF(JPRWWW.NE.1) GOTO 6
SEND(ITASKJ(IPRWWW,JPRWWW+1),TAG=5)(RABM0(i),i=IN01,IK01)
6 CONTINUE
IF(JPRWWW.NE.4) GOTO 7
SEND(ITASKJ(IPRWWW,JPRWWW-1),TAG=5)(RABM0(i),i=IN01,IK01)
7 CONTINUE
C --СРЕДНИЕ--
IF(JPRWWW.NE.2) GOTO 8
RECEIVE(ITASKJ(IPRWWW,JPRWWW-1),TAG=5)(PRABM0(i),i=IN01,IK01)
DO 9 i=IN01,IK01
RABM0(i)=RABM0(i)+PRABM0(i)
9 CONTINUE
SEND(ITASKJ(IPRWWW,JPRWWW+1),TAG=5)(RABM0(i),i=IN01,IK01)
8 CONTINUE
IF(JPRWWW.NE.3) GOTO 10
C --МАСТЕР--
RECEIVE(ITASKJ(IPRWWW,JPRWWW+1),TAG=5)(PRABM0(i),i=IN01,IK01)
DO 11 i=IN01,IK01
RABM0(i)=RABM0(i)+PRABM0(i)
11 CONTINUE
RECEIVE(ITASKJ(IPRWWW,JPRWWW-1),TAG=5)(PRABM0(i),i=IN01,IK01)
DO 12 i=IN01,IK01
RABM0(i)=RABM0(i)+PRABM0(i)
12 CONTINUE
SEND(ITASKJ(IPRWWW,JPRWWW-2),TAG=5)(RABM0(i),i=IN01,IK01)
10 CONTINUE
C +++ OПEPATOP 7 +++
C ----ПРИЕМ РЕЗУЛЬТАТА МАТФУНКЦИИ----
IF(JPRWWW.NE.1) GOTO 13
RECEIVE(ITASKJ(IPRWWW,JPRWWW+2),TAG=5)(RABM0(i),i=IN01,IK01)
13 CONTINUE
C КОНТРОЛЬНАЯ ТОЧКА bbb
Блок записи сохраняемых переменных
OPEN(1,FORM='UNFORMATTED',STATUS='UNKNOWN',FILE=CPFNAME0)
CPSTR0='bbb'
WRITE(1) CPSTR0
WRITE(1) CPSTR1,CPVAR0
WRITE(1) V,RABM0
CLOSE(1)
GOTO 14
Блок восстановления сохраняемых переменных
15 CONTINUE
READ(1,ERR=2) CPSTR0,CPVAR1
IF(.NOT.((CPSTR0.EQ.CPSTR1).AND.(CPVAR1(1).EQ.CPVAR0(1))
>.AND.(CPVAR1(2).EQ.CPVAR0(2)).AND.(CPVAR1(3).EQ.CPVAR0(3))
>.AND.(CPVAR1(4).EQ.CPVAR0(4)).AND.(CPVAR1(5).EQ.CPVAR0(5))
>.AND.(CPVAR1(6).EQ.CPVAR0(6)).AND.(CPVAR1(7).EQ.CPVAR0(7))
>.AND.(CPVAR1(8).EQ.CPVAR0(8)))) GOTO 2
READ(1,ERR=2) V,RABM0
CLOSE(1)
IF(KPSYNC0(1).EQ.0) GOTO 3
14 CONTINUE
IF(JPRWWW.NE.1) GOTO 16
DO 17 i=IN01,IK01
Vsum(i)=RABM0(i)
17 CONTINUE
16 CONTINUE
C ОТСЫЛКА ПАРАМЕТРОВ-РЕЗУЛЬТАТОВ РАЗДЕЛА
C Отсылка распределенных результатов из линейки ПЭ по i
IF(JPRWWW.NE.1) GOTO 35
SEND(IWWWWJ)Vsum
35 CONTINUE
40001 FORMAT ('SUMV',I2.2,I2.2,'.cp')
GOTO 32
END
Функция синхронизации для распределенного раздела
FUNCTION KPSYNC0(Ival)
INTEGER i, j
TASKID ITASKJ(3,4)
TASKID IVVVVJ,IWWWWJ
COMMON /NORMAMESSPASS/ITASKJ,IPRWWW,JPRWWW,IVVVVJ,IWWWWJ
IF(((IPRWWW.NE.1).OR.(JPRWWW.NE.1))) GOTO 1
Ir=Ival
DO 2 i=1,3
DO 2 j=1,4
IF(((i.EQ.1).AND.(j.EQ.1))) GOTO 2
RECEIVE(ITASKJ(i,j),TAG=4)Ip
IF (Ip.LT.Ir) THEN
Ir=Ip
END IF
2 CONTINUE
GOTO 3
1 CONTINUE
SEND(ITASKJ(1,1),TAG=4)Ival
3 CONTINUE
IF(((IPRWWW.NE.1).OR.(JPRWWW.NE.1))) GOTO 4
DO 5 i=1,3
DO 5 j=1,4
IF(((i.EQ.1).AND.(j.EQ.1))) GOTO 5
SEND(ITASKJ(i,j),TAG=4)Ir
5 CONTINUE
GOTO 6
4 CONTINUE
RECEIVE(ITASKJ(1,1),TAG=4)Ir
6 CONTINUE
KPSYNC0=Ir
END
Литература
1. А.Н.Андрианов, А.Б.Бугеря, К.Н.Ефимкин, И.Б.Задыхайло. НОРМА. Описание языка. Рабочий стандарт / Препринт ИПМ им.М.В.Келдыша РАН. №120. 1995. 52с.
Размещено на Allbest.ru
Подобные документы
Характеристика этапов решения задач на электронных вычислительных системах. Разработка алгоритма и основы программирования. Язык Ассемблера, предназначенный для представления в удобочитаемой символической форме программ, записанных на машинном языке.
контрольная работа [60,5 K], добавлен 06.02.2011Паскаль как язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля, история его разработки и функциональные особенности. Задача с использованием двумерного массива, составление блок-схемы решения.
контрольная работа [819,0 K], добавлен 12.03.2014Создание простого непроцедурного языка, которым может воспользоваться любой пользователь. Разработка языка запросов. Стандартный язык реляционных баз данных. Вопросы практического программирования. Фиксированный исполняемый код SQL и типы команд SQL.
доклад [1,9 M], добавлен 12.01.2011Характеристика параметрических методов решения задач линейного программирования: методы внутренней и внешней точки, комбинированные методы. Алгоритм метода барьерных поверхностей и штрафных функций, применяемых для решения задач большой размерности.
контрольная работа [59,8 K], добавлен 30.10.2014Применение информационных технологий в конкретной практической деятельности по выбранной специальности. Использование языка программирования Pascal в инженерной практике как универсального алгоритмического языка. Программа решения задачи на языке Pascal.
курсовая работа [1,3 M], добавлен 25.07.2012Назначение и применение электронно-вычислительных машин. Этапы решения задач на ЭВМ. Общая характеристика алгоритмического языка QuickBASIC: символы, простейшие конструкции, арифметические выражения. Определение нестандартных функций оператором DEF FN.
методичка [322,1 K], добавлен 18.12.2014Особенности задач линейного программирования. Симплексный метод решения задач линейного программирования. Обоснование выбора языка, инструментария программирования, перечень идентификаторов и блок-схема алгоритма. Логическая схема работы программы.
дипломная работа [2,4 M], добавлен 13.08.2011История появления и распространения Turbo Pascal - среды разработки для языка программирования Паскаль. Общий вид объявления файлового типа. Входная, выходная и промежуточная информация. Алгоритм решения задачи: словесный алгоритм, блок-схема, программа.
курсовая работа [359,4 K], добавлен 05.01.2010Анализ метода линейного программирования для решения оптимизационных управленческих задач. Графический метод решения задачи линейного программирования. Проверка оптимального решения в среде MS Excel с использованием программной надстройки "Поиск решения".
курсовая работа [2,2 M], добавлен 29.05.2015Разработка программы автоматизации процесса проверки знаний учащихся. Использование языка программирования Borland Delphi 7.0, его свойства, компоненты для работы со строками. Создание обучающих тестов на знание лексики и грамматики английского языка.
курсовая работа [521,0 K], добавлен 06.03.2016