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

UptoLike

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

- 53 -
800000 throws aver.value of PI= 3.143230000000 (rel.error= -0.05212 %, time= 0.236 sec)
1000000 throws aver.value of PI= 3.142872000000 (rel.error= -0.04072 %, time= 0.293 sec)
Рассчитанные значения
π
являются весьма приближенными даже при
большом числевыстрелов’, причем не во всех случаях увеличение числа
выстреловвызывает возрастание точности представления искомой величи-
ны.
Ниже приведен вариант программы (файл
PI_03.C
) с использованием кол-
лективных функций (вместо функций семействаточка-точка’); при этом в
MASTER-процессе функция
MPI_Reduce
суммирует величины
homepi
от всех
задач (сумма помещается в
pisum; homepi
при этом является буфером посыл-
ки,
pisum
приемным буфером):
// source code PI_03.C program
#include “mpi.h”
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define DARTS 10000 /* number of throws at dartboard */
#define ROUNDS 100 /* number of times ‘darts’ is iterated */
#define MASTER 0 /* task ID of MASTER task */
void srandom (unsigned seed);
double dboard (int darts);
#include “dboard.c” // including dboard.c file
int main(int argc, char *argv[])
{
double homepi, pisum, pi, avepi,
t1, t2, // time’s moments
pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
int taskid, numtasks, rc, i:
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
t1=MPI_Wtime(); // fix start time calculated
avepi = 0;
for (i=0; i<ROUNDS; i++)
{
homepi = dboard(DARTS);
rc = MPI_Reduce(&homepi, &pisum, 1, MPI_DOUBLE, MPI_SUM, MASTER,
MPI_COMM_WORLD);
if (rc != MPI_SUCCESS)
                                            - 53 -

…
800000 throws aver.value of PI= 3.143230000000 (rel.error= -0.05212 %, time= 0.236 sec)
…
1000000 throws aver.value of PI= 3.142872000000 (rel.error= -0.04072 %, time= 0.293 sec)

  Рассчитанные значения π являются весьма приближенными даже при
большом числе ‘выстрелов’, причем не во всех случаях увеличение числа
‘выстрелов’ вызывает возрастание точности представления искомой величи-
ны.
  Ниже приведен вариант программы (файл PI_03.C) с использованием кол-
лективных функций (вместо функций семейства ‘точка-точка’); при этом в
MASTER-процессе функция MPI_Reduce суммирует величины homepi от всех
задач (сумма помещается в pisum; homepi при этом является буфером посыл-
ки, pisum – приемным буфером):

// source code PI_03.C program
#include “mpi.h”
#include 
#include 
#include 

#define DARTS 10000 /* number of throws at dartboard */
#define ROUNDS 100 /* number of times ‘darts’ is iterated */
#define MASTER 0    /* task ID of MASTER task */

void srandom (unsigned seed);
double dboard (int darts);
#include “dboard.c” // including dboard.c file

int main(int argc, char *argv[])
{
double homepi, pisum, pi, avepi,
        t1, t2, // time’s moments
        pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
int     taskid, numtasks, rc, i:
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD,&taskid);

t1=MPI_Wtime(); // fix start time calculated

avepi = 0;
for (i=0; i