Вычисление двойного интеграла 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
Подобные документы
Оценка временной сложности алгоритма. Механизм сортировки пузырьком и вставками. Основные положения технологии параллельного программирования Ореn MР. Оценка временной сложности некоторых классов алгоритма с помощью параллельного программирования.
дипломная работа [1,7 M], добавлен 27.10.2017Метод хорд решения нелинейных уравнений. Вычисление интеграла методом Симпсона. Процесс численного решения уравнения. Окно программы расчета корней уравнения методом хорд. Алгоритм вычисления интеграла в виде блок-схемы. Выбор алгоритма для вычислений.
курсовая работа [832,6 K], добавлен 24.07.2012Разработка программного обеспечения, эффективно использующего вычислительные ресурсы за счет одновременного исполнения кода на нескольких вычислительных узлах. Обзор компании Intel в использовании инструментов и языков параллельного программирования.
реферат [1,7 M], добавлен 25.12.2011Расчет трансформатора питания. Численное решение нелинейных уравнений с заданной точностью и дифференциальных уравнений первого порядка. Разработка программы с использованием средств визуального программирования на алгоритмическом языке программирования.
курсовая работа [1,2 M], добавлен 17.08.2013Разработка программы нахождения значения определенного интеграла с помощью метода трапеций. Оценка абсолютной погрешности метода. Использование среды программирования Visual Studio Community 2015 для написания программы. Работа с графическим интерфейсом.
курсовая работа [573,8 K], добавлен 17.03.2016Основные направления развития параллелизма, модели параллельного программирования. Автоматические средства разработки параллельного ПО, анализ последовательной программы. Разработка системы автоматического распараллеливания программ на языке Fortran77.
дипломная работа [57,7 K], добавлен 14.10.2010Постановка задачи и математическое описание ее решения. Назначение программного обеспечения. Описание принятых идентификаторов. Выбор языка программирования и написание программы на входном языке. Методика отладки программы и проведение ее тестирования.
курсовая работа [96,1 K], добавлен 25.06.2013Создание приложения, демонстрирующего решение нелинейного уравнения методом хорд, вычисление интеграла методом Симпсона. Характеристика системы программирования. Разработка мощных систем для работы с локальными и удаленными базами данных с помощью Delphi.
дипломная работа [846,0 K], добавлен 22.09.2012Создание программного модуля для вычисления интеграла по формулам трапеции и Симпсона, определяя шаг интегрирования по оценке остаточного члена. Для разработки используется табличный процессор Excel и язык программирования Visual Basic for Application.
курсовая работа [159,7 K], добавлен 30.08.2010Изучение средств распараллеливания, предоставляемых технологиями OpenMP. Исследование синтаксиса и семантики функций технологии OpenMP на языке программирования Visual C++). Проектирование интерфейса пользователя для взаимодействия с программой.
контрольная работа [773,9 K], добавлен 12.07.2015