From b66e61904f456e42bf3462c63a47d377fbcd09e8 Mon Sep 17 00:00:00 2001
From: David Goz <david.goz@inaf.it>
Date: Wed, 26 Jun 2024 07:43:49 +0200
Subject: [PATCH] small refinements serial/ omp/

---
 jacobi/openmp/not_opt/Makefile                     |  2 +-
 jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c  |  8 +-------
 jacobi/serial/not_opt/Makefile                     |  2 +-
 jacobi_solutions/serial/not_opt/Makefile           |  2 +-
 .../serial/not_opt/src/jacobi_2D_serial_not_opt.c  |  9 ++++++---
 jacobi_solutions/serial/not_opt/src/tools.c        |  9 ++++-----
 jacobi_solutions/serial/opt/Makefile               |  2 +-
 .../serial/opt/src/jacobi_2D_serial_opt.c          | 14 ++++++++++----
 jacobi_solutions/serial/opt/src/tools.c            |  9 ++++-----
 9 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/jacobi/openmp/not_opt/Makefile b/jacobi/openmp/not_opt/Makefile
index fc4833d..9ec273e 100644
--- a/jacobi/openmp/not_opt/Makefile
+++ b/jacobi/openmp/not_opt/Makefile
@@ -51,7 +51,7 @@ valgrind_callgrind: $(PROG_CALLGRIND)
 
 valgrind_cachegrind: $(PROG_CACHEGRIND)
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
-	valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128 2
+	valgrind --tool=cachegrind --cache-sim=yes --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128 2
 	@echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less'
 	@echo '(kcachegrind is required in order to visualize the output using the GUI)'
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
diff --git a/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c b/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c
index d61d7fd..5768ff4 100644
--- a/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c
+++ b/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c
@@ -234,9 +234,6 @@ void JacobiAlgorithm(MyData      **const restrict Phi,
     #pragma omp barrier
 #endif /* DEBUG */
 
-
-    /***** MISSING LOOP(s) PARALLELIZATION *****/
-    
     for (int j=jbeg ; j<=jend ; j++)
       {
 	for (int i=ibeg ; i<=iend ; i++)
@@ -244,10 +241,7 @@ void JacobiAlgorithm(MyData      **const restrict Phi,
 	    Phi[j][i] = 0.25 * (Phi0[j][i-1] + Phi0[j][i+1] +
 				Phi0[j-1][i] + Phi0[j+1][i]);
 
-	    #pragma omp critical
-	    {
-	      *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]);
-	    }
+	    *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]);
 	  } /* loop over columns */
       } /* loop over rows */
   } /* omp parallel */
diff --git a/jacobi/serial/not_opt/Makefile b/jacobi/serial/not_opt/Makefile
index 191f891..fef753e 100644
--- a/jacobi/serial/not_opt/Makefile
+++ b/jacobi/serial/not_opt/Makefile
@@ -48,7 +48,7 @@ valgrind_callgrind: $(PROG_CALLGRIND)
 
 valgrind_cachegrind: $(PROG_CACHEGRIND)
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
-	valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
+	valgrind --tool=cachegrind --cache-sim=yes --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
 	@echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less'
 	@echo '(kcachegrind is required in order to visualize the output using the GUI)'
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
diff --git a/jacobi_solutions/serial/not_opt/Makefile b/jacobi_solutions/serial/not_opt/Makefile
index 191f891..fef753e 100644
--- a/jacobi_solutions/serial/not_opt/Makefile
+++ b/jacobi_solutions/serial/not_opt/Makefile
@@ -48,7 +48,7 @@ valgrind_callgrind: $(PROG_CALLGRIND)
 
 valgrind_cachegrind: $(PROG_CACHEGRIND)
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
-	valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
+	valgrind --tool=cachegrind --cache-sim=yes --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
 	@echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less'
 	@echo '(kcachegrind is required in order to visualize the output using the GUI)'
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
diff --git a/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c b/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c
index ba53f32..f17e977 100644
--- a/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c
+++ b/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c
@@ -214,10 +214,13 @@ void JacobiAlgorithm(MyData      **const restrict Phi,
     {
       for (int i=ibeg ; i<=iend ; i++)
 	{
-	  Phi[j][i] = 0.25 * (Phi0[j][i-1] + Phi0[j][i+1] +
-			      Phi0[j-1][i] + Phi0[j+1][i]);
+	  Phi[j][i] = 0.25 * (Phi0[j][i-1] +
+			      Phi0[j][i+1] +
+			      Phi0[j-1][i] +
+			      Phi0[j+1][i]);
                 
-	  *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]);
+	  *error += (delta[X] * delta[Y]) *
+	            fabs(Phi[j][i] - Phi0[j][i]);
 	} /* loop over columns */
     } /* loop over rows */
   
diff --git a/jacobi_solutions/serial/not_opt/src/tools.c b/jacobi_solutions/serial/not_opt/src/tools.c
index be2761d..5e1f75a 100644
--- a/jacobi_solutions/serial/not_opt/src/tools.c
+++ b/jacobi_solutions/serial/not_opt/src/tools.c
@@ -51,9 +51,8 @@ void Show_2DdblArray(const MyData **const A,
 
 double seconds()
 {
-  struct timeval tmp;
-  gettimeofday(&tmp, (struct timezone *)0);
-  double sec = tmp.tv_sec + ((double)tmp.tv_usec)/1000000.0;
-
-  return sec;
+  struct timespec ts;
+  return (clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &ts ),
+	   (double)ts.tv_sec +
+	   (double)ts.tv_nsec * 1e-9);
 }
diff --git a/jacobi_solutions/serial/opt/Makefile b/jacobi_solutions/serial/opt/Makefile
index d278dc3..2a7fd8b 100644
--- a/jacobi_solutions/serial/opt/Makefile
+++ b/jacobi_solutions/serial/opt/Makefile
@@ -48,7 +48,7 @@ valgrind_callgrind: $(PROG_CALLGRIND)
 
 valgrind_cachegrind: $(PROG_CACHEGRIND)
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
-	valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
+	valgrind --tool=cachegrind --cache-sim=yes --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128
 	@echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less'
 	@echo '(kcachegrind is required in order to visualize the output using the GUI)'
 	@echo 'oooOOO... valgrind_cachegrind ...OOOooo'
diff --git a/jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c b/jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c
index a14c810..7bacb89 100644
--- a/jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c
+++ b/jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c
@@ -212,13 +212,19 @@ void JacobiAlgorithm(MyData      **const restrict Phi,
     {
       for (int i=ibeg ; i<=iend ; i++)
 	{
-	  Phi[j][i] = 0.25 * (Phi0[j][i-1] + Phi0[j][i+1] +
-			      Phi0[j-1][i] + Phi0[j+1][i]);
-                
-	  *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]);
+	  Phi[j][i] = 0.25 * (Phi0[j  ][i-1] +
+			      Phi0[j  ][i+1] +
+			      Phi0[j-1][i  ] +
+			      Phi0[j+1][i  ]);
+
+	  /* avoid fabs from math library */
+	  const MyData diff = (Phi[j][i] - Phi0[j][i]);
+	  *error += ((diff > 0) ? diff : -diff);
 	} /* loop over columns */
     } /* loop over rows */
   
+  *error *= (delta[X] * delta[Y]);
+  
   return;
 }
 
diff --git a/jacobi_solutions/serial/opt/src/tools.c b/jacobi_solutions/serial/opt/src/tools.c
index be2761d..5e1f75a 100644
--- a/jacobi_solutions/serial/opt/src/tools.c
+++ b/jacobi_solutions/serial/opt/src/tools.c
@@ -51,9 +51,8 @@ void Show_2DdblArray(const MyData **const A,
 
 double seconds()
 {
-  struct timeval tmp;
-  gettimeofday(&tmp, (struct timezone *)0);
-  double sec = tmp.tv_sec + ((double)tmp.tv_usec)/1000000.0;
-
-  return sec;
+  struct timespec ts;
+  return (clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &ts ),
+	   (double)ts.tv_sec +
+	   (double)ts.tv_nsec * 1e-9);
 }
-- 
GitLab