Введение в практику разработки параллельных программ в стандарте MPI. Баканов В.М - 47 стр.

UptoLike

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

- 47 -
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)
printf("%d: failure on MPI_Reduce\n", taskid);
…
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