Параллельное программирование в стандарте MPI. Баканов В.М - 47 стр.

UptoLike

Составители: 

- 47 -
MPI_Barrier (MPI_COMM_WORLD); /* make sure all MPI tasks are running */
for (i=1; i<ranksize; i++)
{ /* collect there calculation time */
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]);
} // end of collection
} // end work MASTER
else /* I am a SLAVE */
{ /* send my result back to master */
MPI_Send (&pi, 1, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD);
MPI_Barrier (MPI_COMM_WORLD); /* make sure all MPI tasks are running */
send[0]=t5-t4;
send[1]=t6-t5;
MPI_Send (send, 2, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD);
} // end work SLAVE
MPI_Finalize ();
} // end MAIN function
/* ============================================================== */
double compute_interval (int myrank, int ntasks, long intervals)
{ /* calculate integral’s localsum */
double x, width, localsum=0.0;
long j;
width = 1.0 / intervals; /* width of single stripe */
for (j=myrank; j<intervals; j+= ntasks)
{
x = (j + 0.5) * width;
localsum += 4 / (1 + x*x);
}
return (localsum * width); /* area of stripe */
} // end of COMPUTE_INTERVAL function
// end of PI_01.C program
Функция
f_time
содержится в файле
F_TIME.C
(подключается посредством
#include “f_time.c”
):
double f_time() /* return time since 01 jan 1970 as double ‘sec, msec’ */
{
struct timeb tp;
ftime(&tp);
return ((double)(tp.time)+1.0e-3*(double)(tp.millitm));
} // end f_time function
Возможно точное (
double
при данной разрядной сетке ЭВМ) значение
π
определяется как
4.0
×
(atanl(1.0)-atanl(0.0))
и сравнивается с численно вычис-
ленным (относительная ошибка
rel.error
выводится в процентах).
                                            - 47 -


MPI_Barrier (MPI_COMM_WORLD); /* make sure all MPI tasks are running */

 for (i=1; i