Skip to content
Snippets Groups Projects
mpipi2.py 1.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • Neil Gershenfeld's avatar
    wip
    Neil Gershenfeld committed
    #
    # mpipi2.py
    # Neil Gershenfeld 2/6/20
    # calculation of pi by an MPI Numba sum
    # pi = 3.14159265358979323846 
    #
    
    import time
    from numba import jit
    from mpi4py import MPI
    
    NPTS = 1000000000
    NLOOP = 10
    
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    nproc = comm.Get_size()
    
    @jit(nopython=True)
    def calc(istart,iend):
       sum = 0.0
       for i in range(istart,iend+1):
          sum += 0.5/((i-0.75)*(i-0.25))
       return sum
    
    if (rank == 0):
       istart = 1+rank*NPTS;
       iend = (rank+1)*NPTS;
       max = 0
       for j in range(NLOOP):
          comm.Barrier()
          start_time = time.time()
          sum = 0.0;
          sum = calc(istart,iend)
          pi = comm.reduce(sum,op=MPI.SUM,root=0)
          end_time = time.time()
          mflops = nproc*NPTS*5.0/(1.0e6*(end_time-start_time))
          print("processes = %d, NPTS = %d, pi = %f"%(nproc,NPTS,pi))
          if (mflops > max):
             max = mflops
          print("time = %f, estimated MFlops = %f, max = %f"%(end_time-start_time,mflops,max))
    else:
       istart = 1+rank*NPTS
       iend = (rank+1)*NPTS
       for j in range(NLOOP):
          comm.Barrier()
          sum = calc(istart,iend)
          comm.reduce(sum,op=MPI.SUM,root=0)