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

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

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

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

ü  Получение количества запущенных процессов, получение процессом своего номера.

ü  Начало внешнего цикла.

ü  Инициализация переменных, содержащих значение интеграла на двух соседних итерациях (для проверки условия выхода).

ü  Инициализация генератора псевдослучайных чисел номером процесса и текущим временем.

ü  Вычисление шага, с которым ведется генерация чисел.

ü  Параллельный внутренний цикл, в котором вычисляется случайная точка, значение функции в этой точке и накапливается частичная сумма. В цикле каждый процесс совершает, в среднем, totpt / totproc итераций (totproc – количество запущенных процессов, totpt – количество генерируемых точек). В таблице 3.2.1 показан пример распределения итераций цикла по процессам для 6-ти процессорной группы (totproc = 6) и totpt = 20:

НЕ нашли? Не то? Что вы ищете?

Таблица 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 к количеству генерируемых точек. Здесь каждый процесс вычисляет интеграл на своем участке (частичный интеграл), а затем эти значения объединяются операцией редукции. Это позволяет, как и в предыдущем алгоритме, по мере уменьшения шага, добиваться равномерного распределения чисел по оси координат, а также точнее изучить поведение функции на узком интервале. Как следствие – увеличение сходимости метода, а также повышение точности вычислений.

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

ü  Получение количества запущенных процессов, получение процессом своего номера.

ü  Вычисление переменных, определяющих рабочие интервалы каждого процесса.

ü  Начало внешнего цикла.

ü  Инициализация переменных, содержащих значение интеграла на двух соседних итерациях (для проверки условия выхода).

ü  Инициализация генератора псевдослучайных чисел номером процесса и текущим временем.

ü  Вычисление шага, с которым ведется генерация чисел.

ü  Внутренний цикл, в котором вычисляется случайная точка, значение функции в этой точке и накапливается частичная сумма.

ü  Вычисление процессом частичного интеграла на узком промежутке.

ü  Увеличение числа генерируемых точек для следующего прохода внешнего цикла.

ü  Синхронизация всех процессов.

ü  Объединение частичных интегралов всех процессов.

ü  Синхронизация процессов.

ü  Широковещание из корневого процесса интеграла на 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/.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 <time. h>

#include <stdio. h>

#include <stdlib. h>

#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 г.

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

// Включения

#include <mpi. h>

#include "DataType. h"

#include "__MyHeader__.h"

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

// Константы

#define EPS_ERR 1 // Неккоректная величина абсолютной ошибки

#define TOTPT_MAX 1e30 // Максимально допустимое число точек

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

// Поверхность

FUNC_TYPE Surf (ARG_TYPE x, ARG_TYPE y);

// Границы у-правильной области, т. е. bot(x) и top(x)

FUNC_TYPE bot (ARG_TYPE arg); // Нижняя граница

FUNC_TYPE top (ARG_TYPE arg); // Верхняя граница

// Подынтегральная функция для 1-кратного интеграла

FUNC_TYPE f (ARG_TYPE arg);

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

// Интерфейсы функций

FUNC_TYPE Integral1DSF

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-4);

// Рассчет 1-кратного интеграла по формуле парабол (Симпсона)

/* Использовалась для сравнения со значениями, полученными методом Монте-Карло */

// П Р О Т Е С Т И Р О В А Н А! ! ! – 22.05.04 г.

FUNC_TYPE Integral1DMK

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-3,

PTCOUNT totpt = 100, ULONG mult = 2);

// Вычисление 1-кратного интеграла методом Монте-Карло

// Вариант со средним значением функции

// П Р О Т Е С Т И Р О В А Н А! ! ! – 25.05.04 г.

FUNC_TYPE Integral1DMK_par

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-3,

PTCOUNT totpt = 100, ULONG mult = 2);

// Вычисление 1-кратного интеграла методом Монте-Карло на кластере MPI

// Вариант со средним значением функции

// П Р О Т Е С Т И Р О В А Н А

// НА КЛАСТЕРЕ! ! ! – 26.05.04 г.

FUNC_TYPE Integral1DMK_par1

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-3,

PTCOUNT totpt = 100, ULONG mult = 2);

/* Вычисление 1-кратного интеграла методом Монте-Карло на кластере MPI. Вариант со средним значением функции. Каждый процесс работает в более узком диапазоне, чем первоначальный */

// П Р О Т Е С Т И Р О В А Н А

// НА КЛАСТЕРЕ! ! ! – 26.05.04 г.

FUNC_TYPE Integral1DMK_par2

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-3,

PTCOUNT totpt = 100, ULONG mult = 2);

/* Вычисление 1-кратного интеграла методом Монте-Карло на кластере MPI. Вариант со средним значением функции. Каждый процесс работает в более узком диапазоне, чем начальный. Операция редукции проводится однажды, когда каждый процесс подсчитал интеграл на своем узком участке */

// П Р О Т Е С Т И Р О В А Н А

// НА КЛАСТЕРЕ! ! ! – 26.05.04 г.

UFUNC_TYPE Square

(CURVLINE f, LIMIT left, LIMIT right, ERR_T eps = 1e-4);

/* Вычисление площади под кривой f(x). Используется формула Симпсона */

// П Р О Т Е С Т И Р О В А Н А! ! ! – 24.05.04 г.

inline UFUNC_TYPE RegionY

(CURVLINE bottom, CURVLINE top, LIMIT left,

LIMIT right, unsigned char var, ERR_T eps = 1e-4)

/* Вычисление площади между кривыми bottom(x) и top(x). Кривые сшиваются в точках left и right */

// П Р О Т Е С Т И Р О В А Н А! ! ! – 25.05.04 г.

{

// var определяет случай вычисления площади области

switch (var) {

// Кривые top и bottom лежат в положительной полуоси

case 1: return Square(top, left, right, eps) –

Square(bottom, left, right, eps);

break;

// Кривые top и bottom лежат в отрицательной полуоси

case 2: return Square(bottom, left, right, eps) –

Square(top, left, right, eps);

break;

// Кривая top лежит в положительной полуоси

// кривая bottom лежит в отрицательной полуоси

case 3: return Square(top, left, right, eps) +

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4