Автор работы: Пользователь скрыл имя, 25 Марта 2012 в 17:19, курсовая работа
Идея параллельной обработки данных не нова. Можно считать, что она возникла еще на заре человеческой цивилизации, когда оказалось, что племя может успешно бороться за выживание, если каждый его член выполняет свою часть общей работы.
В ближайшее время под эффективным использованием аппаратных средств компьютера будут пониматься применение параллельных алгоритмов. Это связано с замедлением темпов роста тактовой частоты микропроцессоров и быстрым распространением многоядерных микропроцессоров.
MPI допускает многократное
ветвление программы и
В структуре языков Фортран и Си стандарт MPI реализуется как библиотека процедур с вызовами определенного вида. Требуется, чтобы программа, написанная с использованием стандарта MPI, могла быть выполнена на любой параллельной системе без специальной настройки. Для применения MPI на параллельной системе к программе должна быть подключена библиотека процедур MPI. Перед использованием процедур стандарта MPI следует вызвать процедуру MPI_INIT; она подключает коммуникатор.
MPI_COMM_WORLD, задающий стандартную
коммуникационную среду с
Перечень основных процедур стандарта MPI.
Исходной нумерацией n процессов в группе являются числа . Для определения числа процессов в группе и номера данного процесса служат процедуры MPI_GROUP_SIZE(group,size) и MPI_GROUP_RANK(group,rank).
Процедура MPI_GROUP_SIZE(group,size) присваивает параметру size значение, равное числу процессов группы с именем group.
Процедура MPI_GROUP_RANK(group, rank) присваивает параметру rank значение, равное номеру процесса в группе с именем group.
Однако иногда такая нумерация является неудобной; поэтому есть возможность изменять нумерацию в группе. В частности, если необходимо использовать топологию n-мерных кубов (или торов), то используется процедура MPI_CART_CREATE; обращение к ней имеет вид:
MPI_CART_CREATE(comm_old, ndims, dims, periods,
reorder, comm_cart),
где
comm_old- исходный коммутатор;
ndims- размерность создаваемой решетки;
dims- массив размерности ndims, задающий размер в каждом направлении;
periods- массив размерности
ndims, каждый элемент которого
reorder- параметр, принимающий значения FALSE или TRUE; нумерация будет сохранена в случае значения FALSE, или назначена другой - в случае значения TRUE;
comm_cart- вновь созданный
коммутатор с декартовой
Основными процедурами для целей обмена двух процессов служат процедура посылки сообщения MPI_SEND и процедура приема сообщения MPI_RECV; обращения к этим процедурам имеют вид
MPI_SEND(buf0,count0,
MPI_RECV(buf1,count1,
где
buf0, buf1 - начальные адреса
передающего и
count0, count1 - числа элементов данных в передающем и в принимающем буферах;
datatype0, datatype1 - типы передаваемых и получаемых
данных;
dest- номер принимающего процесса;
source- номер посылающего процесса;
tag- тэг сообщения (тэг
служит для указания типа
comm- коммуникатор группы.
Кроме этих процедур имеются также процедуры
MPI_ANY_SOURCE и MPI_ANY_TAG для приема сообщений от любых источников с любыми тэгами.
Основными процедурами для коллективных обменов между процессами являются барьерная процедура MPI_BARRIER, широковещательная процедура MPI_BCAST, процедура сбора данных MPI_GATHER, процедура раздачи данных MPI_SCATTER, процедура сбора и раздачи данных всем процессам MPI_ALLGATHER.
Барьерная синхронизация всей группы процессов осуществляет процедура MPI_BARRIER с обращением вида MPI_BARRIER (comm),
где comm- коммуникатор группы.
После вызова этой процедуры процесс останавливается до тех пор, пока все процессы группы не произведут вызов этой процедуры; это позволяет синхронизировать процессы, продолжая их с момента, когда будет произведен последний вызов этой процедуры.
Передачу сообщения от одного процесса ко всем остальным процессам группы называют широковещательной (broadcast) передачей; она реализуется процедурой MPI_BCAST с помощью вызова
MPI_BCAST (buffer, count, datatype, root, comm),
где
buffer- начальный адрес буфера;
count- число элементов в буфере;
datatype- тип передаваемых элементов;
root- номер передающего процесса;
comm- коммуникатор группы.
Сбор данных со всех процессов группы в один процесс этой группы осуществляет процедура MPI_GATHER с использованием вызова
MPI_GATHER (sendbuffer, sendcount, sendtype, recbuffer,
reccount, rectype, root, comm),
где
sendbuffer- начальный адрес посылающего буфера;
sendcount- число элементов в посылающем буфере;
sendtype- тип посылаемых элементов;
recbuffer- начальный адрес принимающего буфера;
reccount- число элементов в принимающем буфере;
rectype- тип принимаемых элементов;
root- номер передающего процесса;
comm- коммуникатор группы.
В обратном направлении работает процедура MPI_SCATTER, осуществляющая раздачу данных во все процессы группы из одного процесса этой группы; такая раздача производится с использованием вызова
MPI_SCATTER(sendbuffer, sendcount, sendtype, recbuffer,
reccount, rectype, root, comm),
где
sendbuffer- начальный адрес посылающего буфера;
sendcount- число элементов в посылающем буфере;
sendtype- тип посылаемых элементов;
recbuffer- начальный адрес принимающего буфера;
reccount- число элементов в принимающем буфере;
rectype- тип принимаемых элементов;
root- номер передающего процесса;
comm- коммуникатор группы.
Сбор данных из всех процессов
группы и размещение результата во
всех процессах группы позволяет
реализовать процедура MPI_
MPI_ALLGATHER(sendbuffer, sendcount, sendtype, recbuffer,
reccount, rectype, root, comm),
где приняты прежние обозначения.
Раздачу и сборку данных из всех процессов группы и размещение во всех процессах группы позволяет реализовать процедура MPI_ALLTOALL (см. Листинг 10) с помощью обращения
MPI_ALLTOALL (sendbuffer, sendcount, sendtype,
recbuffer, reccount, rectype, root, comm).
Кроме перечисленных процедур имеются глобальные операции редукции: сложение, максимум, минимум и т.п.; результат глобальной операции передается в один или во все процессы.
Всего библиотека MPI содержит несколько десятков процедур (обычно конкретная реализация кроме стандартных процедур MPI имеет еще некоторое количество их модификаций, однако стандартный набор должен обязательно присутствовать). Если принципиальная структура MPI освоена (хотя бы в рамках изложенного материала), то изучение новых процедур труда не представляет, так как в системе обычно имеется достаточно подробная инструкция.
Технология программирования DVM. Принципы
Модель Digital Virtual machine (DVM) положена в основу Fortran-DVM и C-DVM, разработанных в Институте прикладной математики Российской Академии Наук (ИПМ РАН).
При проектировании реализованы следующие принципы.
1. Система базируется
на высокоуровневой модели
программы, которая привычна для прикладного программиста.
2. Спецификации параллелизма остаются невидимыми для
обычных компиляторов Fortran-77 и С.
3. Языки распараллеливания предлагает программисту модель
программирования, близкую к модели исполнения.
4. Основная работа по
реализации модели выполняется
системой поддержки
Система DVM базируется на библиотеке
MPI (Message Passing Interface) для обеспечения
высокой степени переносимости
программ. Для повышения надежности
работы в настоящее время
Все DVM-директивы оформлены в виде строк, начинающихся любым из символьных сочетаний CDVM$, *DVM$ или !DVM$. Синтаксис и семантика директив в языках Fortran-DVM и С-DVM практически совпадают.
Модель выполнения DVM-программы описывается следующим образом.
1. DVM-программа выполняется
на виртуальной
2. Виртуальная многопроцессорная
система представляется в виде
многомерной решетки
3. В момент запуска
DVM-программа начинает свое
4. DVM допускает ограниченную иерархию параллелизма:
- на верхнем уровне
описывается то или иное число
независимых ветвей (задач), которые
могут выполняться параллельно
(независимые по данным
- в конце ветвей может
быть выполнена глобальная
- в каждой ветви могут
дополнительно выделяться
Никакие другие варианты иерархии параллелизма не допускаются.
5. При входе в параллельную
конструкцию поток управления
разбивается на ряд
6. Все переменные
7. Любой оператор присваивания
выполняется по правилу "
Отображение задач в DVM.
Набор задач, обрабатываемых системой, задается вектором задач T, -я компонента которого определяет задачу с номером .
Для отображения задач
на секции решетки виртуальных
CDVM$ MAP T(n) ONTO ,
где--я компонента вектора , а- секция решетки виртуальных процессоров.
Положим .При упомянутом применении директивы MAP -я задача будет выполняться на секции процессоров , мультииндекскоторых удовлетворяет условиям .
Для сопоставления блоков программы задачам существует две формы отображения: статическая и динамическая. Статическая форма аналогична параллельной секции в Open MP (аналогично директиве SECTIONS), и здесь она выглядит так
C описание массива задач
CDVM$ TASK MB(3)
......................
CDVM$ TASK_REGION MB
CDVM$ ON MB(1)
CALL JACOBY(A1,B1,M1,N1)
CDVM$ END ON
CDVM$ ON MB(2)
CALL JACOBY(A2,B2,M2,N2)
CDVM$ END ON
CDVM$ ON MB(3)
CALL JACOBY(A3,B3,M3,N3)
CDVM$ END ON
CDVM$ END TASK_REGION
В динамической форме каждая операция цикла отображается на задачу (на секцию процессоров). Например,
CDVM$ TASK_REGION MB
CDVM$ PARALLEL(I) ON MB(I)
DO I=1,NT
...............
END DO
CDVM$ END TASK_REGION
Программирование на MC#. Введение
Язык параллельного
В случае языка MC#, программист может предусмотреть исполнение автономных асинхронных методов либо локально, либо удаленно. В последнем случае, метод может быть спланирован для исполнения на другой машине, выбираемой двумя способами: либо согласно явному указанию программиста (что не является типичным случаем), либо автоматически (обычно, на наименее загруженном узле кластера или машине Grid-сети). Взаимодействие асинхронных методов, в рамках языка MC#, реализуется посредством передачи сообщений с использованием каналов и обработчиков канальных сообщений. Эти каналы и обработчики определяются в MC#-программах с помощью связок в стиле языка Polyphonic C#.