Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторна робота №7
Тема: MPI-програма обчислення визначеного iнтеграла.
Мета роботи: розробити за допомогою MPI програму для обчислення визначеного iнтеграла на многопроцессорной системi.
Теоретичнi вiдомостi
Виконаємо розробку MPI-версiї розглянутої ранiше програми обчислення визначеного iнтегралу. Задача полягає в розподiлi обчислення IN на необхiднiй кiлькостi процесорiв. Нехай ми маємо необмежене число процесорiв, тодi розiбємо вихiдну задачу на елементарнi:
Ij = f(xj + 0.5h)h, j=1,N (7.1)
i назначимо j-ту задачу на один процесор, всього буде задiяно N процесорiв. Обчислення можна вести в наступний спосiб:
Однак, так як кiлькiсть процесорiв обмежена, то кожен процесор буде обчислювати часткову суму за допомогою наступного фрагменту:
for(j = k; j < N; j +=M)
{
Ik = Ik+ f (xj +0.5∗h)∗h
}
де k - номер процесору, M - кiлькiсть процесорiв, N - кiлькiсть iнтервалiв.
Лiстiнг 7.1. MPI-програма обчислення iнтеграла
#include <stdio . h>
#include <string . h>
#include <mpi .h>
#define MSG_ID1 98
#define MSG_ID2 99
int main( int argc , char ∗∗argv )
{
int me, size ;
unsigned intervals ;
int i, j;
double h, Ik, x;
MPI_Status status ;
MPI_Init (&argc , &argv ) ;
MPI_Comm_rank (MPI_COMM_WORLD, &me) ;
MPI_Comm_size (MPI_COMM_WORLD, &size ) ;
/∗ Головний процес запитує у користувача
∗ кiлькiсть iнтервалiв ∗/
if (me == 0)
{ printf ("Enter intervals :");
scanf ( "%u" , &intervals ) ;
} /∗ if (me == 0) ∗/
/∗ Головний процес розсилає допомiжним ∗ кiлькiсть iнтервалiв ∗/
if (me == 0)
for (i = 1; i < size; i++)
MPI_Send (&intervals ,1 ,MPI_UNSIGNED, i , MSG_ID1, MPI_COMM_WORLD) ;
else
{ /∗ Допомiжнi процеси отримують от
∗ головного кiлькiсть iнтервалiв ∗/
MPI_Recv(&intervals , 1, MPI_UNSIGNED, 0, MSG_ID1, MPI_COMM_WORLD, &status ) ;
} /∗ else if(me == 0) ∗/
/∗ Пiдрахунок суми свого iнтервалу ∗/
h = 1.0/intervals; Ik = 0;
for (j = me; j < intervals; j += size)
{ x= (j + 0.5) ∗ h;
Ik += 4/(1 + x ∗ x);
} /∗ for(j=me;j<intervals ; j += size)∗/
Ik ∗= h;
MPI_Barrier(MPI_COMM_WORLD) ;
if ( me== 0)
{ /∗ Головний процес збирає вiд
∗ допомiжних значення їх сум ∗/
for (i = 1; i < size; i++)
{
MPI_Recv(&x, 1, MPI_DOUBLE, i , MSG_ID2,MPI_COMM_WORLD
,& status ) ;
Ik += x;
} /∗ for(i = 1; i < size; i++) ∗/
printf ( " value = %.10 l f \n" , Ik ) ;
} /∗ if( me == 0) ∗/
else
{ /∗ Допомiжнi процеси вiдсилають
∗ головному значення своїх сум ∗/
MPI_Send (&Ik , 1, MPI_DOUBLE, 0,MSG_ID2,MPI_COMM_WORLD) ; } /∗ else if( me == 0) ∗/
MPI_Finalize () ;
return 0;
}
У данiй програмi використовується функцiя MPI_Barrier. Ця функцiя блокує роботу процесiв, що викликали дану процедуру, доти, поки всi процеси зазначеної групи, що залишилися, також не виконають цю функцiю.
Завдання
Підiнтегральнi функцiї |
||
№ варiанту |
Функцiя |
Кiлькiсть процесiв |
1 |
2 |
3 |
1 |
f(x) = 5 ∗ (x + 1) |
8 |
2 |
f(x) = 1/(x + 1) |
4 |
3 |
f(x) = x2/4 |
5 |
4 |
f(x) = 3 ∗ x/(x + 1) |
3 |
5 |
f(x) = 7/(x3 + 1) |
8 |
6 |
f(x) = sin(x + 1) |
7 |
7 |
f(x) = cos(1/(x + 2)) |
2 |
8 |
f(x) = x3/(x2 + 1) |
6 |
9 |
f(x) = sin(x)/(x + 1) |
5 |
10 |
f(x) = x/(cos(x2) + 1) |
8 |
11 |
f(x) = (x + 1)/(x + 2) |
4 |
12 |
f(x) = sin(x)/(x2 + 5) |
9 |
13 |
f(x) = x + cos(x) |
7 |
14 |
f(x) = tg(x) |
8 |
15 |
f(x) = sin(x) + cos(x) |
3 |
16 |
f(x) = sin(x) ∗ tg(x) |
4 |
Контрольнi питання