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

UptoLike

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

- 51 -
При первом варианте распараллеливания (программа
PI_02.C)
используют-
ся только (блокирующие) функции обменаточка-точка
MPI_Send/MPI_Recv
:
вычислительные узлы посылают MASTER-узлу частичные (определенные на
основе выполненных данным узломвыстрелов’) значения
π
, главный про-
цесс суммирует их и выдает на печать усредненные значения:
// source code PI_02.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, /* value of pi calculated by current task */
pi, /* average of pi after ‘darts’ is thrown */
avepi, /* average pi value for all iterations */
pirecv, /* pi received from worker */
pisum, /* sum of workers PI values */
t1, t2, // time’s moments
pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
int taskid, /* task ID – also used as seed number */
numtasks, /* number of tasks */
source, /* source of incoming message */
rc, /* MPI’s return code */
i, n;
MPI_Status status;
rc = MPI_Init(&argc,&argv);
rc = MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
rc = MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
t1=MPI_Wtime(); // store start time calculated
srandom (taskid); // initialization random number generator by taskid value
avepi = 0;
for (i=0; i<ROUNDS; i++)
{
homepi = dboard(DARTS); // all tasks calculate pi by dartboard algorithm
if (taskid != MASTER) // It’s NOT MASTER!
{
                                              - 51 -

  При первом варианте распараллеливания (программа PI_02.C) используют-
ся только (блокирующие) функции обмена ‘точка-точка’ MPI_Send/MPI_Recv:
вычислительные узлы посылают MASTER-узлу частичные (определенные на
основе выполненных данным узлом ‘выстрелов’) значения π , главный про-
цесс суммирует их и выдает на печать усредненные значения:

// source code PI_02.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, /* value of pi calculated by current task */
       pi,            /* average of pi after ‘darts’ is thrown */
       avepi,        /* average pi value for all iterations */
       pirecv,       /* pi received from worker */
       pisum,        /* sum of workers PI values */
        t1, t2, // time’s moments
        pi_prec=4.0*(atanl(1.0)-atan(0.0)); // pi precision
int    taskid,         /* task ID – also used as seed number */
       numtasks, /* number of tasks */
       source,         /* source of incoming message */
       rc,            /* MPI’s return code */
       i, n;
MPI_Status status;

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

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

srandom (taskid); // initialization random number generator by taskid value

avepi = 0;
for (i=0; i