Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВС13 / ЛабРаб / Диплом.doc
Скачиваний:
36
Добавлен:
17.03.2015
Размер:
1.48 Mб
Скачать

2.2 Структура программы с двухточечным обменом данными между процессами

Рассмотрим простейший случай взаимодействия параллельных ветвей задачи, так называемый двухточечный обмен данными.

“Для начала необходимо отметить несколько важных моментов:

  1. Все функции и идентификаторы в MPI начинаются с префикса MPI_.

  2. Программа пишется на языке C++ и компилируется в системе Microsoft Visual C++ 6.0. (в связи с использованием здесь пакета WMPI 1.3, но возможны и другие компиляторы после соответствующей настройки). Настройка проекта для подготовки и компиляции задачи с применением библиотеки Mpi.h, рассматривается ниже.

  3. Создаётся единый текст программы для всех ветвей задачи. После компиляции создаётся единый код для всех процессов, которые будут запущены.

  4. При запуске программы на исполнение, пользователь может запустить любое число процессов, в пределах введённого в конкретной системе ограничения.

  5. Каждый процесс запускается с единым программным кодом, но со своей копией данных. Т.е. все процессы имеют единый набор команд, единый набор данных, но для каждого процесса создаётся своя копия набора команд и своя копия набора данных. Например, если в программе описана переменная X, то для каждого процесса будет создана своя копия переменной X.

  6. Для того чтобы каждый процесс выполнял только свою часть задачи, существует система нумерации процессов в задаче. Все процессы делятся на группы, каждому процессу группы присваивается свой индивидуальный номер. Получить номер процесса можно с помощью функции MPI_Comm_rank. Используя свой номер, процесс может выполнять те или иные действия. Выполнение действий процесса в зависимости от его номера закладывается программистом.

  7. Нумерация процессов всегда начинается с 0.

  8. Библиотека MPI инициализируется функцией MPI_Init, при выходе из программы всегда необходимо выполнять функцию MPI_Finalize.”[14]

Теперь рассмотрим основные алгоритмы используемые в параллельном программировании.

2.3 Алгоритмы

2.3.1 Вычисление частных сумм последовательности числовых значений

Рассмотрим для первоначального ознакомления со способами построения и анализа параллельных методов вычислений сравнительно простую задачу нахождения частных сумм последовательности числовых значений

, где n  есть количество суммируемых значений (данная задача известна также под названием prefix sum problem).

Традиционный алгоритм для решения этой задачи состоит в последовательном суммировании элементов числового набора

Последовательная вычислительная схема данного алгоритма может быть представлена следующим образом [13] (см. рис. 3.1):

Рис. 3.1. Последовательная вычислительная схема алгоритма суммирования

Для возможности параллельной работы алгоритм следует модифицировать. Для этого сгруппируем данные в зависимости от количества запущенных процессов p. Каждая группа будет состоять из k = n/p элементов, где k – целое число. Если k получается не целое, то оно округляется до целого, а не вошедшие в группу элементы входят в группу к 0-му процессу. Сгруппированные данные направляются каждому процессу на обработку. В результате вычислений, каждый процесс возвращает свой результат суммирования элементов, которые объединяются в итоговое значение суммы (см. рис. 3.2). Для реализации алгоритма воспользуемся моделью SIMD.

Рис. 3.2. Модифицированная схема суммирования

Вычислим эффективность алгоритма частных сумм. По закону Амдала ускорение можно определить следующим образом

, , W = n -1.