Вычисление двойного интеграла c использованием средств параллельного программирования MPI

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

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 21.07.2012
Размер файла 2,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Вятский государственный университет

Факультет автоматики и вычислительной техники

Кафедра электронных вычислительных машин

Отчет по лабораторной работе №8

по дисциплине:

Вычислительные машины, комплексы и системы

Тема:

Вычисление двойного интеграла c использованием средств параллельного программирования MPI

Выполнил студент группы ВМ-41

Проверил: преподаватель кафедры ЭВМ

Мельцов В.Ю.

Киров 2012

Постановка задачи:

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

Краткие теоретические сведения:

Двойные интегралы обладают такими же свойствами, как и определённые интегралы (линейность, аддитивность, формулы среднего значения и т.д.).

Двойной интеграл в декартовых координатах

Пусть функция  определена и непрерывна в замкнутой ограниченной области D плоскости 0xy.

Разобьём область D произвольным образом на элементарные ячейки , в каждой из которых зафиксируем точку:

.

Составим сумму:

,

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

Если существует предел последовательности интегральных сумм  при -диаметр ячеек  и этот предел не зависит ни от способа разбиения области D на элементарные ячейки, ни от выбора точек , то он называется двойным интегралом от функции f(x,y) по области D и обозначается .

Листинг программы:

#include <iostream>

#include <ctime>

#include "mpi.h"

using namespace std;

//----------------- Эта функция считает значение функции

5*X^2*Y+2*Y^3

double Func ( double X , double Y )

{

return ( 5*X*X*Y-2*Y*Y*Y );

}

//------- Эта функция возвращает случайное число в диапозоне от 0 до 1

double GetRandom ()

{

return (double) rand ()/RAND_MAX;

}

//----------------- Эта функция считает интеграл --------------------

double DoubleIntegrall ( long long N , // Количество отрезков

интегрирования

double AX , double BX ,// Интервал откуда берем случайные значения

для X

double AY , double BY )// Интервал откуда берем случайные значения

для Y

{

double HX = BX-AX , HY = BY-AY ,x, y, f = 0;

long long i;

for ( i=0; i<N; i++ )

{

x = (double) ( GetRandom ()*HX + AX );

y = (double) ( GetRandom ()*HY + AY );

f =+ Func ( x , y );

}

return ( HX*HY*f/N );

}

//------------------- MAIN -------------------------------

int main(int argc, char *argv[])

{

int My_Rank; /* ранг текущего процесса */

int NumProcs; /* общее число процессов */

double AX , AY; /* левый конец интервала */

double BX , BY; /* правый конец интервала */

long long N; /* число точек разбиения */

double LenX; /*LenY; /* длина отрезка интегрирования для текущего

процесса*/

double Local_AX , Local_AY;/* левый конец интервала для текущего

процесса */

double Local_BX , Local_BY; /* правый конец интервала для текущего

процесса */

long long Local_N; /* число точек разбиения для текущего процесса */

double Local_Res;/* значение интеграла в текущем процессе */

double Result; /* результат интегрирования */

double WTime; /* время работы программы */

/* Инициализация ГСЧ */

srand ( ( unsigned ) time ( NULL ) );

/* Начать работу с MPI */

MPI_Init(&argc, &argv);

cout.setf(ios::fixed);

cout.precision(0);

/* Получить номер текущего процесса в группе всех процессов */

MPI_Comm_rank(MPI_COMM_WORLD, &My_Rank);

/* Получить общее количество запущенных процессов */

MPI_Comm_size(MPI_COMM_WORLD, &NumProcs);

/* Получить данные */

if (My_Rank == 0)

{

cout << "Input initial X: ";

cin >> AX;

cout << "Input final X: ";

cin >> BX;

cout << "Input initial Y: ";

cin >> AY;

cout << "Input final Y: ";

cin >> BY;

cout << "Input number of random value: ";

cin >> N;

}

/* Рассылаем данные из процесса 0 остальным */

MPI_Bcast(&AX, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);

MPI_Bcast(&BX, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);

MPI_Bcast(&AY, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);

MPI_Bcast(&BY, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);

MPI_Bcast(&N, 1, MPI_LONG_LONG, 0, MPI_COMM_WORLD);

/* Синхронизация процессов */

MPI_Barrier(MPI_COMM_WORLD);

/* Запускаем таймер */

WTime = MPI_Wtime();

/* Вычисляем отрезок интегрирования для текущего процесса */

LenX = (BX-AX)/NumProcs;

LenY = (BY-AY)/NumProcs;

Local_N = N/NumProcs;

Local_AX = AX + My_Rank*LenX;

Local_BX = Local_AX + LenX;

Local_AY = AY + My_Rank*LenY;

Local_BY = Local_AY + LenY;

/* Вычислить интеграл на каждом из процессов */

Local_Res = DoubleIntegrall (Local_N, Local_AX, Local_BX, Local_AY,

Local_BY);

/* Сложить все ответы и передать процессу 0 */

MPI_Reduce(&Local_Res, &Result, 1, MPI_DOUBLE, MPI_SUM, 0,

MPI_COMM_WORLD);

/* Синхронизация процессов */

MPI_Barrier(MPI_COMM_WORLD);

/* Вычисляем время работы */

WTime = MPI_Wtime() - WTime;

/* Напечатать ответ */

if (My_Rank == 0)

{

cout << "Integral X:[ " << AX << ";" << BX

<< "] Y:[ " << AY << ";" << BY << "] = ";

cout.setf(ios::fixed);

cout.precision(16);

cout << "Result: " << Result << endl;

cout << "Working time: " << WTime;

cin.get();

}

/* Заканчиваем работу с MPI */

MPI_Finalize();

двойной интеграл параллельный программирование

return 0;

}

Программа выполнялась на одном и двух узлах, содержащих по два четырехядерных процессора. Результаты работы программы на одном узле представлены в таблице 1 и на рисунке 1:

Таблица 1

Результаты работы программы

Кол-во входных значений Кол-во потоков

1

2

4

8

16

9000

0.0007537975907326

0.0004366477951407

0.0002305461093783

0.0001368187367916

0.0013112705200911

90000

0.0075306361541152

0.0041533205658197

0.0020909076556563

0.0010627051815391

0.0012023178860545

900000

0.0747467903420329

0.0415767226368189

0.0205570114776492

0.0104573350399733

0.0158112971112132

9000000

0.6697816345840693

0.3893552813678980

0.2064179945737124

0.1102980962023139

0.1532170288264751

90000000

6.4390025129541755

3.5495505714789033

1.7656840458512306

0.9044017465785146

0.9163652779534459

Рисунок 1 - Результаты работы программы на одном узле

Результаты работы программы на двух узлах представлены в таблице 2 и на рисунке 2:

Таблица 2

Результаты работы программы

Кол-во входных значений / Кол-во потоков

1

2

4

8

16

9000

0.0007815938442945

0.0004680063575506

0.0002564573660493

0.0001599360257387

0.0001156572252512

90000

0.0074913846328855

0.0047103753313422

0.0021183555945754

0.0011150157079101

0.0005718600004911

900000

0.0757572539150715

0.0415737889707088

0.0208176597952843

0.0104006938636303

0.0052353022620082

9000000

0.6576117919757962

0.3760839011520147

0.1871296493336558

0.1041500391438603

0.0524644199758768

90000000

6.4406823348253965

3.5316434074193239

1.7737049683928490

0.8969459105283022

1.0058119120076299

Рисунок 2 - Результаты работы программы на двух узлах

Таблица 3

Результаты работы программы на одном узле

Кол-во входных данных

1 поток

2 потока

4 потока

время

время

ускорение

время

ускорение

9000

0,0007537975

0,0004366477

0,0003171498

0,0002305461

0,0002061016

90000

0,0075306361

0,0041533205

0,0033773156

0,0020909073

0,0020624129

900000

0,0747467903

0,0415767226

0,0331700677

0,0205570114

0,0210197111

9000000

0,6697816345

0,3893552813

0,2804263532

0,2064179945

0,1829372867

90000000

6,4390025129

3,5495505714

2,8894519415

1,7656840458

1,7838665256

8 потоков

16 потоков

время

ускорение

время

ускорение

9000

0,0001368187

0,0000937273

0,0013112705

-0,0011744517

90000

0,0010627051

0,0010282024

0,0012023178

-0,0001396127

900000

0,0104573350

0,0100996764

0,0158112971

-0,0053539620

9000000

0,1102980962

0,0961198983

0,1532170288

-0,0429189326

90000000

0,9044017465

0,8612822992

0,9163652779

-0,0119635313

Таблица 4

Результаты работы программы на двух узлах

Кол-во входных данных

1 поток

2 потока

4 потока

время

время

ускорение

время

ускорение

9000

0,00078159384

0,00046800635

0,0003135875

0,00025645736

0,0002115490

90000

0,00749138463

0,00471037533

0,0027810093

0,00211835559

0,0025920197

900000

0,07575725391

0,04157378897

0,0341834649

0,02081765979

0,0207561292

9000000

0,65761179197

0,37608390115

0,2815278908

0,18712964933

0,1889542518

90000000

6,44068233482

3,53164340741

2,9090389274

1,77370496839

1,7579384390

8 потоков

16 потоков

время

ускорение

время

ускорение

9000

0,00015993602

0,0000965213

0,00011565722

0,0000442788

90000

0,00111501570

0,0010033399

0,00057186000

0,0005431557

900000

0,01040069386

0,0104169659

0,00523530226

0,0051653916

9000000

0,10415003914

0,0829796102

0,05246441997

0,0516856192

90000000

0,89694591052

0,8767590579

1,00581191200

-0,1088660015

Выводы

На основе результатов работы программы можно сделать следующие выводы:

ѕ Использование двух потоков для решения данной задачи, уменьшает время ее выполнения в два раза, так как количество входных значений на интервале разделяется между двумя ядрами;

ѕ При небольшом значении входных данных (n=9000) увеличение потоков с 1 до 8, дает выигрыш во времени примерно в 7 раз;

ѕ Данная задача выполнялась на узле, содержащем два четырехядерных процессора, поэтому при увеличении потоков до 16 происходит незначительное уменьшение времени решения данной задачи, так как в данном случае на каждое ядро процессора приходится по 2 потока;

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.