From 4c734242d39ad45686cf89c8238161160b068cfc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 27 Mar 2018 23:20:13 +0200
Subject: [PATCH] optimization tests

---
 experimental/AcousticSolver.cpp          | 32 ++++++++++--------------
 experimental/MeshLessAcousticSolver.cpp  |  8 ++++--
 experimental/RawKokkosAcousticSolver.cpp |  8 ++++--
 3 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/experimental/AcousticSolver.cpp b/experimental/AcousticSolver.cpp
index 16bf845f3..e155bd395 100644
--- a/experimental/AcousticSolver.cpp
+++ b/experimental/AcousticSolver.cpp
@@ -173,8 +173,8 @@ KOKKOS_INLINE_FUNCTION
 const Kokkos::View<const double*>
 AcousticSolver::inverse(const Kokkos::View<const double*>& x) const
 {
-  Kokkos::View<double*> inv_x("inv_x", m_nr);
-  Kokkos::parallel_for(m_nr, KOKKOS_LAMBDA(const int& r) {
+  Kokkos::View<double*> inv_x("inv_x", x.size());
+  Kokkos::parallel_for(x.size(), KOKKOS_LAMBDA(const int& r) {
       inv_x(r) = 1./x(r);
     });
 
@@ -206,12 +206,12 @@ void AcousticSolver::computeExplicitFluxes(const Kokkos::View<const double*>& xr
 
   ur  = computeUr(Ar, br);
 #warning understand why this call diminishes performances
-  // Fjr = computeFjr(Ajr, ur, Cjr, uj, pj, cell_nodes);
-  Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j) {
-      for (int r=0; r<2; ++r) {
-  	Fjr(j,r) = Ajr(j,r)*(uj(j)-ur(cell_nodes(j,r)))+Cjr(j,r)*pj(j);
-      }
-    });
+  Fjr = computeFjr(Ajr, ur, Cjr, uj, pj, cell_nodes);
+  // Kokkos::parallel_for(m_nj, KOKKOS_LAMBDA(const int& j) {
+  //     for (int r=0; r<2; ++r) {
+  // 	Fjr(j,r) = Ajr(j,r)*(uj(j)-ur(cell_nodes(j,r)))+Cjr(j,r)*pj(j);
+  //     }
+  //   });
 }
 
 AcousticSolver::AcousticSolver(const long int& nj)
@@ -230,7 +230,6 @@ AcousticSolver::AcousticSolver(const long int& nj)
   Kokkos::View<double*> gammaj("gammaj",m_nj);
   Kokkos::View<double*> cj("cj",m_nj);
   Kokkos::View<double*> mj("mj",m_nj);
-  Kokkos::View<double*> inv_mj("inv_mj",m_nj);
 
   Kokkos::View<double*>  xr("xr", m_nr);
 
@@ -314,6 +313,8 @@ AcousticSolver::AcousticSolver(const long int& nj)
     mj[j] = rhoj[j] * Vj[j];
   });
 
+  const Kokkos::View<const double*> inv_mj=inverse(mj);
+
   const double tmax=0.2;
   double t=0;
 
@@ -336,17 +337,13 @@ AcousticSolver::AcousticSolver(const long int& nj)
     }
     
     Kokkos::View<double*> ur;
-    // Kokkos::View<double*[2]> Fjr;
-    Kokkos::View<double*[2]> Fjr("Fjr", m_nj);
+    Kokkos::View<double*[2]> Fjr;
   
     computeExplicitFluxes(xr, xj,
 			  rhoj, uj, pj, cj, Vj, Cjr,
 			  cell_nodes, node_cells, node_nb_cells, node_cell_local_node,
 			  ur, Fjr);
 
-    // Kokkos::View<double*> new_uj("new_uj",m_nj);
-    // Kokkos::View<double*> new_Ej("new_Ej",m_nj);
-
     Kokkos::parallel_for(nj, KOKKOS_LAMBDA(const int& j){
 	double momentum_fluxes = 0;
 	double energy_fluxes = 0;
@@ -355,13 +352,10 @@ AcousticSolver::AcousticSolver(const long int& nj)
 	  momentum_fluxes += Fjr(j,R);
 	  energy_fluxes += Fjr(j,R)*ur[r];
 	}
-	uj[j] -= dt/mj[j]*(momentum_fluxes);
-	Ej[j] -= dt/mj[j]*(energy_fluxes);
+	uj[j] -= dt*inv_mj[j]*(momentum_fluxes);
+	Ej[j] -= dt*inv_mj[j]*(energy_fluxes);
       });
 
-    // uj=new_uj;
-    // Ej=new_Ej;
-
     Kokkos::parallel_for(nj, KOKKOS_LAMBDA(const int& j) {
 	ej[j] = Ej[j] - 0.5 * uj[j]*uj[j];
       });
diff --git a/experimental/MeshLessAcousticSolver.cpp b/experimental/MeshLessAcousticSolver.cpp
index edf67693c..bf5014481 100644
--- a/experimental/MeshLessAcousticSolver.cpp
+++ b/experimental/MeshLessAcousticSolver.cpp
@@ -172,6 +172,10 @@ MeshLessAcousticSolver::MeshLessAcousticSolver(const long int& nj)
     mj[j] = rhoj[j] * Vj[j];
   });
 
+  Kokkos::parallel_for(nj, KOKKOS_LAMBDA(const int& j){
+      inv_mj[j] = 1./mj[j];
+    });
+
   const double tmax=0.2;
   double t=0;
 
@@ -201,8 +205,8 @@ MeshLessAcousticSolver::MeshLessAcousticSolver(const long int& nj)
       int rm=j;
       int rp=j+1;
 
-      new_uj[j] = uj[j] + dt/mj[j]*(pr[rm]-pr[rp]);
-      new_Ej[j] = Ej[j] + dt/mj[j]*(pr[rm]*ur[rm]-pr[rp]*ur[rp]);
+      new_uj[j] = uj[j] + dt*inv_mj[j]*(pr[rm]-pr[rp]);
+      new_Ej[j] = Ej[j] + dt*inv_mj[j]*(pr[rm]*ur[rm]-pr[rp]*ur[rp]);
       });
 
     uj=new_uj;
diff --git a/experimental/RawKokkosAcousticSolver.cpp b/experimental/RawKokkosAcousticSolver.cpp
index b7369fde4..d27549d34 100644
--- a/experimental/RawKokkosAcousticSolver.cpp
+++ b/experimental/RawKokkosAcousticSolver.cpp
@@ -185,6 +185,10 @@ void AcousticSolver(const long int& nj)
     mj[j] = rhoj[j] * Vj[j];
   });
 
+  Kokkos::parallel_for(nj, KOKKOS_LAMBDA(const int& j){
+      inv_mj[j] = 1./mj[j];
+  });
+
   const double tmax=0.2;
   double t=0;
 
@@ -211,8 +215,8 @@ void AcousticSolver(const long int& nj)
       int rm=j;
       int rp=j+1;
 
-      uj[j] += dt/mj[j]*(pr[rm]-pr[rp]);
-      Ej[j] += dt/mj[j]*(pr[rm]*ur[rm]-pr[rp]*ur[rp]);
+      uj[j] += dt*inv_mj[j]*(pr[rm]-pr[rp]);
+      Ej[j] += dt*inv_mj[j]*(pr[rm]*ur[rm]-pr[rp]*ur[rp]);
       });
 
     Kokkos::parallel_for(nj, KOKKOS_LAMBDA(const int& j){
-- 
GitLab