ПОД конспект (1184368), страница 11
Текст из файла (страница 11)
Использование переменных данного типа в операторах СOMMON оговаривается в инструкциях по использованию языка на конкретных установках, в них же приводятся размеры имени процесса для расчетов длин общих блоков. В реализации на базе Фортран МВК [3] допускается использование данных типа TASKID в общих блоках, их длина - одно слово (как у данных типа INTEGER).
Для данных типа TASKID определены следующие операции: операции .EQ. , .NE. и присваивание (когда операнды операций, левая и правая части операторов присваивания имеют тип TASKID).
Данные типа TASKID используются в операторах передачи/приема сообщений - SEND и RECEIVE для задания абонентов - получателя или отправителя . Такие данные могут также передаваться в качестве параметров процедурам и функциям, а также могут быть переданы другим процессам с помощью операторов передачи сообщений.
Значения типа TASKID не могут использоваться в списках ввода-вывода, так как не имеют внешнего представления.
Начальная инициализация переменных этого типа также, как и других переменных Фортрана, не предусматривается, поэтому использование данных до присваивания им значений некорректно. Присвоение начальных значений зтим данным в операторах DATA не предусмотрено.
Спецификация данных типа TASKID в виде массива, структура которого совпадает с конфигурацией вычислительной системы, облегчает программирование задачи, например, может унифицировать операторы передачи данных между соседними процессами. В языке есть возможность заданием идентификатора массива данных типа TASKID указать массовую операцию для всех его элементов: в функциях порождения процессов,редукции и операциях передачи сообщений. Такая запись может ускорить выполнение программы, так как такие массовые операции могут выполняться параллельно.
Для задания массовых операций над частью массива - подмассива можно присвоить подмассиву имя оператором EQUIVALENCE, динамическое формирование структур подмассивов можно производить операторами языка Фортран МВК. Например:
TASKID T1(100),T2(100),TM
DIMENSION TM(100,2)
EQUIVALENCE (TM(1,1),T1(1)),(TM(1,2),T2(1))
При статической модели параллелизма инициализация данных этого типа производится функциями преобразования номеров виртуальных процессоров в имена задач.
Задачи и процессы
В языке вводится дополнительный вид программных единиц - программные единицы-задачи. Программа может содержать (помимо традиционных для Фортрана программных единиц) одну или более программных единиц-задач.
Главная программная единица (main program) определяет главный и единственный - начальной процесс программы. Эта единица может иметь заголовок:
PROGRAM n, где n - имя программы.
По Фортрану, заголовок программы может отсутствовать.
Имя программы (MAIN при его отсутствии) идентифицирует главную программную единицу программы, ссылки на него невозможны. (Конкретные реализации могут разрешать использование этого имени в операторах передачи сообщений в качестве адресата.)
При запуске начального процесса ему присваивается другое имя - системный идентификатор, по которому на него могут ссылаться другие процессы программы при передаче сообщений или при выполнении функций редукции. Это имя может быть получено любым процессом при помощи встроенной функцией MASTER без параметров. Результат функции имеет тип TASKID.
Программная единица-задача являются описанием задачи. Вычислительные процессы создаются по описанию задачи динамически и во время создания им присваиваются уникальные имена - системные идентификаторы. По одному описанию задачи может быть образовано произвольное число процессов данного класса.
Первым оператором программной единицы-задачи является оператор заголовка, имеющий вид: TASK PROGRAM n, где n - имя программной единицы-задачи.
В остальном, структура программной единицы-задачи не отличается от структуры главной программной единицы Фортрана 77. В частности, последним оператором, как обычно, является оператор END.
Задачи не могут иметь общей памяти с другими задачами, в частности, с главной, поэтому общие блоки (COMMON-блоки) задач локальны в пределах каждой задачи и программных единицах, которые в ней используются. Семантика COMMON-блоков в пределах одной задачи - традиционная.
Создание процессов.
Для создания процессов в динамической модели параллелизма используется стандартная функция NEWTASK. Обращение к этой функции производится операторами присваивания вида:
it = NEWTASK (n, ia) , где
n - имя программной единицы-задачи;
ia - константа, имя переменной, элемента массива или массива целого типа; значения этого параметра определяют виртуальные номера вычислителей, на которых создаются порождаемые процессы.
it - имя переменной, элемента массива или массива типа TASKID, куда заносятся имена (системные идентификаторы) порожденных процессов.
Функция NEWTASK создает по описанию задачи с именем n вычислительные процессы, количество которых определяется числом виртуальных номеров вычислителей. Это число равно количеству элементов массива параметра ia или равно одному для скалярного параметра.
Результатом выполнения функции NEWTASK является имя процесса или массив имен (системных идентификаторов) созданных процессов. Эти имена присваиваются переменным it.
Если n не совпадает с именем программной единицы-задачи, по которой образован текущий процесс, то оно должно быть описано. По аналогии с оператором EXTERNAL, для описания имен внешних задач вводится оператор спецификации TASK EXTERNAL, имеющий вид:
TASK EXTERNAL n [, ni ]... где
n, ni - имена программных единиц-задач.
Имена, указанные в списке этого оператора, разрешается использовать в качестве фактических параметров процедур (в том числе в качестве параметров функций NNAME и NEWTASK) и в качестве адресатов в операторе SEND. Если в качестве таковых параметров используется имя текущей единицы - задачи, то оно также должно быть описано как внешнее. Таким образом, передать сообщение процессу можно, идентифицируя его именем программной единицы-задачи, по которой он был образован (по имени класса), или по системному имени. Оператор TASK EXTERNAL должен быть размещен в программе-задаче до первого исполняемого оператора. Имена (системные идентификаторы) процессов не имеют внешнего представления, они скрыты от пользователя, их можно присваивать переменным типа TASKID. Процесс может определить собственное имя, имя процесса, породившего его, и имя главного процесса программы с помощью стандартных функций MYTASKID, РАRENT и МАSTER. Определение имен процессов по номерам виртуальных процессоров приведено в п. 7.
Созданные процессы загружаются и сразу начинают выполняться на процессорах, виртуальные (логические) номера которых заданы значениями параметра ia. Допускается использование одинаковых логических номеров для размещения процессов на одном виртуальном процессоре (для статической модели параллелизма это не так !).
Конкретное отображение виртуальных номеров процессоров на процессоры рабочей машины, способ загрузки процессов определяется реализацией, например, конструкциями языка описания конфигурации (аналогично тому, как номера каналов ввода-вывода в стандартах Фортрана не закреплены, а определяются реализацией, в частности, языком управления заданиями). Процедура создания главного процесса программы и порядок его размещения на процессоре также определяется реализацией.
При реализации статической модели параллелизма распределение процессов по процессорам производиться статически, на этапе подготовки задания. В этом случае, функции NEWTASK в программе отсутствуют и процессы запускаются при инициализации задачи. В статическом варианте имена процессов (системные идентификаторы) определяются с помощью функции GETTASKID, имеются еще ряд стандартных функций для работы в этом режиме (см. 7.).
Примеры использования функций порождения процессов
Операторы порождения будут иметь окружение программы-задачи С.
TASK PROGRAM C
TASK EXTERNAL A,B,READ,PRINT
TASKID TI, TM(100),TM2(100,2)
INTEGER K,KM(100),KM2(100,2)
.............
END
Инициализация процессов: 1 TI = NEWTASK(A,K)
2 TМ = NEWTASK(A,KМ)
3 TМ2 = NEWTASK(A,KМ2)
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-размерные, при программировании приводятся к параметрам реальной структуры решающего поля. Алгоритмы, реализуемые как стандартные процедуры, также должны адаптироваться к структуре выделяемых ресурсов. Настройка структуры (под) программ под параметры вычислительной среды может управляться заданием номеров виртуальных вычислителей.
При запуске программы на конкретной вычислительной платформе возможно потребуется сопроводить программу спецификацией об используемых значениях номеров виртуальных процессоров и схемой их оптимальной дислокации на вычислителях платформы, и об именах задач, связанных с этими номерами для последующей загрузки соответствующих процессов. Конкретные реализации, оговаривая правила загрузки задач на процессоры, могут содержать средства задания порядка выполнения (приоритета) нескольких процессов на одном процессоре.
Для статической модели параллелизма балансировка загрузки вычислительной системы может производиться на уровне языка конфигурации, размещением на одном физическом процессоре нескольких виртуальных.
-
Средства передачи и приема сообщений в языке Фортран-GNS.
Обмен информацией между процессами осуществляется с помощью передачи сообщений. Для этого используются операторы:
SEND - послать сообщение и RECEIVE - принять сообщение.
Предусмотрено три способа передачи сообщений: синхронный, асинхронный и передача без ожидания.
Синхронный способ
При синхронном способе передачи сообщений посылающий и принимающий процессы приостанавливают выполнение своих программ и переходят в состояние ожидания до тех пор, пока не выполнятся оба синхронных оператора SEND и RECEIVE.
Сообщения данного типа могут передаваться без использования буферов почтовых ящиков, так как передача синхронного сообщения будет производиться только при готовности абонентов к обмену и может происходить непосредственно из памяти передающего процесса в память принимающего процесса.
Процесс может посылать синхронные сообщения как отдельному процессу, так и группе процессов. В последнем случае процесс отправитель продолжит выполнение только после получения подтверждения о выполнении соответствующих операторов RECEIVE во всех процессах - получателях. Получив сообщение, получатель группового синхронного сообщения может продолжить работу, не ожидая завершения всех остальных обменов по данному оператору SEND. Получатель синхронного сообщения может ждать его только от процесса, имя которого указано в параметре оператора RECEIVE, т.е нельзя заказать в одном операторе ожидание синхронных сообщений от нескольких процессов.
Асинхронный способ
При асинхронном способе передачи сообщения посылающий процесс продолжает выполнение независимо от того, выполнил ли получающий процесс оператор RECEIVE или нет.