Ответы 190 страниц (1184228), страница 30
Текст из файла (страница 30)
Создать интерфейс прикладного программирования для МРР систем;
Обеспечить возможность эффективных коммуникаций для коммуникации точка-точка, коллективных операций, группы процессов.
Допускать удобное сопряжение с языками C, Fortran 77, Fortran 90 и C++;
Простой способ создания процессов для модели SPMD (одна программа используется для обработки разных данных на разных процессорах);
Основные понятия языка
Группа - упорядоченное (от 0 до ранга группы) множество идентификаторов процессов Группы служат для указания адресата при посылке сообщений (процесс-адресат специфицируется своим номером в группе), определяют исполнителей коллективных операций. Являются мощным средством функционального распараллеливания - позволяют разделить группу процессов на несколько подгрупп, каждая из которых должна выполнять свою параллельную процедуру. При этом существенно упрощается проблема адресации при использовании параллельных процедур.
Контекст - область "видимости" для сообщений, аналогичное области видимости переменных в случае вложенных вызовов процедур. Сообщения, посланные в некотором контексте, могут быть приняты только в этом же контексте. Контексты - также важные средства поддержки параллельных процедур.
Коммуникаторы - позволяют ограничить область видимости (жизни, определения) сообщений рамками некоторой группы процессов, т.е. могут рассматриваться как пара - группа и контекст. Кроме того, они служат и для целей оптимизации, храня необходимые для этого дополнительные объекты.
Имеются предопределенные коммуникаторы (точнее, создаваемые при инициализации MPI-системы): * MPI_COMM_ALL - все процессы и операции над группами (локальные, без обмена сообщениями), например, Дай размер группы. MPI_GROUP_SIZE(IN group, OUT size) Дай номер в группе обратившегося процесса. MPI_GROUP_RANK(IN group, OUT rank)
Основные операции - send, receive
Операции могут быть блокирующими и неблокирующими.
В операции send задается:
- адрес буфера в памяти;
- количество посылаемых элементов;
- тип данных каждого элемента;
- номер процесса-адресата в его группе;
- тег сообщения;
- коммуникатор.
MPI_SEND(IN start, IN count, IN datatype, IN dest, IN tag, IN comm) Типы данных - свои в MPI, но имеется соответствие между ними и типами Fortran и С.
В операции receive задается:
- адрес буфера в памяти;
- количество принимаемых элементов;
- тип данных каждого элемента;
- номер процесса-отправителя в его группе;
- тег сообщения;
- коммуникатор;
- ссылка на объект-статус, содержащий необходимую информацию о состоянии и результате операции.
Имеется возможность указать "любой отправитель" и "любой тег".
Имеется три режима коммуникаций - стандартный, режим готовности и синхронный.
В стандартном режиме последовательность выдачи операций send и receive произвольна, операция send завершается тогда, когда сообщение изъято из буфера и он уже может использоваться процессом.
В режиме готовности операция send может быть выдана только после выдачи соответствующей операции receive, иначе программа считается ошибочной и результат ее работы неопределен. В синхронном режиме последовательность выдачи операций произвольна, но операция send завершается только после выдачи и начала выполнения операции receive. Во всех трех режимах операция receive завершается после получения сообщения в заданный пользователем буфер приема.
Неблокирующие операции не приостанавливают процесс до своего завершения , а возвращают ссылку на коммуникационный объект, позволяющий опрашивать состояние операции или дожидаться ее окончания. Имеются операции проверки поступающих процессу сообщений, без чтения их в буфер (например, для определения длины сообщения и запроса затем памяти под него).
Средства описания и создания процессов в языке Фортран-GNS.
Тип данных – TASKID
По семантике языка Fortran GNS все процессы программы получают уникальные имена - системные идентификаторы, по которым производится отождествление корреспондентов при обмене сообщениями между процессами и в терминах которых задается среда выполнения функций редукции. Эти имена вырабатываются функцией порождения процессов - встроенной функцией языка NEWTASK. Структура системного идентификатора определяется реализацией, это имя не имеет внешнего представления.
Для манипулирования именами процессов внутри программы в язык Fortran GNS вводится новый для Фортрана тип данных - тип TASKID. Значения этого типа представляют собой имена процессов, которые вырабатываются функцией порождения процессов.
При статической модели параллелизма системные идентификаторы процессов вырабатываются системой запуска программы и могут быть получены пользователем встроенными функциями.
Добавляется константа .NOTASKID., которая представляет собой "нулевое" значение для объектов этого типа. Данные типа TASKID должны быть описаны в операторе TASKID, синтаксис которого аналогичен синтаксису операторов объявления типа в Фортране 77. Данные этого типа могут использоваться в операторах EQUIVALENCE, но при этом могут быть эквивалентными только данным типа TASKID. Допускается использование TASKID в качестве описателя типа подпрограммы-функции.
Использование переменных данного типа в операторах С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))
При статической модели параллелизма инициализация данных этого типа производится функциями преобразования номеров виртуальных процессоров в имена задач.
3. Задачи и процессы
В языке вводится дополнительный вид программных единиц - программные единицы-задачи. Программа может содержать (помимо традиционных для Фортрана программных единиц) одну или более программных единиц-задач.
Главная программная единица (main program) определяет главный и единственный - начальной процесс программы.Эта единица может иметь заголовок:
PROGRAM n, где n - имя программы.
По Фортрану, заголовок программы может отсутствовать.
Имя программы (MAIN при его отсутствии) идентифицирует главную программную единицу программы, ссылки на него невозможны. (Конкретные реализации могут разрешать использование этого имени в операторах передачи сообщений в качестве адресата.)
При запуске начального процесса ему присваивается другое имя - системный идентификатор, по которому на него могут ссылаться другие процессы программы при передаче сообщений или при выполнении функций редукции. Это имя может быть получено любым процессом при помощи встроенной функцией MASTER без параметров. Результат функции имеет тип TASKID.
Программная единица-задача являются описанием задачи. Вычислительные процессы создаются по описанию задачи динамически и во время создания им присваиваются уникальные имена - системные идентификаторы. По одному описанию задачи может быть образовано произвольное число процессов данного класса.
Первым оператором программной единицы-задачи является оператор заголовка, имеющий вид: TASK PROGRAM n, где n - имя программной единицы-задачи.
В остальном, структура программной единицы-задачи не отличается от структуры главной программной единицы Фортрана 77. В частности, последним оператором, как обычно, является оператор END.
Задачи не могут иметь общей памяти с другими задачами, в частности, с главной, поэтому общие блоки (COMMON-блоки) задач локальны в пределах каждой задачи и программных единицах, которые в ней используются. Семантика COMMON-блоков в пределах одной задачи - традиционная.
3.1. Создание процессов.
Для создания процессов в динамической модели параллелизма используется стандартная функция 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)
.............