close

Вход

Забыли?

вход по аккаунту

код для вставкиСкачать
Задание для контрольной работы по курсу
«Современные компьютерные технологии»
МТ-401
Задание 1.
Разработать программу на языке программирования «С» с применением
библиотеки MPI для приближенного вычисления определенного интеграла
b
 f ( x )dx
a
по методу прямоугольников на кластере из двух процессоров.
Выполнение задания включает:
a) вычисление интеграла по формуле Ньютона-Лейбница;
b) разработку параллельной программы на языке «С» с использованием
команд библиотеки WMPI 1.3 и распечатку листинга этой программы в
отчете по выполненному заданию;
c) в программу необходимо ввести функции для учета времени
выполнения всей программы, времени выполнения каждого процесса,
времени ожидания синхронизации процессов;
d) распечатку группового файла;
e) распечатку результатов работы программы.
Подынтегральная функция, промежуток интегрирования и количество
процессов задаются отдельно для каждого варианта в следующей таблице.
Вариант
1.
Интеграл
1.8
2.
dx
2
1
3
cos xdx
4
 2x
0.8
Количество
процессов
1.6
x
0.6
3.
4.
1.2
dx
0 2  x2
2.6

1
5.
1,3

0,5
xdx
x 3
dx
2
x 1
2
5
6
2
6.
2.5
dx
 x  1x  3
4
x 1
0.2 x  2 dx
3
1.5
7.
8.
2.4 2
2.4
 x  1sin xdx
5
1.6
9.
4
 tgxdx
7
2
10.
1.3

0.7
11.
1.8
2x2  0.3
xdx
2
3
 2x
0.8
12.
dx
6
3
1.6
 x sin xdx
4
0.6
13.
14.
15.
1.2
xdx
0 5  x4
2.6

1
1,3

xdx
x 3
dx
4
x  4x  5
2
0,5
16.
17.
18.
5
6
2
2.5
dx

1.5 x  1x  3
4
x 1
0.2 x4  1dx
3
2.4 2
2.4
 x  1e dx
x
5
1.6
19.
2
 ctgxdx
7
0.5
20.
1.3

0.7
dx
x2  2x  3
6
21.
22.
1.8
3x3dx
 2
0.8 x  1
3
1.6
x
cos x2dx
4
0.6
23.
24.
25.
1.2
x3dx
0 1  x2
2.6
xdx

27.
28.
29.
30.
x 3
dx
1
1,3

2
x  4x  6
2
2.5
x2dx

1.5 x  1x  3
4
x3  1
0.2 x2  2dx
3
2.4
4
 sin
2
xdx
5
3
xdx
7
2
4
 sin
2
1.3
dx
x2  6x  11

0.7
31.
6
4
0, 5
26.
5
1
6
4dx
 Pi
2
1
x
0
8
Пример выполнения задания 1, вариант 31.
Для приближенного вычисления определенного интеграла

∫ ()

используем квадратурную формулу с равноотстоящими узлами.
Пусть на отрезке [a,b] задана функция f(x). Введем сетку, разбивающую
отрезок на N+1 равностоящих узлов {xi: i=0,1,…,N}, где
xi + i * h и h = (b - a) / N,
a = x0 < x1 < x2 <…< xN-1 < xN = b.
Выберем на каждом сегменте серединную точку
i = xi-1 + h/2 (i=1,2,…,N).
Квадратурная формула прямоугольников имеет вид:


∫ () = ∑ (  ) ∗ ℎ

=1
Исходный код программы создавался в системе программирования Microsoft
Visual Studio 2008. Для использования команд WMPI 1.3 необходимо
произвести настройки среды программирования и настройки параметров
проекта следующим образом.
Настройка среды программирования:
1. Выбрать через меню Tools->Options->ProjectsSolution>VC++Directories-> "Show directories for"->"Library Files" . Добавить в
окне Directories путь до библиотеки wmpi.lib
2. В окне списка выбора "Show directories for" выбрать "Include Files" и
добавить в окне Directories путь до файла mpi.h.
Настройка параметров проекта:
1. Выбрать в свойствах проекта Configuratios Properties->General, в раздел
Character Set установить Not Set
2. На панели C/C++ диалогового окна настроек Project Settings выбрать
раздел Code Generation и выбрать в списке Runtime Library пункт
Multi-threaded DLL(/MD).
3. В окне настроек Project Settings, панель Linker, категория General
добавить путь к библиотекам WMPI в раздел "Additional library path".
Например, C:\WMPI1.3\lib\Console или $(WMPI_BASE)\lib\Console,
если переменная среды определена в Cвойства системы->
Дополнительно->Переменные среды.
4. В окне настроек Project Settings, панель Linker, категория Input (ввод),
добавить "cvwmpi.lib" к списку "Additional Dependencies".
Листинг программы.
#include <stdio.h>
#include "mpi.h"
#include <sys\timeb.h>
/****************************************************************
* compute_interval - numerical integration over
*
*
part of interval
*
****************************************************************/
double realtime(void);
double compute_interval (int myrank, int ntasks, long intervals)
{
double width, x, localsum;
long j;
width = 1.0 / intervals;
/* width of single stripe */
localsum = 0.0;
for (j = myrank; j < intervals; j += ntasks)
{
x = (j + 0.5) * width;
localsum += 4 / (1 + x * x);
}
return (localsum * width); /* size of area */
}
void main(int argc, char ** argv)
{
long intervals;
int myrank, ranksize;
double pi, di , send[2],recv[2];
int i;
MPI_Status status;
double t1,t2;
double t3, t4, t5, t6,t7;
t1=realtime();
MPI_Init (&argc, &argv);
/* initialize MPI system */
t2=realtime();
MPI_Comm_rank (MPI_COMM_WORLD, &myrank); /* my place in MPI system */
MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */
if (myrank == 0)
/* I am the master */
{
printf ("Calculation of PI by numerical Integration\n");
printf ("Number of intervals: ");
scanf ("%ld", &intervals);
}
MPI_Barrier (MPI_COMM_WORLD); /* make sure all MPI tasks are running */
if (myrank == 0)
/* I am the master */
{
/* distribute parameter */
printf ("Master: Sending # of intervals to MPI-Processes \n");
t3 = MPI_Wtime();
for (i = 1; i < ranksize; i++)
{
MPI_Send (&intervals, 1, MPI_LONG, i, 98, MPI_COMM_WORLD);
}
}
else{ /* I am a slave */
/* receive parameters */
MPI_Recv (&intervals, 1, MPI_LONG, 0, 98, MPI_COMM_WORLD, &status);
}
/* compute my portion of interval */
printf ("1_Slave: Sending # of intervals to MPI-Processes \n");
t4 = MPI_Wtime();
pi = compute_interval (myrank, ranksize, intervals);
t5 = MPI_Wtime();
MPI_Barrier (MPI_COMM_WORLD);
t6 = MPI_Wtime();
if (myrank == 0)
/* I am the master */
/* collect results, add up, and print results */
{
for (i = 1; i < ranksize; i++)
{
MPI_Recv (&di, 1, MPI_DOUBLE, i, 99, MPI_COMM_WORLD, &status);
pi += di;
}
t7 = MPI_Wtime();
printf ("Master: Has collected sum from MPI-Processes \n");
printf ("\nPi estimation: %.20lf\n", pi);
printf ("%ld tasks used - Execution time: %.3lf sec\n",ranksize, t7 -t3);
printf("\nStatistics:\n");
printf("Master: startup: %.0lf msec\n",t2-t1);
printf("Master: time to send # of intervals:%.3lf sec\n",t4-t3);
printf("Master: waiting time for sincro after calculation:%.2lf sec\n",t6-t5);
printf("Master: time to collect: %.3lf sec\n",t7-t6);
printf("Master: calculation time:%.3lf sec\n",t5-t4);
MPI_Barrier (MPI_COMM_WORLD);
/* collect there calculation time */
for (i = 1; i < ranksize; i++){
MPI_Recv (recv, 2, MPI_DOUBLE, i, 100, MPI_COMM_WORLD, &status);
printf("process %d: calculation time: %.3lf sec\twaiting time for sincro.:
%.3lf sec\n",i,recv[0],recv[1]);
}
}
else{ /* I am a slave */
/* send my result back to master */
printf ("2_Slave: Sending # of intervals to MPI-Processes \n");
MPI_Send (&pi, 1, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD);
MPI_Barrier (MPI_COMM_WORLD);
send[0]=t5-t4;
send[1]=t6-t5;
MPI_Send (send, 2, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD);
}
MPI_Finalize ();
}
double realtime()
/* returns time in seconds */
{
struct _timeb tp;
_ftime(&tp);
return((double)(tp.time)*1000+(double)(tp.millitm));
}
1. Выполняемый файл программы имеет имя Console_pi.exe.
2. Создаем текстовый файл Console_pi.pg.
local 2
192.168.0.3 5 \\Main\c\WMPI_Ex\Debug\Console_pi.exe
3. Записываем в командной строке (cmd, FAR) в активном каталоге,
содержащем эти файлы строку
>Console_pi.exe >rez.txt
Результаты работы программы:
Calculation of PI by numerical Integration
Number of intervals: 1000000
1_Slave: Sending # of intervals to MPI-Processes
2_Slave: Sending # of intervals to MPI-Processes
1_Slave: Sending # of intervals to MPI-Processes
2_Slave: Sending # of intervals to MPI-Processes
Calculation of PI by numerical Integration
Number of intervals: Master: Sending # of intervals to MPI-Processes
1_Slave: Sending # of intervals to MPI-Processes
Master: Has collected sum from MPI-Processes
Pi estimation: 3.14159265358988990000
8 tasks used - Execution time: 0.084 sec
Statistics:
Master: startup: 453 msec
Master: time to send # of intervals:0.059 sec
Master: waiting time for sincro after calculation:0.01 sec
Master: time to collect: 0.012 sec
Master: calculation time:0.006 sec
process 1: calculation time: 0.002 sec
waiting time for sincro.: 0.076 sec
process 2: calculation time: 0.002 sec
waiting time for sincro.: 0.070 sec
process 3: calculation time: 0.003 sec
waiting time for sincro.: 0.056 sec
process 4: calculation time: 0.002 sec
waiting time for sincro.: 0.062 sec
process 5: calculation time: 0.002 sec
waiting time for sincro.: 0.051 sec
process 6: calculation time: 0.002 sec
waiting time for sincro.: 0.034 sec
process 7: calculation time: 0.002 sec
waiting time for sincro.: 0.006 sec
1/--страниц
Пожаловаться на содержимое документа