Автор работы: Пользователь скрыл имя, 25 Марта 2012 в 17:19, курсовая работа
Идея параллельной обработки данных не нова. Можно считать, что она возникла еще на заре человеческой цивилизации, когда оказалось, что племя может успешно бороться за выживание, если каждый его член выполняет свою часть общей работы.
В ближайшее время под эффективным использованием аппаратных средств компьютера будут пониматься применение параллельных алгоритмов. Это связано с замедлением темпов роста тактовой частоты микропроцессоров и быстрым распространением многоядерных микропроцессоров.
Рассмотрим кратко основные языки и их расширения.
Fortran
Fortran — первый реализованный
язык программирования
Диалекты языка Fortran: Fortran-DVM, Cray MPP Fortran, F--, Fortran 90/95, Fortran D95, Fortran M, Fx, HPF, Opus, Vienna Fortran.
Fortran D95 - экспериментальный
язык программирования, основанный
на HPF. Расширения направлены на
поддержку основных классов
Fortran M - небольшой набор
расширений языка Fortran, предоставляющих
возможность модульной
HPF - дальнейшее развитие языка Fortran 90. Включены богатые средства для распределения данных по процессорам. Необходимые коммуникации и синхронизации реализуются компилятором. Часть расширений реализована в виде функций и операторов языка, а часть - в виде директив компилятору.
Vienna Fortran 90 - дальнейшее развитие языка Fortran 90. Включает в себя многочисленные возможности распределения массивов данных по секциям процессорных массивов, а также распределения итераций циклов.
C/C++
Си— стандартизированный процедурный язык программирования, разработанный в начале 1970-х годо. Си был создан для использования в операционной системе UNIX. Для языка Си характерны современный набор конструкций управления потоком выполнения, структур данных и обширный набор операций.
C++ — компилируемый статически
типизированный язык
Charm/Charm++ - параллельные расширения
языков C и C++ соответственно. Программы,
написанные с их
Cilk - язык программирования
с поддержкой многопоточности,
базирующийся на языке C. Программист
должен заботиться о задании
максимального параллелизма, а его
использование и конкретную
HPC - проект, разрабатываемый в CRIM (Centre de Recherche Informatique de MontrВal). Цель проекта - создание на основе языка C средства для поддержки параллельных вычислений на большом количестве различных платформ. Параллельные расширения языка строятся по аналогии с языком HPF.
MPL - объектно-ориентированный
язык программирования, базирующийся
на языке C++. Распределение данных
задается программистом, а все
необходимые пересылки и
mpC - язык программирования,
основанный на языках C и C, предоставляющий
средства создания
MPC++ - расширение языка
C++, предназначенное для написания
параллельных программ. Каждому
процессору параллельного
Adl
Adl - функциональный язык
с небольшим числом
Ada
Ada - универсальный язык
программирования, включающий в
себя средства для создания
параллельных программ. Официальный
язык программирования
MC#
MC# - новый проект по
созданию асинхронного
DVM
DVM-система предназначена для создания переносимых и эффективных вычислительных приложений на языках C-DVM и Fortran-DVM для параллельных компьютеров с различной архитектурой. Аббревиатура DVM соответствует двум понятиям: Distributed Virtual Memory и Distributed Virtual Machine.
Linda
Linda - параллельный язык
программирования. Программа рассматривается
как совокупность процессов,
NESL
NESL - язык параллельного программирования, созданный с целью как написания параллельных программ, так и обучения. Поддерживает параллелизм по данным, позволяя задавать параллельное выполнение любых функций над однотипными данными.
Occam
Orca - язык параллельного
программирования для
Sisal
Sisal - функциональный язык
программирования. Программист не
заботится о параллельных
ZPL
ZPL - параллельный язык программирования. Включает в себя возможности операций на целыми массивами и секциями массивов. Программист не задает никакого параллелизма, все параллельные свойства извлекаются компилятором.
3.2 Технологии параллельного программирования
Введение в технологию Open MP
В технологии Open MP за основу берется последовательная программа. Для создания параллельной версии пользователю представляются наборы:
1) директив,
2) процедур,
3) переменных окружения.
Стандарт Open MP разработан для языков Fortran и C (Fortran 77, 90, 95 и C, C++) и поддерживается производителями всех больших параллельных систем. Реализации стандарта доступны в UNIX и в среде Windows NT.
Конструкции Open MP в различных языках мало отличаются, поэтому ограничимся языком Fortran.
Распараллеливание программы состоит в том, чтобы весь текст разбить на последовательные и параллельные области. В начальный момент порождается нить-мастер (или основная нить), которая начинает выполнение программы со стартовой точки. Основная нить и только она исполняет все последователь ные области секции программы.
Для поддержки параллелизма используется схема
FORK/JOIN.
При входе в параллельную область основная нить порождает дополнительные нити (выполняется операция FORK). После порождения дополнительные нити нумеруются последовательными натуральными числами, причем основная нить имеет номер 0; таким образом, каждая нить получает свой уникальный номер. Все порожденные нити выполняют одну и ту же программу, соответствующую параллельной области. При выходе из параллельной области основная нить дожидается завершения работы остальных нитей (выполняется операция JOIN), и дальнейшее выполнение программы осуществляется основной нитью.
В параллельной области все переменные в программе делятся на два класса:
1) общие (shared – разделяемые);
2) локальные (private – собственные).
Общие переменные существуют в одном экземпляре для всей программы и под одним и тем же именем доступны всем нитям. Объявление локальной переменной приводит к порождению многих экземпляров (по числу нитей) этой переменной под этим именем – по одному собственному экземпляру для каждой нити. Изменение какой-либо нитью значения своего экземпляра локальной переменной никак не влияет на изменение значений экземпляров этой переменной в других нитях.
Понятия областей программы
и классов переменных вместе с
порождением (расщеплением) и уничтожением
(соединением) нитей определяют общую
идею написания программы с
Все переменные окружения и функции, реализующие стандарт Open MP, начинаются с префикса OMP_.
Описание параллельных областей: для такого описания используются две директивы
!$OMP PARALLEL
< параллельная область программы >
!$OMP END PARALLEL
Для выполнения фрагмента программы, расположенного между данными директивами, основная нить порождает нити в количестве OMP_NUM_THREADS-1, где OMP_NUM_THREADS переменная окружения, значение которой пользователь задаёт перед запуском программы. Все порожденные нити исполняют программу, находящуюся между указанными директивами.
На директиве !$OMP END PARALLEL происходит неявная синхронизация нитей: сначала все нити достигают директиву!$OMP END PARALLEL, и лишь после этого происходит слияние всех нитей в основную нить, которая и продолжает процесс.
В параллельной области каждой
имеющейся нитью может быть порождена
параллельная секция (порождение нитью
параллельных нитей) и последующее
их соединение (с сохранением главенства
порождающей нити). Число нитей
в параллельной секции можно задавать
с помощью функции OMP_SET_NUM_
Необходимость порождения нитей и параллельного исполнения может определяться динамически в ходе исполнения программы с помощью условия IF:
!$OMP PARALLEL IF (< условие >).
Если < условие > не выполнено, то директива не выполняется и программа обрабатывается в прежнем режиме.
Распределение работы в Open MP можно проводить следующими способами:
1) программировать на низком уровне;
2) использовать директиву !$OMP DO для параллельного выполнения циклов;
3) использовать директиву!$OMP
SECTIONS для параллельного выполнения
независимых фрагментов
4) применить директиву !$OMP SINGLE для однократного выполнения участка программы.
Возможности Open MP.
1. Синхронизация. Для
2. Участок нити-мастера.
Фрагмент программы, который
!$OMP MASTER
<участок программы для нити-мастера>
!$OMP END MASTER
Остальные нити пропускают этот участок программы; синхронизация по умолчанию здесь не проводится.
3. Последовательное выполнение отдельного оператора. Директива !$OMP ATOMIC относится к непосредственно идущему за ней оператору, и её применение приводит к последовательному выполнению этого оператора всеми нитями. 4. Гарантированное поддержание когерентности. Вычислительная система может иметь сложную иерархию различных областей памяти, когерентность которых поддерживается автоматически. Однако, в некоторых случаях пользователь должен иметь особые гарантии того, что память, к которой он обращается, своевременно обновлена (синхронизирована). Для этого служит
Директива !$OMP FLASH[список переменных]
Применение этой директивы приводит к синхронизации перечисленных в списке переменных в том смысле, что все последние изменения этих переменных будут внесены во все их копии.
Стандарт MPI.Элементы идеологии стандарта MPI
Программа на алгоритмическом языке Фортран с использованием MPI имеет обычный вид, где об использовании MPI говорят только присутствующие в программе вызовы процедур стандарта MPI, оформленных как процедуры библиотеки mpif.h.
Основными понятиями MPI являются:
- процесс;
- группа процессов;
- коммуникатор.
Коммуникатор идентифицирует
группу процессов, которые с точки
зрения данного коммуникатора