Commit 18b77cd1 authored by Ján Bobot's avatar Ján Bobot Committed by Jakub Klinkovský
Browse files

Improved mesh benchmark to also support triangular and tetrahedral meshes

parent b449e89c
Loading
Loading
Loading
Loading
+41 −203
Original line number Diff line number Diff line
@@ -150,12 +150,22 @@ struct MeshBenchmarks
         benchmark_decomposition< EntityDecomposerVersion::ConnectEdgesToPoint,
                                  EntityDecomposerVersion::ConnectEdgesToPoint >( benchmark, parameters, mesh_src );
      }

      // Other than Polygonal and Polyhedral Mesh
      template< typename M,
                std::enable_if_t< ! std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value &&
                                  ! std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value, bool  > = true >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
      {
      }
   };

   struct PlanarDispatch
   {
      template< typename M,
                std::enable_if_t< M::Config::spaceDimension == 3, bool > = true >
                std::enable_if_t< M::Config::spaceDimension == 3 &&
                                 (std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value ||
                                  std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value ), bool > = true >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
      {
         benchmark.setOperation( String( "Planar Correction (c)" ) );
@@ -166,7 +176,9 @@ struct MeshBenchmarks
      }

      template< typename M,
                std::enable_if_t< M::Config::spaceDimension < 3, bool > = true >
                std::enable_if_t< M::Config::spaceDimension < 3 ||
                                 (! std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value &&
                                  ! std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value ), bool > = true >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
      {
      }
@@ -174,67 +186,10 @@ struct MeshBenchmarks

   struct MeasuresDispatch
   {
      // Polygonal Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value, bool > = true >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
         benchmark.setOperation( String("Measures") );
         exec_helper( benchmark, parameters, mesh );

         {
            benchmark.setOperation( String("Measures (decomp (c))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Measures (decomp (p))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }
      }

      // Polyhedral Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value, bool > = true >
      template< typename M >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
         benchmark.setOperation( String("Measures") );
         exec_helper( benchmark, parameters, mesh );

         {
            benchmark.setOperation( String("Measures (decomp (cc))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Measures (decomp (cp))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Measures (decomp (pc))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Measures (decomp (pp))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh );
            exec_helper( benchmark, parameters, decomposedMesh );
         }
      }
   private:
      template< typename M >
      static void exec_helper( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh )
      {
         benchmark_measures< Devices::Host >( benchmark, parameters, mesh );
         #ifdef HAVE_CUDA
         benchmark_measures< Devices::Cuda >( benchmark, parameters, mesh );
@@ -244,100 +199,17 @@ struct MeshBenchmarks

   struct MemoryDispatch
   {
      // Polygonal Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value, bool > = true >
      static void exec( Benchmark& benchmark, const Config::ParameterContainer& parameters, const M& mesh_src )
      {
         benchmark.setOperation( String("Memory") );
         benchmark_memory( benchmark, parameters, mesh_src );

         {
            benchmark.setOperation( String("Memory (decomp (c))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Memory (decomp (p))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }
      }

      // Polyhedral Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value, bool  > = true >
      template< typename M >
      static void exec( Benchmark& benchmark, const Config::ParameterContainer& parameters, const M& mesh_src )
      {
         benchmark.setOperation( String("Memory") );
         benchmark_memory( benchmark, parameters, mesh_src );

         {
            benchmark.setOperation( String("Memory (decomp (cc))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }


         {
            benchmark.setOperation( String("Memory (decomp (cp))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Memory (decomp (pc))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }

         {
            benchmark.setOperation( String("Memory (decomp (pp))") );
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh_src );
            benchmark_memory( benchmark, parameters, decomposedMesh );
         }
      }
   };

   struct CopyDispatch
   {
      // Polygonal Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value, bool > = true >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
      {
#ifdef HAVE_CUDA
         benchmark.setOperation( String("Copy CPU->GPU") );
         benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, mesh_src );
         benchmark.setOperation( String("Copy GPU->CPU") );
         benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, mesh_src );

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid>( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (c))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (c))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (p))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (p))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }
#endif
      }

      // Polyhedral Mesh
      template< typename M,
                std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value, bool > = true >
      template< typename M >
      static void exec( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
      {
         #ifdef HAVE_CUDA
@@ -345,48 +217,15 @@ struct MeshBenchmarks
         benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, mesh_src );
         benchmark.setOperation( String("Copy GPU->CPU") );
         benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, mesh_src );

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (cc))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (cc))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToCentroid,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (cp))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (cp))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToCentroid >( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (pc))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (pc))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }

         {
            const auto decomposedMesh = getDecomposedMesh< EntityDecomposerVersion::ConnectEdgesToPoint,
                                                           EntityDecomposerVersion::ConnectEdgesToPoint >( mesh_src );
            benchmark.setOperation( String("Copy CPU->GPU (decomp (pp))") );
            benchmark_copy< Devices::Host, Devices::Cuda >( benchmark, parameters, decomposedMesh );
            benchmark.setOperation( String("Copy GPU->CPU (decomp (pp))") );
            benchmark_copy< Devices::Cuda, Devices::Host >( benchmark, parameters, decomposedMesh );
         }
         #endif
      }
   };

   static void benchmark_reader( Benchmark & benchmark, const Config::ParameterContainer & parameters, std::shared_ptr< MeshReader > reader )
   {
      if( ! checkDevice< Devices::Host >( parameters ) )
         return;

      auto reset = [&]() {
         reader->reset();
      };
@@ -402,6 +241,9 @@ struct MeshBenchmarks

   static void benchmark_init( Benchmark & benchmark, const Config::ParameterContainer & parameters, std::shared_ptr< MeshReader > reader )
   {
      if( ! checkDevice< Devices::Host >( parameters ) )
         return;

      auto reset = [&]() {
         reader->detectMesh();
      };
@@ -416,27 +258,15 @@ struct MeshBenchmarks
                                       benchmark_func );
   }

   // benchmark_decomposition (Polygonal Mesh)
   template< EntityDecomposerVersion DecomposerVersion,
             typename M,
             std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value, bool > = true >
             EntityDecomposerVersion SubDecomposerVersion = EntityDecomposerVersion::ConnectEdgesToPoint,
             typename M >
   static void benchmark_decomposition( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
   {
      auto benchmark_func = [&] () {
         auto meshBuilder = decomposeMesh< DecomposerVersion >( mesh_src );
      };

      benchmark.time< Devices::Host >( "CPU",
                                       benchmark_func );
   }
      // skip benchmarks on devices which the user did not select
      if( ! checkDevice< Devices::Host >( parameters ) )
         return;

   // benchmark_decomposition (Polyhedral Mesh)
   template< EntityDecomposerVersion DecomposerVersion,
             EntityDecomposerVersion SubDecomposerVersion,
             typename M,
             std::enable_if_t< std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value, bool > = true >
   static void benchmark_decomposition( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
   {
      auto benchmark_func = [&] () {
         auto meshBuilder = decomposeMesh< DecomposerVersion, SubDecomposerVersion >( mesh_src );
      };
@@ -447,9 +277,14 @@ struct MeshBenchmarks

   template< EntityDecomposerVersion DecomposerVersion,
             typename M,
             std::enable_if_t< M::Config::spaceDimension == 3, bool > = true >
             std::enable_if_t< M::Config::spaceDimension == 3 &&
                              (std::is_same< typename M::Config::CellTopology, Topologies::Polygon >::value ||
                               std::is_same< typename M::Config::CellTopology, Topologies::Polyhedron >::value ), bool > = true >
   static void benchmark_planar( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
   {
      if( ! checkDevice< Devices::Host >( parameters ) )
         return;

      auto benchmark_func = [&] () {
         auto meshBuilder = planarCorrection< DecomposerVersion >( mesh_src );
      };
@@ -506,6 +341,9 @@ struct MeshBenchmarks
   template< typename M >
   static void benchmark_memory( Benchmark & benchmark, const Config::ParameterContainer & parameters, const M & mesh_src )
   {
      if( ! checkDevice< Devices::Host >( parameters ) )
            return;

      MemoryBenchmarkResult memResult = testMemoryUsage( parameters, mesh_src );
      auto noop = [](){};
      benchmark.time< TNL::Devices::Host >( "CPU", noop, memResult );
+4 −0
Original line number Diff line number Diff line
@@ -65,6 +65,10 @@ resolveCellTopology( Benchmark& benchmark,
   using VTK::EntityShape;
   switch( reader->getCellShape() )
   {
      case EntityShape::Triangle:
         return setMeshParameters< Topologies::Triangle >( benchmark, metadata, parameters );
      case EntityShape::Tetra:
         return setMeshParameters< Topologies::Tetrahedron >( benchmark, metadata, parameters );
      case EntityShape::Polygon:
         switch( reader->getSpaceDimension() )
         {
+5 −0
Original line number Diff line number Diff line
@@ -30,6 +30,11 @@ template< typename CellTopology, int SpaceDimension >
struct MeshSpaceDimensionTag< MeshTriangulatorConfigTag, CellTopology, SpaceDimension >
{ enum { enabled = ( SpaceDimension == CellTopology::dimension ) }; };

// Polygonal Meshes are enable for the space dimension equal to 2 or 3
template< int SpaceDimension >
struct MeshSpaceDimensionTag< MeshTriangulatorConfigTag, Topologies::Polygon, SpaceDimension >
{ enum { enabled = ( SpaceDimension >= 2 && SpaceDimension <= 3 ) }; };

// Meshes are enabled only for types explicitly listed below.
template<> struct MeshRealTag< MeshTriangulatorConfigTag, float > { enum { enabled = true }; };
template<> struct MeshRealTag< MeshTriangulatorConfigTag, double > { enum { enabled = true }; };