Commit d80fe511 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Benchmarks: simplified and unified interface of CustomLogging and JsonLogging

parent b6855c09
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ benchmarkDenseMVSynthetic( Benchmark<> & benchmark,
   auto spmvHost = [&]() {
      hostMatrix.vectorProduct( inHostVector, outHostVector );
   };
   benchmark.setOperation( datasetSize );
   benchmark.setDatasetSize( datasetSize );
   benchmark.time< Devices::Host >( reset, "CPU", spmvHost );

#ifdef HAVE_CUDA
+1 −1
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ benchmarkSpMV( Benchmark<> & benchmark,
   auto spmvHost = [&]() {
      hostMatrix.vectorProduct( hostVector, hostVector2 );
   };
   benchmark.setOperation( datasetSize );
   benchmark.setDatasetSize( datasetSize );
   benchmark.time< Devices::Host >( reset, "CPU", spmvHost );
#ifdef HAVE_CUDA
   auto spmvCuda = [&]() {
+12 −34
Original line number Diff line number Diff line
@@ -100,9 +100,7 @@ void
Benchmark< Logger >::
setMetadataColumns( const MetadataColumns & metadata )
{
   if( Logger::metadataColumns != metadata )
      Logger::header_changed = true;
   Logger::metadataColumns = metadata;
   Logger::setMetadataColumns( metadata );
}

template< typename Logger >
@@ -110,48 +108,29 @@ void
Benchmark< Logger >::
setMetadataElement( const typename MetadataColumns::value_type & element )
{
   bool found = false;
   for( auto & it : Logger::metadataColumns )
      if( it.first == element.first ) {
         if( it.second != element.second ) {
            it.second = element.second;
            Logger::header_changed = true;
         }
         found = true;
         break;
      }
   if( ! found ) {
      Logger::metadataColumns.push_back( element );
      Logger::header_changed = true;
   }
   Logger::setMetadataElement( element );
}

template< typename Logger >
void
Benchmark< Logger >::
setOperation( const String & operation,
              const double datasetSize,
setDatasetSize( const double datasetSize,
                const double baseTime )
{
   monitor.setStage( operation.getString() );
   if( Logger::metadataColumns.size() > 0 && String(Logger::metadataColumns[ 0 ].first) == "operation" ) {
      Logger::metadataColumns[ 0 ].second = operation;
   }
   else {
      Logger::metadataColumns.insert( Logger::metadataColumns.begin(), {"operation", operation} );
   }
   setOperation( datasetSize, baseTime );
   Logger::header_changed = true;
   this->datasetSize = datasetSize;
   this->baseTime = baseTime;
}

template< typename Logger >
void
Benchmark< Logger >::
setOperation( const double datasetSize,
setOperation( const String & operation,
              const double datasetSize,
              const double baseTime )
{
   this->datasetSize = datasetSize;
   this->baseTime = baseTime;
   monitor.setStage( operation.getString() );
   Logger::setMetadataElement( {"operation", operation}, 0 );
   setDatasetSize( datasetSize, baseTime );
}

template< typename Logger >
@@ -191,8 +170,7 @@ time( ResetFunction reset,
   if( this->baseTime == 0.0 )
      this->baseTime = result.time;

   Logger::writeTableHeader( performer, result.getTableHeader() );
   Logger::writeTableRow( performer, result.getRowElements() );
   Logger::logResult( performer, result.getTableHeader(), result.getRowElements(), result.getColumnWidthHints() );

   return this->baseTime;
}
+7 −10
Original line number Diff line number Diff line
@@ -74,11 +74,6 @@ class Benchmark
      using typename Logger::MetadataColumns;
      using SolverMonitorType = Solvers::IterativeSolverMonitor< double, int >;

      using typename Logger::CommonLogs;
      using Logger::addCommonLogs;
      using Logger::addLogsMetadata;
      using Logger::writeHeader;

      Benchmark( int loops = 10,
               bool verbose = true,
               String outputMode = "",
@@ -109,6 +104,11 @@ class Benchmark
      // changing MetadataColumns that were set using the previous method.
      void setMetadataElement( const typename MetadataColumns::value_type & element );

      // Sets the dataset size and base time for the calculations of bandwidth
      // and speedup in the benchmarks result.
      void setDatasetSize( const double datasetSize = 0.0, // in GB
                           const double baseTime = 0.0 );

      // Sets current operation -- operations expand the table vertically
      //  - baseTime should be reset to 0.0 for most operations, but sometimes
      //    it is useful to override it
@@ -119,9 +119,6 @@ class Benchmark
                    const double datasetSize = 0.0, // in GB
                    const double baseTime = 0.0 );

      void setOperation( const double datasetSize = 0.0,
                        const double baseTime = 0.0 );

      // Times a single ComputeFunction. Subsequent calls implicitly split
      // the current operation into sub-columns identified by "performer",
      // which are further split into "bandwidth", "time" and "speedup" columns.
+51 −12
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#pragma once

#include "Logging.h"
#include <TNL/Assert.h>

namespace TNL {
namespace Benchmarks {
@@ -36,15 +37,6 @@ public:
      log << ": title = " << title << std::endl;
   }

   virtual void addCommonLogs( const CommonLogs& logs ) override
   {
      for( auto log : logs )
      {
         if( verbose )
            std::cout << log.first << " = " << log.second << std::endl;
      }
   };

   virtual void
   writeMetadata( const MetadataMap & metadata ) override
   {
@@ -60,9 +52,44 @@ public:
         std::cout << std::endl;
   }

   virtual void setMetadataColumns( const MetadataColumns& elements ) override
   {
      // check if a header element changed (i.e. a first item of the pairs)
      if( metadataColumns.size() != elements.size() )
         header_changed = true;
      else
         for( std::size_t i = 0; i < metadataColumns.size(); i++ )
            if( metadataColumns[ i ].first != elements[ i ].first ) {
               header_changed = true;
               break;
            }
      metadataColumns = elements;
   }

   virtual void
   setMetadataElement( const typename MetadataColumns::value_type & element,
                       int insertPosition = -1 /* negative values insert from the end */ ) override
   {
      bool found = false;
      for( auto & it : metadataColumns )
         if( it.first == element.first ) {
            if( it.second != element.second )
               it.second = element.second;
            found = true;
            break;
         }
      if( ! found ) {
         if( insertPosition < 0 )
            metadataColumns.insert( metadataColumns.end() + insertPosition + 1, element );
         else
            metadataColumns.insert( metadataColumns.begin() + insertPosition, element );
         header_changed = true;
      }
   }

   void
   writeTableHeader( const std::string & spanningElement,
                     const HeaderElements & subElements ) override
                     const HeaderElements & subElements )
   {
      if( verbose && header_changed ) {
         for( auto & it : metadataColumns ) {
@@ -93,9 +120,9 @@ public:
      }
   }

   virtual void
   void
   writeTableRow( const std::string & spanningElement,
                  const RowElements & subElements ) override
                  const RowElements & subElements )
   {
      if( verbose ) {
         for( auto & it : metadataColumns ) {
@@ -122,6 +149,18 @@ public:
      }
   }

   virtual void
   logResult( const std::string& spanningElement,
              const HeaderElements& headerElements,
              const RowElements& rowElements,
              const WidthHints& columnWidthHints ) override
   {
      TNL_ASSERT_EQ( headerElements.size(), rowElements.size(), "elements must have equal sizes" );
      TNL_ASSERT_EQ( headerElements.size(), columnWidthHints.size(), "elements must have equal sizes" );
      writeTableHeader( spanningElement, headerElements );
      writeTableRow( spanningElement, rowElements );
   }

   virtual void
   writeErrorMessage( const std::string& message ) override
   {
Loading