CLBlast/test/performance/client.h

105 lines
4.1 KiB
C
Raw Normal View History

2015-05-30 12:30:43 +02:00
// =================================================================================================
// This file is part of the CLBlast project. The project is licensed under Apache Version 2.0. This
// project loosely follows the Google C++ styleguide and uses a tab-size of two spaces and a max-
// width of 100 characters per line.
//
// Author(s):
// Cedric Nugteren <www.cedricnugteren.nl>
//
// This class implements the performance-test client. It is generic for all CLBlast routines by
// taking a number of routine-specific functions as arguments, such as how to compute buffer sizes
// or how to get the FLOPS count.
//
// This file also provides the common interface to the performance client (see the 'RunClient'
// function for details).
2015-05-30 12:30:43 +02:00
//
// =================================================================================================
#ifndef CLBLAST_TEST_PERFORMANCE_CLIENT_H_
#define CLBLAST_TEST_PERFORMANCE_CLIENT_H_
#include <string>
#include <vector>
// The libraries to test
#include <clBLAS.h>
#include "clblast.h"
#include "internal/utilities.h"
namespace clblast {
// =================================================================================================
// See comment at top of file for a description of the class
template <typename T>
class Client {
public:
2015-05-30 12:30:43 +02:00
// Types of devices to consider
const cl_device_type kDeviceType = CL_DEVICE_TYPE_ALL;
2015-05-30 12:30:43 +02:00
// Shorthand for the routine-specific functions passed to the tester
using Routine = std::function<StatusCode(const Arguments<T>&, const Buffers&, CommandQueue&)>;
using SetMetric = std::function<void(Arguments<T>&)>;
using GetMetric = std::function<size_t(const Arguments<T>&)>;
2015-05-30 12:30:43 +02:00
// The constructor
Client(const Routine run_routine, const Routine run_reference,
const std::vector<std::string> &options,
const GetMetric get_flops, const GetMetric get_bytes);
2015-05-30 12:30:43 +02:00
// Parses all command-line arguments, filling in the arguments structure. If no command-line
// argument is given for a particular argument, it is filled in with a default value.
Arguments<T> ParseArguments(int argc, char *argv[], const GetMetric default_a_ld,
const GetMetric default_b_ld, const GetMetric default_c_ld);
2015-05-30 12:30:43 +02:00
// The main client function, setting-up arguments, matrices, OpenCL buffers, etc. After set-up, it
// calls the client routines.
void PerformanceTest(Arguments<T> &args, const SetMetric set_sizes);
2015-05-30 12:30:43 +02:00
private:
2015-05-30 12:30:43 +02:00
// Runs a function a given number of times and returns the execution time of the shortest instance
double TimedExecution(const size_t num_runs, const Arguments<T> &args, const Buffers &buffers,
CommandQueue &queue, Routine run_blas, const std::string &library_name);
2015-05-30 12:30:43 +02:00
// Prints the header of a performance-data table
void PrintTableHeader(const bool silent, const std::vector<std::string> &args);
// Prints a row of performance data, including results of two libraries
void PrintTableRow(const Arguments<T>& args, const double ms_clblast, const double ms_clblas);
2015-05-30 12:30:43 +02:00
// The routine-specific functions passed to the tester
const Routine run_routine_;
const Routine run_reference_;
const std::vector<std::string> options_;
const GetMetric get_flops_;
const GetMetric get_bytes_;
};
2015-05-30 12:30:43 +02:00
// =================================================================================================
// The interface to the performance client. This is a separate function in the header such that it
// is automatically compiled for each routine, templated by the parameter "C".
template <typename C, typename T>
void RunClient(int argc, char *argv[]) {
// Creates a new client
auto client = Client<T>(C::RunRoutine, C::RunReference, C::GetOptions(),
C::GetFlops, C::GetBytes);
// Simple command line argument parser with defaults
auto args = client.ParseArguments(argc, argv, C::DefaultLDA, C::DefaultLDB, C::DefaultLDC);
if (args.print_help) { return; }
2015-05-30 12:30:43 +02:00
// Runs the client
client.PerformanceTest(args, C::SetSizes);
}
2015-05-30 12:30:43 +02:00
// =================================================================================================
} // namespace clblast
// CLBLAST_TEST_PERFORMANCE_CLIENT_H_
#endif