Tim's Source Code

From SubfireWiki

Jump to: navigation, search

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
Personal tools