From cf955b1cf3237b0841b6e10391b63b7fc75ceb00 Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Thu, 11 Jul 2019 21:50:37 -0400
Subject: [PATCH] wip

---
 MPI/mpipi3.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)
 create mode 100755 MPI/mpipi3.c

diff --git a/MPI/mpipi3.c b/MPI/mpipi3.c
new file mode 100755
index 0000000..9acbcff
--- /dev/null
+++ b/MPI/mpipi3.c
@@ -0,0 +1,59 @@
+/*
+* mpipi3.c
+* Neil Gershenfeld  7/1/19
+* use MPI to evaluate pi by summation,
+*    including overhead, with multiple iterations
+*/
+
+#include <stdio.h>
+#include <mpi.h>
+#include <sys/time.h>
+#include <stdint.h>
+
+//#define NPTS 10000000000
+#define NPTS 1000000000
+#define NLOOP 10
+
+void main(int argc, char** argv) {
+   uint32_t rank,nproc;
+   uint64_t i,j,istart,iend,init_time,start_time,end_time;
+   struct timeval init,start,end;
+   double sum,pi,mflops,max;
+
+   gettimeofday(&init,NULL);
+   MPI_Init(&argc,&argv);
+   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+   MPI_Comm_size(MPI_COMM_WORLD,&nproc);
+   max = 0;
+   for (j = 0; j < NLOOP; ++j) {
+      if (rank == 0) {
+         MPI_Barrier(MPI_COMM_WORLD);
+         gettimeofday(&start,NULL);
+         istart = 1+rank*NPTS;
+         iend = (rank+1)*NPTS;
+         sum = 0.0;
+         for (i = istart; i <= iend; ++i)
+            sum += 0.5/((i-0.75)*(i-0.25));
+         MPI_Reduce(&sum,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
+         gettimeofday(&end,NULL);
+         init_time = init.tv_sec*1e6+init.tv_usec;
+         start_time = start.tv_sec*1e6+start.tv_usec;
+         end_time = end.tv_sec*1e6+end.tv_usec;
+         mflops = nproc*NPTS*(5.0/(end_time-start_time));
+         printf("processes = %d, NPTS = %ld, pi = %f\n",nproc,NPTS,pi);
+         printf("init = %f, time = %f\n",(start_time-init_time)/1.0e6,(end_time-start_time)/1.0e6);
+         if (mflops > max) max = mflops;
+         printf("estimated MFlops = %f, max MFlops = %f\n",mflops,max);
+         }
+      else {
+         MPI_Barrier(MPI_COMM_WORLD);
+         istart = 1+rank*NPTS;
+         iend = (rank+1)*NPTS;
+         sum = 0.0;
+         for (i = istart; i <= iend; ++i)
+            sum += 0.5/((i-0.75)*(i-0.25));
+         MPI_Reduce(&sum,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
+         }
+      }
+   MPI_Finalize();
+   }
-- 
GitLab