From SubfireWiki
mpi-pi.cpp
#include "mpi.h"
#include <iostream>
int main(int argc, char** argv){
MPI::Init(argc,argv);
int num_nodes = MPI::COMM_WORLD.Get_size();
int rank = MPI::COMM_WORLD.Get_rank();
int master_rank = 0;
int num_iterations = 100000000;
int local_within_radius = 0;
int total_within_radius = 0;
int radius = 0x01<<30;
std::cout << "Hello!\n" << "Rank: " << rank << " Number of nodes: "
<< num_nodes << "\nNumber of iterations per node: "
<< num_iterations/num_nodes << std::endl
<< "Radius: " << radius << std::endl;
num_iterations -= (num_iterations%num_nodes);
for(int i = 0; i < (num_iterations/num_nodes); ++i){
int x = std::rand()%(0x01<<15);
int y = std::rand()%(0x01<<15);
if( radius > ( x*x + y*y ) ) {
local_within_radius++;
}
}
MPI::COMM_WORLD.Allreduce(&local_within_radius,&total_within_radius,1,MPI::INT,MPI::SUM);
if(rank == master_rank){
std::cout << "Pi = " << double(total_within_radius*4) / double(num_iterations) << std::endl;
}
MPI::Finalize();
}
Makefile
all: mpi-pi
mpi-pi: mpi-pi.cpp
mpicxx mpi-pi.cpp