HEBench
hebench::TestHarness::PartialBenchmarkDescriptor Class Referenceabstract

Provides boilerplate implementation to common methods of interface IBenchmarkDescription and implements some mechanisms to ease implementation of the interface. More...

#include <hebench_ibenchmark.h>

Inheritance diagram for hebench::TestHarness::PartialBenchmarkDescriptor:
Collaboration diagram for hebench::TestHarness::PartialBenchmarkDescriptor:

Classes

struct  WorkloadDescriptionOutput
 Bundles values that need to be filled by a workload during completeWorkloadDescription(). More...
 

Public Member Functions

 PartialBenchmarkDescriptor ()
 
 ~PartialBenchmarkDescriptor () override
 
DescriptionToken::Ptr matchDescriptor (const Engine &engine, const BenchmarkDescription::Backend &backend_desc, const BenchmarkDescription::Configuration &config) const override final
 Implementation of IBenchmarkDescriptor::matchDescriptor(). More...
 
- Public Member Functions inherited from hebench::TestHarness::IBenchmarkDescriptor
 IBenchmarkDescriptor ()=default
 
virtual ~IBenchmarkDescriptor ()=default
 
virtual PartialBenchmarkcreateBenchmark (std::shared_ptr< Engine > p_engine, const DescriptionToken &description_token)=0
 Creates the represented IBenchmark object that can perform the workload specified by the HEBench benchmark descriptor. More...
 
virtual void destroyBenchmark (PartialBenchmark *p_bench)=0
 Destroys an object returned by createBenchmark(). More...
 

Static Public Member Functions

static bool getForceConfigValues ()
 Specifies whether frontend will override backend descriptors using configuration data or not. More...
 
static void setForceConfigValues (bool value)
 Sets whether frontend will override backend descriptors using configuration data or not. More...
 
static std::uint64_t computeSampleSizes (std::uint64_t *sample_sizes, std::size_t param_count, const std::vector< std::uint64_t > &config_sample_sizes, const hebench::APIBridge::BenchmarkDescriptor &bench_desc, std::uint64_t default_sample_size_fallback, bool force_config)
 Extracts the batch sizes for a workload from a specified HEBench API benchmark descriptor. More...
 

Protected Member Functions

virtual bool matchBenchmarkDescriptor (const hebench::APIBridge::BenchmarkDescriptor &bench_desc, const std::vector< hebench::APIBridge::WorkloadParam > &w_params) const =0
 Determines if the represented benchmark can perform the workload described by a specified HEBench benchmark descriptor and workload parameters. More...
 
virtual void completeWorkloadDescription (WorkloadDescriptionOutput &output, const Engine &engine, const BenchmarkDescription::Backend &backend_desc, const BenchmarkDescription::Configuration &config) const =0
 Completes the description for the matched benchmark. More...
 
- Protected Member Functions inherited from hebench::TestHarness::IBenchmarkDescriptor
DescriptionToken::Ptr createToken (const BenchmarkDescription::Backend &backend_desc, const BenchmarkDescription::Configuration &config, const BenchmarkDescription::Description &text_desc) const
 Creates a DescriptionToken object associated to this IBenchmarkDescription object using the specified benchmark description. More...
 

Static Protected Member Functions

static std::unordered_set< std::size_t > getCipherParamPositions (std::uint32_t cipher_param_mask)
 
static std::string getCategoryName (hebench::APIBridge::Category category)
 
static std::string getDataTypeName (hebench::APIBridge::DataType data_type)
 
static void completeCategoryParams (hebench::APIBridge::BenchmarkDescriptor &out_descriptor, const hebench::APIBridge::BenchmarkDescriptor &in_descriptor, const BenchmarkDescription::Configuration &config, bool force_config)
 Completes common elements of category parameters in a descriptor using the specified configuration. More...
 

Detailed Description

Provides boilerplate implementation to common methods of interface IBenchmarkDescription and implements some mechanisms to ease implementation of the interface.

Clients looking to implement interface IBenchmarkDescription can derive from this class.

This class provides a default implementation to IBenchmarkDescription::matchBenchmarkDescriptor(). This implementation calls PartialBenchmarkDescriptor::matchBenchmarkDescriptor(const hebench::APIBridge::BenchmarkDescriptor &), and then, only if true is returned, it fills out the Description structure with general information about the matched benchmark; completeDescription() is called afterwards for clients to add or modify the general description.

Clients need to implement:

Definition at line 182 of file hebench_ibenchmark.h.


Class Documentation

◆ hebench::TestHarness::PartialBenchmarkDescriptor::WorkloadDescriptionOutput

struct hebench::TestHarness::PartialBenchmarkDescriptor::WorkloadDescriptionOutput

Bundles values that need to be filled by a workload during completeWorkloadDescription().

See also
completeWorkloadDescription()

Definition at line 293 of file hebench_ibenchmark.h.

Collaboration diagram for hebench::TestHarness::PartialBenchmarkDescriptor::WorkloadDescriptionOutput:
Class Members
BenchmarkDescriptor concrete_descriptor Benchmark descriptor completed with concrete values assigned to configurable fields.
size_t operation_params_count Number of parameters for the represented workload operation.
string workload_base_name Human-readable friendly name for the represented workload to be used for its description on the report.
string workload_header Workload specific information to be added to the report header.

If this is not the empty string, it will be appended in the report to a pre-generated header in CSV format.

string workload_name Human-readable friendly name for the represented workload to be used for its description on the report.

Constructor & Destructor Documentation

◆ PartialBenchmarkDescriptor()

hebench::TestHarness::PartialBenchmarkDescriptor::PartialBenchmarkDescriptor ( )

Definition at line 44 of file hebench_ibenchmark.cpp.

◆ ~PartialBenchmarkDescriptor()

hebench::TestHarness::PartialBenchmarkDescriptor::~PartialBenchmarkDescriptor ( )
override

Definition at line 48 of file hebench_ibenchmark.cpp.

Member Function Documentation

◆ completeCategoryParams()

void hebench::TestHarness::PartialBenchmarkDescriptor::completeCategoryParams ( hebench::APIBridge::BenchmarkDescriptor out_descriptor,
const hebench::APIBridge::BenchmarkDescriptor in_descriptor,
const BenchmarkDescription::Configuration config,
bool  force_config 
)
staticprotected

Completes common elements of category parameters in a descriptor using the specified configuration.

Parameters
out_descriptor
in_descriptor
config
force_config

It sets the common values of cat_params based on the force config policy.

Common cat_params fields:

  • cat_params.min_test_time_ms

Definition at line 193 of file hebench_ibenchmark.cpp.

◆ completeWorkloadDescription()

virtual void hebench::TestHarness::PartialBenchmarkDescriptor::completeWorkloadDescription ( WorkloadDescriptionOutput output,
const Engine engine,
const BenchmarkDescription::Backend backend_desc,
const BenchmarkDescription::Configuration config 
) const
protectedpure virtual

Completes the description for the matched benchmark.

Parameters
[out]outputStructure to receive the completed description.
[in]engineEngine that requested the matching.
[in]backend_descBackend descriptor to be described.
[in]configConfiguration for the benchmark being described.
Exceptions
std::invalid_argumentif fields in backend_desc or config are not supported or invalid.

This method will only be called if PartialBenchmarkDescriptor::matchBenchmarkDescriptor(const hebench::APIBridge::BenchmarkDescriptor &, const std::vector<hebench::APIBridge::WorkloadParam> &) returns true.

All fields in config are valid. In backend_desc: field operation_params_count is expected to be returned by this method; field descriptor is the original returned from the backend, and it is expected that this method returns the final, concrete version. All other input parameters are valid. Use these values to complete all fields in output.

This method must fill out all fields in the output structure. Field workload_header may be set to empty string, but workload_name and operation_params_count must be set to the correct values. Field concrete_descriptor must be set to the completed benchmark descriptor, where all configurable values are replaced by the concrete, final values. See WorkloadDescriptionOutput for more details.

If extra header information returned in workload_header is not empty, it will be appended in the report to a pre-generated header in CSV format. The following is an example of a pre-generated header:

Specifications,
, Encryption,
, , Scheme, CKKS
, , Security, 128 bits
, , Poly mod degree, 8192
, , Primes, 3
, , Warmup iterations, 2
, , Minimum test time (ms), 2000
, Workload, Element-wise Vector Addition (1000)
, , Data type, Float64
, , Encrypted parameters, All
@ Float64
64 bits IEEE 754 standard floating point real numbers.
Definition: types.h:306
Category
Defines all possible categories for each workload.
Definition: types.h:391
std::int32_t Scheme
Open-ended homomorphic encryption scheme ID.
Definition: types.h:406
std::int32_t Security
Open-ended homomorphic encryption scheme security ID.
Definition: types.h:412
Workload
Defines all possible workloads.
Definition: types.h:83

output .workload_header will be appended at the next line immediately after this.

See also
WorkloadDescriptionOutput

Implemented in hebench::TestHarness::SimpleSetIntersection::Offline::BenchmarkDescriptor, hebench::TestHarness::SimpleSetIntersection::Latency::BenchmarkDescriptor, hebench::TestHarness::SimpleSetIntersection::BenchmarkDescriptorCategory, hebench::TestHarness::MatrixMultiply::Offline::BenchmarkDescriptor, hebench::TestHarness::MatrixMultiply::Latency::BenchmarkDescriptor, hebench::TestHarness::MatrixMultiply::BenchmarkDescriptorCategory, hebench::TestHarness::LogisticRegression::Offline::BenchmarkDescriptor, hebench::TestHarness::LogisticRegression::Latency::BenchmarkDescriptor, hebench::TestHarness::LogisticRegression::BenchmarkDescriptorCategory, hebench::TestHarness::GenericWL::Offline::BenchmarkDescriptor, hebench::TestHarness::GenericWL::Latency::BenchmarkDescriptor, hebench::TestHarness::GenericWL::BenchmarkDescriptorCategory, hebench::TestHarness::EltwiseMult::Offline::BenchmarkDescriptor, hebench::TestHarness::EltwiseMult::Latency::BenchmarkDescriptor, hebench::TestHarness::EltwiseMult::BenchmarkDescriptorCategory, hebench::TestHarness::EltwiseAdd::Offline::BenchmarkDescriptor, hebench::TestHarness::EltwiseAdd::Latency::BenchmarkDescriptor, hebench::TestHarness::EltwiseAdd::BenchmarkDescriptorCategory, hebench::TestHarness::DotProduct::Offline::BenchmarkDescriptor, hebench::TestHarness::DotProduct::Latency::BenchmarkDescriptor, and hebench::TestHarness::DotProduct::BenchmarkDescriptorCategory.

◆ computeSampleSizes()

std::uint64_t hebench::TestHarness::PartialBenchmarkDescriptor::computeSampleSizes ( std::uint64_t *  sample_sizes,
std::size_t  param_count,
const std::vector< std::uint64_t > &  config_sample_sizes,
const hebench::APIBridge::BenchmarkDescriptor bench_desc,
std::uint64_t  default_sample_size_fallback,
bool  force_config 
)
static

Extracts the batch sizes for a workload from a specified HEBench API benchmark descriptor.

Parameters
[out]sample_sizesArray with param_count elements to receive the sample sizes for each operation parameter. This is the final value to be used during testing.
[in]param_countNumber of parameters for the workload operation.
[in]config_sample_sizesUser-requested (configured) sample sizes per operand.
[in]bench_descHEBench API benchmark descriptor from which to extract the workload batch sizes.
[in]default_sample_size_fallbackFallback sample size for when none is specified in bench_desc or default_sample_sizes . Must be greater than 0.
[in]force_configIf true default_sample_sizes values have priority over the those in bench_desc .cat_params.offline.data_count
Returns
The batch size for the result of the operation.

For an operation parameter the sample size priority is:

For force_config == false

  1. backend specified (bench_desc.cat_params.offline.data_count[i])
  2. benchmark specific in config file (config_sample_sizes[i])
  3. global config file
  4. workload specification

For force_config == false

  1. benchmark specific in config file (config_sample_sizes[i])
  2. backend specified (bench_desc.cat_params.offline.data_count[i])
  3. global config file
  4. workload specification

If any of these is 0, then the next down the list is used. Workload specification must always be greater than 0. Workload specification sizes are always supported. Sample sizes from any other sources are requests and may be satisfied based on actual dataset size.

Definition at line 114 of file hebench_ibenchmark.cpp.

◆ getCategoryName()

std::string hebench::TestHarness::PartialBenchmarkDescriptor::getCategoryName ( hebench::APIBridge::Category  category)
staticprotected

Definition at line 62 of file hebench_ibenchmark.cpp.

◆ getCipherParamPositions()

std::unordered_set< std::size_t > hebench::TestHarness::PartialBenchmarkDescriptor::getCipherParamPositions ( std::uint32_t  cipher_param_mask)
staticprotected

Definition at line 52 of file hebench_ibenchmark.cpp.

◆ getDataTypeName()

std::string hebench::TestHarness::PartialBenchmarkDescriptor::getDataTypeName ( hebench::APIBridge::DataType  data_type)
staticprotected

Definition at line 84 of file hebench_ibenchmark.cpp.

◆ getForceConfigValues()

static bool hebench::TestHarness::PartialBenchmarkDescriptor::getForceConfigValues ( )
inlinestatic

Specifies whether frontend will override backend descriptors using configuration data or not.

Returns
true to have the frontend override the backend descriptors.
false to have the frontend respect the backend descriptors.

When true, frontend implementations should attempt to override backend descriptors with the corresponding configuration values. In this case, it is expected that backend implementations will validate the concrete benchmark descriptor during hebench::APIBridge::initBenchmark() to detect invalid configurations.

If false, frontend implementations should maintain non-flexible values of backend descriptors and ignore respective configuration data.

Definition at line 205 of file hebench_ibenchmark.h.

◆ matchBenchmarkDescriptor()

virtual bool hebench::TestHarness::PartialBenchmarkDescriptor::matchBenchmarkDescriptor ( const hebench::APIBridge::BenchmarkDescriptor bench_desc,
const std::vector< hebench::APIBridge::WorkloadParam > &  w_params 
) const
protectedpure virtual

Determines if the represented benchmark can perform the workload described by a specified HEBench benchmark descriptor and workload parameters.

Parameters
[in]bench_descDescriptor to which compare.
[in]w_paramsArguments for the workload parameters.
Returns
true if the represented benchmark can perform the specified described workload.
false if no match was found.

This method is used by BenchmarkFactory::createBenchmark() to select the appropriate benchmark to create based on the descriptor.

See also
IBenchmarkDescriptor::matchDescriptor()

Implemented in hebench::TestHarness::SimpleSetIntersection::Offline::BenchmarkDescriptor, hebench::TestHarness::SimpleSetIntersection::Latency::BenchmarkDescriptor, hebench::TestHarness::SimpleSetIntersection::BenchmarkDescriptorCategory, hebench::TestHarness::MatrixMultiply::Offline::BenchmarkDescriptor, hebench::TestHarness::MatrixMultiply::Latency::BenchmarkDescriptor, hebench::TestHarness::MatrixMultiply::BenchmarkDescriptorCategory, hebench::TestHarness::LogisticRegression::Offline::BenchmarkDescriptor, hebench::TestHarness::LogisticRegression::Latency::BenchmarkDescriptor, hebench::TestHarness::LogisticRegression::BenchmarkDescriptorCategory, hebench::TestHarness::GenericWL::Offline::BenchmarkDescriptor, hebench::TestHarness::GenericWL::Latency::BenchmarkDescriptor, hebench::TestHarness::GenericWL::BenchmarkDescriptorCategory, hebench::TestHarness::EltwiseMult::Offline::BenchmarkDescriptor, hebench::TestHarness::EltwiseMult::Latency::BenchmarkDescriptor, hebench::TestHarness::EltwiseMult::BenchmarkDescriptorCategory, hebench::TestHarness::EltwiseAdd::Offline::BenchmarkDescriptor, hebench::TestHarness::EltwiseAdd::Latency::BenchmarkDescriptor, hebench::TestHarness::EltwiseAdd::BenchmarkDescriptorCategory, hebench::TestHarness::DotProduct::Offline::BenchmarkDescriptor, hebench::TestHarness::DotProduct::Latency::BenchmarkDescriptor, and hebench::TestHarness::DotProduct::BenchmarkDescriptorCategory.

◆ matchDescriptor()

IBenchmarkDescriptor::DescriptionToken::Ptr hebench::TestHarness::PartialBenchmarkDescriptor::matchDescriptor ( const Engine engine,
const BenchmarkDescription::Backend backend_desc,
const BenchmarkDescription::Configuration config 
) const
finaloverridevirtual

Implementation of IBenchmarkDescriptor::matchDescriptor().

Clients cannot override this method.

This method calls the internal PartialBenchmarkDescriptor::matchBenchmarkDescriptor() which clients must implement. If matchBenchmarkDescriptor() returns true, then method PartialBenchmarkDescriptor::completeWorkloadDescription() is called to complete the description with information specific to the workload.

See also
PartialBenchmarkDescriptor::matchBenchmarkDescriptor(), IBenchmarkDescriptor::matchDescriptor()

Implements hebench::TestHarness::IBenchmarkDescriptor.

Definition at line 163 of file hebench_ibenchmark.cpp.

◆ setForceConfigValues()

static void hebench::TestHarness::PartialBenchmarkDescriptor::setForceConfigValues ( bool  value)
inlinestatic

Sets whether frontend will override backend descriptors using configuration data or not.

Parameters
[in]valueNew value to set.

When set to true, frontend implementations should attempt to override backend descriptors with the corresponding configuration values. In this case, it is expected that backend implementations will validate the concrete benchmark descriptor during hebench::APIBridge::initBenchmark() to detect invalid configurations.

If set to false, frontend implementations should maintain non-flexible values of backend descriptors and ignore respective configuration data.

Definition at line 219 of file hebench_ibenchmark.h.


The documentation for this class was generated from the following files: