Ответы 190 страниц (1184228), страница 31
Текст из файла (страница 31)
END
Инициализация процессов: 1 TI = NEWTASK(A,K)
2 TM=WweWTASK(A,KM)
3 TM2=WweWTASK(A,KM2)
DO 4 I=1,100
4 TМ(I) = NEWTASK(A,KМ(I))
DO 5 I=1,100
TМ2(I,1) = NEWTASK(A,KМ2(I,1))
5 TМ2(I,2) = NEWTASK(B,KМ2(I,2))
Операторы с метками 2 и 4 (3 и 5) производят одинаковые действия, но инициализация в форме 2 (3) предпочтительнее, так как эта запись позволяет производить инициализацию процессов параллельно.
Отсутствие в Фортране 77 аппарата вырезок из массивов не позволяет иметь такую запись для алгоритмов:
DO 6 I=1,99,2
TМ(I) = NEWTASK(A,KМ(I))
6 TМ(I+1) = NEWTASK(В,KМ(I+1))
или
TМ(1) = NEWTASK(READ,KМ(1))
TМ(100) = NEWTASK(PRINT,KМ(100))
DO 7 I=2,99
7 TМ(I) = NEWTASK(В,KМ(I))
В результате выполнения операторов: TI = NEWTASK(PRINT,1) 8 TI = NEWTASK(READ,2))
на виртуальном процессоре с номером 1 будет образован и запущен процесс PRINT, внутреннее имя которого потеряно и недоступно программе из-за выполнения оператора 8.Доступ к нему для передачи сообщений возможен только по программному имени, заказать от него прием сообщений невозможно. C процессом на втором процессоре возможен обмен сообщениями в обе стороны.
В языке определена только одна синтаксическая конструкция использования функции NEWTASK - в операторе присваивания. Тем не менее входные языки могут разрешать использование этой функции и в других контекстах, там, где употребляются переменные типа TASKID. Например, оператор:
SEND (NEWTASK(PRINT,MI)) RES породив процесс печати, передает ему данные через RES.
Виртуальные номера процессоров.
Кодировка виртуальных номеров процессоров произвольная, также как задание номера меток программы. Эти номера могут быть переданы процессу, который порождает другие, через каналы ввода, операторами передачи сообщений, а также сгенерированы программно.
Одинаковые номера процессоров могут быть использованы для оптимального распределения ресурсов путем выравнивания времени работы процессов. Определив время работы (число операций) самого время-емкого процесса, можно объединять на одном процессоре выполнение нескольких других процессов, если их суммарное время меньше.При этом можно ускорить выполнение программы из-за упрощения коммуникаций между процессами, выполняемых на одном процессоре.
Виртуальные номера процессоров могут быть использованы для настройки решающего поля. Параллельные алгоритмы, формулируемые в теоретической постановке обычно как n-размерные, при программировании приводятся к параметрам реальной структуры решающего поля. Алгоритмы, реализуемые как стандартные процедуры, также должны адаптироваться к структуре выделяемых ресурсов. Настройка структуры (под) программ под параметры вычислительной среды может управляться заданием номеров виртуальных вычислителей.
При запуске программы на конкретной вычислительной платформе возможно потребуется сопроводить программу спецификацией об используемых значениях номеров виртуальных процессоров и схемой их оптимальной дислокации на вычислителях платформы, и об именах задач, связанных с этими номерами для последующей загрузки соответствующих процессов. Конкретные реализации, оговаривая правила загрузки задач на процессоры, могут содержать средства задания порядка выполнения (приоритета) нескольких процессов на одном процессоре.
Для статической модели параллелизма балансировка загрузки вычислительной системы может производиться на уровне языка конфигурации, размещением на одном физическом процессоре нескольких виртуальных.
3.2. Завершение программы и завершение процессов Выполнение программы на языке Fortran GNS завершается в следующих случаях:
а) при завершении выполнения главного процесса (процедурой STOP или выходом через END главной программной единицы);
б) при "авосте" в главном процессе;
в) при выполнении в каком-либо процессе программы стандартных процедур ABORT и FINISH.
г) при выполнении в каком-либо процессе программы оператора FINISH.
Из определения следует, что для завершения программы не требуется ожидания естественного (или авостного) завершения всех инициированных процессов программы, в частности, завершения всех обменов сообщениями между ними и выборки поступивших сообщений из почтовых ящиков. Вопрос о буферах ввода-вывода при "авосте" в главном процессе решается соглашениями ОС.
Выполнение одного процесса завершается в следующих случаях:
а) если выполняется одно из указанных выше условий, приводящих к завершению всей программы;
б) при выполнении оператора STOP в данном процессе;
в) при выполнении оператора END в задаче, по которой образован процесс; RETURN,END в функциях и процедурах имеет традиционный смысл.
г) в случае "авоста" в данном процессе.
Таким образом любой процесс может завершить выполнение всей программы выполнением стандартных процедур ABORT, FINISH; завершение процесса другими способами не прекращает выполнение программы. В частности, при выполнении оператора END в задаче, процесс завершается, ссылка на него сохраняется. Проблема почтовых ящиков завершенных процессов решаются при реализации языка.
При статической модели параллелизма работа программы завершается выполнением в одном из процессов ABORT или FINISH.
В языке нет средств для определения статуса процесса, поэтому, проблемы использования процессора,освободившегося по завершению выполняемого на нем процесса, связаны с наличием динамической загрузки процессов и должны решаться программированием синхронизирующих механизмов.
Средства передачи и приема сообщений в языке Фортран-GNS.
Передача сообщений
Обмен информацией между процессами осуществляется с помощью передачи сообщений. Для этого используются операторы:
SEND - послать сообщение и RECEIVE - принять сообщение.
4.1. Способы передачи сообщений
Предусмотрено три способа передачи сообщений: синхронный, асинхронный и передача без ожидания.
а. Синхронный способ
При синхронном способе передачи сообщений посылающий и принимающий процессы приостанавливают выполнение своих программ и переходят в состояние ожидания до тех пор, пока не выполнятся оба синхронных оператора SEND и RECEIVE.
Сообщения данного типа могут передаваться без использования буферов почтовых ящиков, так как передача синхронного сообщения будет производиться только при готовности абонентов к обмену и может происходить непосредственно из памяти передающего процесса в память принимающего процесса.
Процесс может посылать синхронные сообщения как отдельному процессу, так и и группе процессов. В последнем случае процесс отправитель продолжит выполнение только после получения подтверждения о выполнении соответствующих операторов RECEIVE во всех процессах - получателях. Получив сообщение, получатель группового синхронного сообщения может продолжить работу, не ожидая завершения всех остальных обменов по данному оператору SEND. Получатель синхронного сообщения может ждать его только от процесса, имя которого указано в параметре оператора RECEIVE, т.е нельзя заказать в одном операторе ожидание синхронных сообщений от нескольких процессов.
б. Асинхронный способ
При асинхронном способе передачи сообщения посылающий процесс продолжает выполнение независимо от того, выполнил ли получающий процесс оператор RECEIVE или нет.
Сразу же после выполнения оператора SEND процесс может изменить значения данных, перечисленных в списке передаваемых значений этого оператора, однако абоненту передаются те значения, которые были на момент выполнения оператора SEND.
Выполнение асинхронного оператора RECEIVE и продолжение работы процесса - получателя производиться только после поступления сообщения. Если сообщение пришло к получателю до выполнения у него оператора RECEIVE, то сообщение помещается в почтовый ящик процесса без прерывания его выполнения.Сообщения с одинаковым значением тега от одного и того же отправителя помещаются в почтовом ящике в том же порядке, как они посылались и в таком же порядке они будут выбраны операторами RECEIVE.
Сообщения, передаваемые асинхронным способом, идентифицируются именами отправителя и тегами (положительными значениями целого типа). Имя отправителя можно опускать в процессе - получателе, т.е. можно заказывать ожидание сообщений этого типа (с заданным тегом) от произвольного процесса. В этом случае отправителя можно идентифицировать при получения сообщения при помощи параметра SENDER в операторе RECEIVE.
Стандартные функции TESTMSG, TESTTAG, PROBE позволяют анализировать наличие сообщений, значения тегов и имен отправителей асинхронных сообщений в почтовом ящике процесса и ,соответственно, управлять порядком выбора поступивших сообщений.
Для организации селекции и установки режимов ожидания заданных асинхронных сообщений можно использовать также конструкции выбора (см. раздел 5.).
в. Передача без ожидания
При передаче сообщения способом "без ожидания" момент передачи сообщений (копирование данных для передачи в процессе отправителе и присваивание соответствующим переменным значений данных из принятого сообщения в процессе получателе) не определен в языке и зависит от системы интерпретации. При такой передаче работа обоих процессов (отправителя и получателя) продолжается после выполнения операторов этого вида, независимо от того, выполнилась ли фактически передача сообщения.
Так как значения данных, указанных в списке переменных оператора SEND, могут быть изменены любым следующим оператором процесса, то передаются такие значения, которые имеют эти переменные в момент фактической передачи. Оператор приема сообщений данного типа формирует за-
явку на прием сообщения,а переменные, перечисленные в списке не изменяются, если сообщение еще не поступило в почтовый ящик процесса на момент выполнения оператора. При поступлении сообщения, данные пересылаются из почтового ящика в память процесса (присваиваются соответствующим переменным) без прерывания его работы.
В каждым операторе обмена этого типа один из его параметров - логическая переменная FLAG служит для фиксации факта передачи сообщения. Значение этой логической переменной-флага связывается с фактом выполнения передачи данных, заданной оператором обмена для того процесса, в котором определена эта переменная. Система интерпретации присваивает флагу в процессе отправителе значение .TRUE. в момент снятия копии с данных отправителя для передачи, и флагу в процессе-получателе после присвоения этих значений переменным получателя. До выполнения оператора передачи / приема сообщения значение логической переменной - флага, связанной с этим оператором не определено.
Определить факт передачи данных и приостановить выполнение процессов до выполнения фактической передачи сообщения этого типа (для отправителя - до снятия копии с передаваемых данных, для получателя - до поступления сообщения в почтовый ящик или записи переданных данных в поле задачи) можно при помощи стандартных процедур - MSGDONE, ALLDONE, TESTFLAG.
Только установка значения флага в .TRUE. отправителю дает возможность изменять переменные, перечисленные в операторе SEND, без риска изменить передаваемые данные, для получателя - начать использовать полученные данные.Использование этих логических переменных вне операторов передачи сообщений и перечисленных выше процедур не допускается.
По аналогии с асинхронным протоколом допускается ожидание асинхронных сообщений от произвольного процесса (в операторах RECEIVE можно опускать имя отправителя).
Замечание:
Понятие "почтовый ящик процесса", используемое в данном описание языка, носит методический характер и служит моделью для пояснения семантических понятий аппарата передачи сообщений. Алгоритмы реализация этого аппарата зависят от особенностей вычислительной платформы и ее системного обеспечения.
Протоколы передачи и приема сообщений в языке Фортран-GNS.
Операторы передачи сообщений
Операторы SEND и RECEIVE имеют вид:
1.0
SEND (sm [,ss]...) [список] RECEIVE (rm [,rs]...) [список] |
1.5 где
sm или rm - спецификация сообщения - определяет адресата
(процесс или процессы, которым посылается
сообщение) или отправителя и способ синхронизации;
список - список передаваемых данных имеет такой же вид, как списки в операторах ввода/вывода Фортрана 77, т.е. элементом списка может быть константа,имя переменной, переменная с индексом, имя массива или неявный цикл;
ss или rs - дополнительная спецификация.
Вид спецификации сообщения sm и rm зависит от способа синхронизации.
а) Синхронный способ: sm есть [TASKID =] адресат,
где адресат есть adr или ALL, а
adr - ссылка на функцию, имя переменной, элемента массива или имя массива типа TASKID или имя программной единицы-задачи.
Если adr - имя программной единицы-задачи, то сообщение посылается всем процессам программы, образованным по образцу указанной программной единицы (исключая посылающую).процедуры.