x . , :
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
for (int i = 1; i < ProcNum; i++)
MPI_Send(&x, n, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
, () . , log2p .
( ) MPI:
int MPI_Bcast(void *buf, int count, MPI_Datatype type, int root,
MPI_Comm comm),
buf, count, type ( 0) ( );
root , ;
comm , .
MPI_Bcast buf, count type, , root, , comm (. . 5.1).
:
- MPI_Bcast , , , MPI_Bcast (. );
- MPI_Bcast : root, , , ;
- "" , , , MPI_Bcast, MPI_Recv , MPI_Bcast.
. 4.1.
.
4.2.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char* argv[]){
double x[100], TotalSum, ProcSum = 0.0;
int ProcRank, ProcNum, N=100, k, i1, i2;
MPI_Status Status;
//
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank);
|
|
//
if (ProcRank == 0) DataInitialization(x,N);
//
MPI_Bcast(x, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
//
// x i1 i2
k = N / ProcNum;
i1 = k * ProcRank;
i2 = k * (ProcRank + 1);
if (ProcRank == ProcNum-1) i2 = N;
for (int i = i1; i < i2; i++)
ProcSum = ProcSum + x[i];
// 0
if (ProcRank == 0) {
TotalSum = ProcSum;
for (int i=1; i < ProcNum; i++) {
MPI_Recv(&ProcSum,1,MPI_DOUBLE,MPI_ANY_SOURCE,0, MPI_COMM_WORLD, &Status);
TotalSum = TotalSum + ProcSum;
}
}
else //
MPI_Send(&ProcSum, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
//
if (ProcRank == 0)
printf("\nTotal Sum = %10.2f",TotalSum);
MPI_Finalize();
return 0;
}
4.2. (html, txt)
DataInitialization . , .
4.2. .
. ( ). , . , , MPI :
int MPI_Reduce(void *sendbuf, void *recvbuf, int count,
MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm),
sendbuf ;
recvbuf ( root);
count ;
type ;
op , ;
root , ;
comm , .
MPI . . 4.2.
. 4.2. root , ..:
Ä , MPI_Reduce ( . 4.3 ).
:
MPI_Reduce , , , . count, type, op, root, comm;
|
|
, root;
. , , MPI_SUM, , , ;
type op , . 4.3.
4.2.
() MPI
MPI_MAX | |
MPI_MIN | |
MPI_SUM | |
MPI_PROD | |
MPI_LAND | "" |
MPI_BAND | "" |
MPI_LOR | "" |
MPI_BOR | "" |
MPI_LXOR | "" |
MPI_BXOR | "" |
MPI_MAXLOC | |
MPI_MINLOC |
. 4.2.
4.3.
C | |
MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD | , |
MPI_LAND, MPI_LOR, MPI_LXOR | |
MPI_BAND, MPI_BOR, MPI_BXOR | , |
MPI_MINLOC, MPI_MAXLOC | , |
. 4.3. ( 4 , 2)
: , (" 0"), MPI_Reduce:
// 0
MPI_Reduce(&ProcSum, &TotalSum, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
4 C++ , . . MPI MPICH 1.2.7, , .
. . .
:
) .
) MPI-.
) .
) .