Курсовая работа - страница 3

Чтобы свести обмен сообщениями к минимуму можно каждому вычислителю предоставить свой генератор случайных (псевдослучайных) чисел. Кроме того, генератором и вычислителем может быть один и тот же процесс. Кроме того, в одном, главном процессе могут быть объединены генератор, вычислитель и анализатор. Именно такая схема и была реализована в работе. Графически она изображена на рис. 3.2.2:














Генератор

+

Вычислитель

В работе были разработаны и реализованы три параллельных алгоритма вычисления однократных интегралов методом Монте-Карло на кластере MPI, основанные на модели рис. 3.2.2.

Все три алгоритма базируются на использовании трех функций MPI [9]:

  1. MPI_BARRIER (comm): входной параметр comm (тип – дескриптор) является коммуникатором группы, в которой выполняется коллективная операция. Эта функция – функция барьерной синхронизации, блокирует вызывающий ее процесс, пока все процессы группы не вызовут функцию. В каждом процессе управление возвращается только тогда, когда все процессы в группе вызовут MPI_BARRIER.

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

  1. ^ MPI_REDUCE (sendbuf, recvbuf, count, datatype, op, root, comm): входной параметр sendbuf (тип – альтернатива) содержит адрес буфера посылки; recvbuf (тип – альтернатива) содержит адрес принимающего буфера (используется только корневым процессом); count (тип – целое) количество элементов в посылающем буфере; datatype (тип – дескриптор) тип данных буфера посылки; op (тип – дескриптор) содержит операцию редукции; root (тип – целое) номер главного процесса; comm (тип – дескриптор) коммуникатор группы, в которой выполняется коллективная операция. Функция MPI_REDUCE объединяет элементы входного буфера каждого процесса, используя операцию op, и возвращает объединенное значение в выходной буфер процесса с номером root.

  2. ^ MPI_BCAST (buffer, count, datatype, root, comm): двусторонний (входной/выходной) параметр buffer (тип – альтернатива) содержит адрес начала буфера посылки/приема; входной параметр count (тип – целое) содержит количество записей в буфере; входной параметр datatype (тип – дескриптор) описывает тип данных в буфере; входной параметр root (тип – целое) содержит номер корневого процесса; входной параметр comm (тип – дескриптор) является коммуникатором группы, в которой выполняется коллективная операция. Функция широковещательной передачи MPI_BCAST посылает сообщение из корневого процесса всем процессам группы, включая себя. Она вызывается всеми процессами группы с одинаковыми аргументами для comm, root. В момент возврата управления содержимое корневого буфера обмена будет уже скопировано во все процессы.

Интерфейсы функций (Integral1DMK_par(…), Integral1DMK_par1(…), Integral1DMK_par2(…)), реализующих все три алгоритма приведены в приложении 3, а их реализации – в приложении 4.

Рассмотрим все три алгоритма.

1. Алгоритм, в основе которого лежит скалярный параллелизм, т.е. распараллеливание цикла, реализован в функции Integral1DMK_par(…). В этом алгоритме генерация чисел осуществляется с некоторым шагом равным отношению интервала интегрирования к количеству генерируемых точек. Это позволяет, по мере уменьшения шага, добиваться равномерного распределения чисел по оси координат. Как следствие – увеличение сходимости метода, а также повышение точности вычислений.

В этом алгоритме каждый процесс выполняет следующие основные шаги:

Таблица 3.2.1.

Процессы




0

1

2

3

4

5

Итерации

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

-

-

-

-

2. Алгоритм, в основе которого лежит идея сужения интервала интегрирования для каждого процесса (процессорный интервал), реализован в функции Integral1DMK_par1(…). В этом алгоритме, как и в предыдущем, генерация чисел осуществляется с некоторым шагом равным отношению интервала интегрирования L к количеству генерируемых точек. Здесь каждый процесс вычисляет интеграл на своем участке (частичный интеграл), а затем эти значения объединяются операцией редукции. Это позволяет, как и в предыдущем алгоритме, по мере уменьшения шага, добиваться равномерного распределения чисел по оси координат, а также точнее изучить поведение функции на узком интервале. Как следствие – увеличение сходимости метода, а также повышение точности вычислений.

В этом алгоритме каждый процесс выполняет следующие основные шаги:

3. Алгоритм, в основе которого лежит идея сужения интервала интегрирования для каждого процесса и вычисление полного интеграла на этом участке, реализован в функции Integral1DMK_par2(…). В этом алгоритме, как и в предыдущих, генерация чисел осуществляется с некоторым шагом равным отношению интервала интегрирования L к количеству генерируемых точек. Здесь каждый процесс вычисляет интеграл на своем участке до тех пор, пока не получит значения с заданной точностью, а затем эти значения объединяются операцией редукции после завершения внешнего цикла. Это позволяет, как и в предыдущих алгоритмах по мере уменьшения шага, добиваться равномерного распределения чисел по оси координат, а также точнее изучить поведение функции на узком интервале. Кроме того, обмен сообщениями осуществляется только один раз. Как следствие – увеличение сходимости метода, повышение точности вычислений и уменьшение времени вычислений на некоторых классах функций.

В этом алгоритме каждый процесс выполняет следующие основные шаги:

Временные диаграммы синхронных вычислительных процессов с независимыми ветвями приведены на рис. 3.2.3.

Еще раз подчеркнем, что для увеличения сходимости метода существенную роль играет, состав последовательности псевдослучайных чисел или, иными словами, ее качество.






Рис. 3.2.3



3.3. Эксперимент. Анализ эффективности

некоторых из реализованных алгоритмов


Были проведены исследования эффективности разработанных алгоритмов на кластере MPI, с компонентами: процессор – Pentium 1 Ггц, ОЗУ – 128 Мб, сеть – Fast Ethernet.

В экспериментах тестировалась подынтегральная функция . Пределы интегрирования составляли a = 0, b = 1e6. По результатам тестирования были получены кривые 3.3.1 и 3.3.2.

В таблице 3.3.1 приведены результаты тестирования алгоритмов на различных функциях. Сравнивались результаты вычисления на 1 и 5 процессорных системах

Таблица 3.3.1

Функция

a

b

t, с (1 проц.)

t, с (5 проц.)




2

4

0,001784

0,007947

sinx/x

0,0000001

1

0,000555

0,002694

x3

-100

100

75,140435

7,556625




0

3

39,392135

15,766564




0

100000

6,454987

2,638202

100

-0,0010000

1000

0,004833

0,00334




0

1000000

131,795787

20,773000










По результатам экспериментов были сделаны следующие выводы:

1. Алгоритм 1 работает наиболее эффективно со сложными функциями в широком диапазоне L. В то время как остальные заметно уступают ему в работе с такими функциями.

2. Для небольших функций в небольших пределах L 3-ий алгоритм работают быстрее других, т.к. содержит только одну операцию обмена данными. Для того же класса функций 1-ый алгоритм проигрывает, т.к. время, затраченное на обмен данными оказывается больше времени вычислений.

Таким образом, для вычислений интегралов могут быть использованы все три алгоритма – в зависимости от класса функции и пределов интегрирования.

ЗАКЛЮЧЕНИЕ

В заключении хотим отметить следующее.

1. Полученные алгоритмы легко обобщаются на случай многомерных пространств. Это осуществляется путем генерации в функции чисел, отвечающих за нужную координату. Так, в приложениях 3, 4 приведены тексты функций, реализующих вычисление двойных интегралов на последовательной и параллельной ЭВМ.

2. Для вычисления n-кратного интеграла необходимо знать величину n-1-кратного интеграла. Поэтому при расчете интегралов высокой кратности необходимо рассчитывать распределение вычислений по процессам особенно тщательно. Для решения этой проблемы в MPI предусмотрены виртуальная топология, группы, коммуникаторы.

3. Вследствие низкой сходимости метода Монте-Карло целесообразно применять его только при расчетах интегралов кратности 2 и выше.

ЛИТЕРАТУРА


  1. Бахвалов Н.С. Численные методы. – М.: «Наука», 1975. – 631 с.

  2. Грэхем Р., Кнут Д., Паташник О. Конкретная математика. – М.: «Мир», 1998. – 703 с.

  3. Демидович Б.П. Сборник задач и упражнений по математическому анализу. – М.: «Наука», 1972. – 544 с.

  4. Демидович Б.П., Марон И.А. Основы вычислительной математики. – М.: «Наука», 1966. – 664 с.

  5. Информатика. Энциклопедический словарь для начинающих. – М.: «Педагогика-пресс», 1994. – 349 с.

  6. Костевич Л.С., Лапко А.А. Теория игр. Исследование операций. – Мн.: «Вышэйшая школа», 1982. – 210 с.

  7. Куст Ю., Юмагулов М. Математика. Основы математического анализа. – М.: «Айрис Пресс», 1999. – 270 с.

  8. Шпаковский Г.И. Организация параллельных ЭВМ и суперскалярных процессоров. – Мн.: БГУ, 1996. – 283 с.

  9. Шпаковский Г.И., Серикова Н.В. Программирование для многопроцессорных систем в стандарте MPI. – Мн.: БГУ, 2002. – 324 с.

  10. Что такое Beowulf? (http://acdwp.narod.ru/la/podr/05020010.htm).

ПРИЛОЖЕНИЕ 1


// Файл DataType.h

// Содержит определенные и используемые в работе типы данных

// 20.05.04 г.


// Целые знаковые и беззнаковые

typedef unsigned int CODE_ERR; // Тип для возврата результата-ошибки

typedef unsigned int UINT; // Тип для счетчиков

typedef unsigned long int ULONG; // Тип для счетчиков


// Вещественные знаковые и беззнаковые

typedef float PTCOUNT; // Хранит кол-во точек

typedef long double LIMIT; // Тип для границ диапазона

typedef long double FUNC_TYPE; /* Тип результата подынтегральной функции */

typedef long double ARG_TYPE; // Тип для аргументов функций

typedef unsigned long double UFUNC_TYPE; // Тип для площади

typedef unsigned long double ERR_T; // Тип для точности


// Указатели на функции

typedef FUNC_TYPE (*SURF) (ARG_TYPE, ARG_TYPE); /* Функция двух аргументов */

typedef FUNC_TYPE (*CURVLINE) (ARG_TYPE); // Функция одного аргумента.

ПРИЛОЖЕНИЕ 2


// __MyHeader__.h

// Инлайн реализации вспомогательных функций

// Последние изменения 20 мая 2004 г.

///////////////////////////////////////////////////////////////////////////////////////////////////////////

// Включения

#include

#include

#include

#include "DataType.h"

///////////////////////////////////////////////////////////////////////////////////////////////

inline CODE_ERR TotTimePrint

(clock_t start, clock_t stop, FILE *fp, char mode = 'f')

/* Инлайн функция печатает в файл (по умолчанию) или на дисплей (mode == 'd') время в минутах и секундах между отметками start и stop, полученными с помощью функции clock(). При этом, если время меньше 1 секунды функция выводит, что общее время выполнения чего-либо – < 1 sec. Возвращает код ошибки: "0" – если ошибок нет, "−1" – если значения start и/или stop – ошибочные или указан несуществующий режим */

{

if (start < 0 || stop < 0) return −1;

// Подсчитываем время выполнения

clock_t t = (stop-start) / CLK_TCK;

switch (mode) {

case 'f': // Печать в файл

if (t < 1) fprintf (fp, "Total time < 1 sec\n");

else fprintf (fp, "Total time = %d sec (%d min %d

sec)\n", t, t/60, (t - (t/60)*60));

break;

case 'd': // Печать на экран

if (t < 1) printf ("Total time < 1 sec\n");

else printf ("Total time = %d sec (%d min %d sec)\n",

t, t/60, (t - (t/60)*60));

break;

default:

return −1;

break;

}

return 0;

}


inline long double random (LIMIT left, LIMIT right)

/*Инлайн функция возвращает случайное число в интервале от left до right */

{ return ((long double)rand()) * (right-left) / RAND_MAX + left; }

ПРИЛОЖЕНИЕ 3


// Файл IntegralMK.h

/* Описания функций для подсчета интегралов методом Монте-Карло */

// 4 мая 2004 г. – 25 мая 2004 г.

///////////////////////////////////////////////////////////////////////////////////////////////

// Включения

1848182585952038.html
1848285189896463.html
1848403613371643.html
1848525581077837.html
1848769831952841.html