grandov.ru страница 1
скачать файл

Задание для контрольной работы по курсу
«Современные компьютерные технологии»

МТ-401




Задание 1.


Разработать программу на языке программирования «С» с применением библиотеки MPI для приближенного вычисления определенного интеграла

по методу прямоугольников на кластере из двух процессоров.



Выполнение задания включает:

  1. вычисление интеграла по формуле Ньютона-Лейбница;

  2. разработку параллельной программы на языке «С» с использованием команд библиотеки WMPI 1.3 и распечатку листинга этой программы в отчете по выполненному заданию;

  3. в программу необходимо ввести функции для учета времени выполнения всей программы, времени выполнения каждого процесса, времени ожидания синхронизации процессов;

  4. распечатку группового файла;

  5. распечатку результатов работы программы.

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



Вариант

Интеграл

Количество процессов





3





4





5





6





2





4





3





5





7





6





3





4





5





6





2





4





3





5





7





6





3





4





5





6





2





4





3





5





7





6





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).



Квадратурная формула прямоугольников имеет вид:


Исходный код программы создавался в системе программирования 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

#include "mpi.h"

#include

/****************************************************************

* 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

скачать файл



Смотрите также:
Задание для контрольной работы по курсу «Современные компьютерные технологии» мт-401 Задание 1
73kb.
Контрольное задание по курсу «локальные и глобальные компьютерные сети» для студентов заочного факультета, обучающихся по специальности 060800. А. В. Жеребцова, А. А. Захаров, Д. М. Созиев. Спбгут. Сп
141.62kb.
Задания для контрольной работы
30.13kb.
Школьная олимпиада по биологии. 6 класс. Задание 1
104.99kb.
Задания по биологии для проведения олимпиады «Абитуриент кгту» для учащихся 11 классов (I тур) Задание 1
79.71kb.
Предсказание генов во фрагменте генома бактерии Yersinia bercovieri. Задание 1
17.48kb.
Xii международная олимпиада «Эрудит» История 6 класс 1 тур Сурмятова Элеонора Задание 1
58.2kb.
Задание №1. (10 баллов)
262.79kb.
Эрудицион. Решаем задания по еге. Теоретические основы органической химии. 11 группа
51.11kb.
Тестовые вопросы для 8 класса Задание № Задание включает 20 вопросов, к каждому из них предложено 3 варианта ответа. На каждый вопрос выберите только один ответ, который вы считаете наиболее полным и правильным
41.61kb.
Программа курса и методические указания по выполнению контрольной работы для студентов заочной формы обучения технических
789.95kb.
Семинар «Логарифмическая функция». Цели: Систематизировать знания учащихся по теме «Логарифмическая функция»
72.95kb.