blob: fb6075992319e0e35eac13b3d319bfd62286d8ec [file] [log] [blame]
//
// Copyright (c) 2018 Stefan Seefeld
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or
// copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef opencl_benchmark_hpp_
#define opencl_benchmark_hpp_
#define BOOST_UBLAS_ENABLE_OPENCL
#include <boost/numeric/ublas/opencl.hpp>
#include "../benchmark.hpp"
#include "init.hpp"
#include <memory>
namespace boost { namespace numeric { namespace ublas { namespace benchmark {
namespace opencl {
struct base
{
base(compute::device d = compute::system::default_device())
: context(d),
queue(context, d)
{}
compute::context context;
compute::command_queue queue;
};
template <typename T, bool C> struct data_factory;
template <typename T>
struct data_factory<T, true>
{
typedef T type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long) { return ptr_type(new T());}
};
template <typename T>
struct data_factory<T, false>
{
typedef T type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long, compute::context) { return ptr_type(new T());}
};
template <>
struct data_factory<void, true>
{
typedef void type;
typedef void *ptr_type;
static ptr_type create(long) { return 0;}
};
template <>
struct data_factory<void, false>
{
typedef void type;
typedef void *ptr_type;
static ptr_type create(long, compute::context) { return 0;}
};
template <typename T>
struct data_factory<ublas::vector<T>, true>
{
typedef ublas::vector<T> type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long l) { return ptr_type(new type(l));}
};
template <typename T>
struct data_factory<ublas::vector<T>, false>
{
typedef ublas::vector<T, ublas::opencl::storage> type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long l, compute::context c)
{ return ptr_type(new type(l, c));}
};
template <typename T, typename L>
struct data_factory<ublas::matrix<T, L>, true>
{
typedef ublas::matrix<T, L> type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long l)
{ return ptr_type(new type(l, l));}
};
template <typename T, typename L>
struct data_factory<ublas::matrix<T, L>, false>
{
typedef ublas::matrix<T, L, ublas::opencl::storage> type;
typedef std::unique_ptr<type> ptr_type;
static ptr_type create(long l, compute::context c)
{ return ptr_type(new type(l, l, c));}
};
template <typename S, bool> class benchmark;
template <typename R, typename O>
class benchmark<R(O), true> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name)
: base(),
ublas::benchmark::benchmark(name + " with copy")
{}
virtual void setup(long l)
{
r = data_factory<R, true>::create(l);
a = data_factory<O, true>::create(l);
init(*a, l, 200);
}
typename data_factory<R, true>::ptr_type r;
typename data_factory<O, true>::ptr_type a;
};
template <typename R, typename O1, typename O2>
class benchmark<R(O1, O2), true> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name)
: base(),
ublas::benchmark::benchmark(name + " with copy")
{}
virtual void setup(long l)
{
r = data_factory<R, true>::create(l);
a = data_factory<O1, true>::create(l);
init(*a, l, 200);
b = data_factory<O2, true>::create(l);
init(*b, l, 200);
}
typename data_factory<R, true>::ptr_type r;
typename data_factory<O1, true>::ptr_type a;
typename data_factory<O2, true>::ptr_type b;
};
template <typename R, typename O1, typename O2, typename O3>
class benchmark<R(O1, O2, O3), true> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name)
: base(),
ublas::benchmark::benchmark(name + " with copy")
{}
virtual void setup(long l)
{
r = data_factory<R, true>::create(l);
a = data_factory<O1, true>::create(l);
init(*a, l, 200);
b = data_factory<O2, true>::create(l);
init(*b, l, 200);
c = data_factory<O3, true>::create(l);
init(*c, l, 200);
}
typename data_factory<R, true>::ptr_type r;
typename data_factory<O1, true>::ptr_type a;
typename data_factory<O2, true>::ptr_type b;
typename data_factory<O3, true>::ptr_type c;
};
template <typename R, typename O>
class benchmark<R(O), false> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name)
: base(),
ublas::benchmark::benchmark(name + " w/o copy")
{}
virtual void setup(long l)
{
r = data_factory<R, false>::create(l, context);
a = data_factory<O, false>::create(l, context);
init(*a, l, 200);
}
typename data_factory<R, false>::ptr_type r;
typename data_factory<O, false>::ptr_type a;
};
template <typename R, typename O1, typename O2>
class benchmark<R(O1, O2), false> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name) : base(), ublas::benchmark::benchmark(name + " w/o copy") {}
virtual void setup(long l)
{
r = data_factory<R, false>::create(l, context);
a = data_factory<O1, false>::create(l, context);
init(*a, l, 200);
b = data_factory<O2, false>::create(l, context);
init(*b, l, 200);
}
typename data_factory<R, false>::ptr_type r;
typename data_factory<O1, false>::ptr_type a;
typename data_factory<O2, false>::ptr_type b;
};
template <typename R, typename O1, typename O2, typename O3>
class benchmark<R(O1, O2, O3), false> : public base, public ublas::benchmark::benchmark
{
public:
benchmark(std::string const &name) : base(), ublas::benchmark::benchmark(name + " w/o copy") {}
virtual void setup(long l)
{
r = data_factory<R, false>::create(l, context);
a = data_factory<O1, false>::create(l, context);
init(*a, l, 200);
b = data_factory<O2, false>::create(l, context);
init(*b, l, 200);
c = data_factory<O3, false>::create(l, context);
init(*c, l, 200);
}
typename data_factory<R, false>::ptr_type r;
typename data_factory<O1, false>::ptr_type a;
typename data_factory<O2, false>::ptr_type b;
typename data_factory<O3, false>::ptr_type c;
};
}}}}}
#endif