From 920d7c1820fe783fd0465abd9bfd4948bbbf1e2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Oberhuber?= <oberhuber.tomas@gmail.com>
Date: Fri, 21 Dec 2018 21:47:40 +0100
Subject: [PATCH] Fixed memory bandwidth in traversers benchmark.

---
 .../Traversers/GridTraversersBenchmark.h      | 63 +++++++++++++++----
 .../Traversers/tnl-benchmark-traversers.h     | 14 ++---
 src/TNL/Meshes/GridDetails/Grid2D.h           |  4 +-
 src/TNL/Meshes/GridDetails/Grid2D_impl.h      |  2 +-
 src/TNL/Meshes/GridDetails/Grid3D.h           |  4 +-
 5 files changed, 64 insertions(+), 23 deletions(-)

diff --git a/src/Benchmarks/Traversers/GridTraversersBenchmark.h b/src/Benchmarks/Traversers/GridTraversersBenchmark.h
index 3302c4cb94..6f1019deba 100644
--- a/src/Benchmarks/Traversers/GridTraversersBenchmark.h
+++ b/src/Benchmarks/Traversers/GridTraversersBenchmark.h
@@ -16,6 +16,10 @@
 #include <TNL/Devices/Host.h>
 #include <TNL/Devices/Cuda.h>
 #include <TNL/Containers/Vector.h>
+#include <TNL/Meshes/Grid.h>
+#include <TNL/Meshes/GridEntityConfig.h>
+#include <TNL/Meshes/Traverser.h>
+#include <TNL/Functions/MeshFunction.h>
 
 namespace TNL {
    namespace Benchmarks {
@@ -35,26 +39,52 @@ class GridTraversersBenchmark< 1, Device, Real, Index >
    public:
       
       using Vector = Containers::Vector< Real, Device, Index >;
+      using Grid = Meshes::Grid< 1, Real, Device, Index >;
+      using Coordinates = typename Grid::CoordinatesType;
+      using MeshFunction = Functions::MeshFunction< Grid >;
+      using Cell = typename Grid::EntityType< 1, Meshes::GridEntityNoStencilStorage >;
+      using Traverser = Meshes::Traverser< Grid, Cell >;
       
       GridTraversersBenchmark( Index size )
-      :v( size ), size( size )
-      {}
+      :v( size ), size( size ), grid( size )
+      {
+      }
       
-      void writeOne()
+      void writeOneUsingParallelFor()
       {
          
          auto f = [] __cuda_callable__ ( Index i, Real* data )
          {
-            data[ i ] = i;
+            data[ i ] = 1.0;
          };
          
          ParallelFor< Device >::exec( ( Index ) 0, size, f, v.getData() );
       }
       
+      void writeOneUsingTraverser()
+      {
+         class EntitiesProcessor
+         {
+            
+         };
+         
+         class UserData
+         {
+            
+         };
+         
+         Traverser traverser;
+         /*traverser.template processAllEntities< UserData, EntitiesProcessor >
+                                           ( meshPointer,
+                                             userData );*/
+         
+      }
+      
       protected:
          
          Index size;
          Vector v;
+         Grid grid;
 };
 
 
@@ -66,16 +96,20 @@ class GridTraversersBenchmark< 2, Device, Real, Index >
    public:
       
       using Vector = Containers::Vector< Real, Device, Index >;
+      using Grid = Meshes::Grid< 2, Real, Device, Index >;
+      using Coordinates = typename Grid::CoordinatesType;
       
       GridTraversersBenchmark( Index size )
-      :size( size ), v( size * size )  { }
+      :size( size ), v( size * size ), grid( size, size )
+      {
+      }
       
-      void writeOne()
+      void writeOneUsingParallelFor()
       {
          Index _size = this->size;
          auto f = [=] __cuda_callable__ ( Index i, Index j,  Real* data )
          {
-            data[ i * _size + j ] = i + j;
+            data[ i * _size + j ] = 1.0;
          };
          
          ParallelFor2D< Device >::exec( ( Index ) 0,
@@ -88,8 +122,8 @@ class GridTraversersBenchmark< 2, Device, Real, Index >
    protected:
         
       Index size;
-      
       Vector v;
+      Grid grid;
       
 };
 
@@ -101,16 +135,22 @@ class GridTraversersBenchmark< 3, Device, Real, Index >
    public:
       
       using Vector = Containers::Vector< Real, Device, Index >;
+      using Grid = Meshes::Grid< 3, Real, Device, Index >;
+      using Coordinates = typename Grid::CoordinatesType;
       
       GridTraversersBenchmark( Index size )
-      : size( size ), v( size * size * size ) {}
+      : size( size ),
+        v( size * size * size ),
+        grid( size, size, size )
+      {
+      }
       
-      void writeOne()
+      void writeOneUsingParallelFor()
       {
          Index _size = this->size;
          auto f = [=] __cuda_callable__ ( Index i, Index j, Index k, Real* data )
          {
-            data[ ( i * _size + j ) * _size + k ] = i + j + k;
+            data[ ( i * _size + j ) * _size + k ] = 1.0;
          };
          
          ParallelFor3D< Device >::exec( ( Index ) 0, 
@@ -126,6 +166,7 @@ class GridTraversersBenchmark< 3, Device, Real, Index >
       
       Index size;
       Vector v;
+      Grid grid;
       
 };
 
diff --git a/src/Benchmarks/Traversers/tnl-benchmark-traversers.h b/src/Benchmarks/Traversers/tnl-benchmark-traversers.h
index 9b69a31639..c6349f5960 100644
--- a/src/Benchmarks/Traversers/tnl-benchmark-traversers.h
+++ b/src/Benchmarks/Traversers/tnl-benchmark-traversers.h
@@ -54,20 +54,20 @@ bool runBenchmark( const Config::ParameterContainer& parameters,
          Benchmark::MetadataColumns( 
             {  {"size", convertToString( size ) }, } ) );
 
-      auto hostWriteOne = [&] ()
+      auto hostWriteOneUsingParallelFor = [&] ()
       {
-         hostTraverserBenchmark.writeOne();
+         hostTraverserBenchmark.writeOneUsingParallelFor();
       }; 
 
-      auto cudaWriteOne = [&] ()
+      auto cudaWriteOneUsingParallelFor = [&] ()
       {
-         cudaTraverserBenchmark.writeOne();
+         cudaTraverserBenchmark.writeOneUsingParallelFor();
       }; 
 
-      benchmark.setOperation( "writeOne", size * sizeof( Real ) );
-      benchmark.time( reset, "CPU", hostWriteOne );
+      benchmark.setOperation( "write 1 using parallel for", size * sizeof( Real ) / oneGB );
+      benchmark.time( reset, "CPU", hostWriteOneUsingParallelFor );
 #ifdef HAVE_CUDA
-      benchmark.time( reset, "GPU", cudaWriteOne );
+      benchmark.time( reset, "GPU", cudaWriteOneUsingParallelFor );
 #endif
       
    }   
diff --git a/src/TNL/Meshes/GridDetails/Grid2D.h b/src/TNL/Meshes/GridDetails/Grid2D.h
index 896b615486..f2dbebc5c7 100644
--- a/src/TNL/Meshes/GridDetails/Grid2D.h
+++ b/src/TNL/Meshes/GridDetails/Grid2D.h
@@ -82,8 +82,8 @@ class Grid< 2, Real, Device, Index > : public Object
 
    /**
     * \brief Sets the size of dimensions.
-    * \param xSize Size of dimesion x.
-    * \param ySize Size of dimesion y.
+    * \param xSize Size of dimension x.
+    * \param ySize Size of dimension y.
     */
    void setDimensions( const Index xSize, const Index ySize );
 
diff --git a/src/TNL/Meshes/GridDetails/Grid2D_impl.h b/src/TNL/Meshes/GridDetails/Grid2D_impl.h
index 49ad910353..41e05d8b5a 100644
--- a/src/TNL/Meshes/GridDetails/Grid2D_impl.h
+++ b/src/TNL/Meshes/GridDetails/Grid2D_impl.h
@@ -43,7 +43,7 @@ Grid< 2, Real, Device, Index >::Grid( const Index xSize, const Index ySize )
 : numberOfCells( 0 ),
   numberOfNxFaces( 0 ),
   numberOfNyFaces( 0 ),
-  numberOfFaces( 0 ),   
+  numberOfFaces( 0 ),
   numberOfVertices( 0 ),
   distGrid(nullptr)
 {
diff --git a/src/TNL/Meshes/GridDetails/Grid3D.h b/src/TNL/Meshes/GridDetails/Grid3D.h
index 3ddd44735d..617efe7f31 100644
--- a/src/TNL/Meshes/GridDetails/Grid3D.h
+++ b/src/TNL/Meshes/GridDetails/Grid3D.h
@@ -57,8 +57,8 @@ class Grid< 3, Real, Device, Index > : public Object
     * \brief See Grid1D::Grid().
     */
    Grid();
-   
-   Grid( const Index xSize, const Index ySize, const Index zSize );   
+
+   Grid( const Index xSize, const Index ySize, const Index zSize );
 
    /**
     * \brief See Grid1D::getType().
-- 
GitLab