Listing 6. Telling Slaves to Quit
void master(long start, long stop, long nprocs){
long work[2];
long result;
long total(0);
long current(0);
MPI_Status status;
// dish out some work
for (int rank=1; rank<nprocs; ++rank){
// set the bounds for this work
if (make_work(work,¤t,stop))
MPI_Send(work,2,MPI_LONG,
rank,WORK,MPI_COMM_WORLD);
}
// keep sending work out while there is some
while(make_work(work,¤t,stop)){
MPI_Recv(&result,1,MPI_LONG,MPI_ANY_SOURCE,
MPI_ANY_TAG,MPI_COMM_WORLD,&status);
total+=result;
MPI_Send(work,2,MPI_LONG,status.MPI_SOURCE,
WORK,MPI_COMM_WORLD);
}
// receive any outstanding requests
for (int rank=1; rank<nprocs; ++rank){
MPI_Recv(&result,1,MPI_LONG,MPI_ANY_SOURCE,
MPI_ANY_TAG,MPI_COMM_WORLD,&status);
total+=result;
}
// tell all salves to exit
for (int rank=1; rank<nprocs; ++rank){
MPI_Send(0,0,MPI_INT,rank,KILL,MPI_COMM_WORLD);
}
cout << "There were " << total;
cout << " primes." << endl;
}
Copyright © 1994 - 2018 Linux Journal. All rights reserved.