Code quality: destructors of static global objects will no longer call external dependencies. Manual cleaning possible through backend::release()
This should solve errors when libOpenCL's ICD was unloaded prior to libisaac.
This commit is contained in:
@@ -171,7 +171,7 @@ void bench(isc::numeric_type dtype, std::string operation)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int dtsize = isc::size_of(dtype);
|
unsigned int dtsize = isc::size_of(dtype);
|
||||||
isc::driver::CommandQueue & queue = isc::driver::backend::queues(isc::driver::backend::default_context())[0];
|
isc::driver::CommandQueue & queue = isc::driver::backend::queue(isc::driver::backend::default_context(),0);
|
||||||
std::map<std::string, std::string> metric{ {"axpy", "GB/s"}, {"dot", "GB/s"}, {"gemv", "GB/s"}, {"gemm", "GFLOPS"}};
|
std::map<std::string, std::string> metric{ {"axpy", "GB/s"}, {"dot", "GB/s"}, {"gemv", "GB/s"}, {"gemm", "GFLOPS"}};
|
||||||
isc::array flush(1e6, dtype);
|
isc::array flush(1e6, dtype);
|
||||||
std::cout << "#" << operation << " (" << metric[operation] << ")" << std::endl;
|
std::cout << "#" << operation << " (" << metric[operation] << ")" << std::endl;
|
||||||
@@ -403,7 +403,7 @@ int main(int argc, char* argv[])
|
|||||||
isc::driver::backend::queue_properties = CL_QUEUE_PROFILING_ENABLE;
|
isc::driver::backend::queue_properties = CL_QUEUE_PROFILING_ENABLE;
|
||||||
|
|
||||||
int device_idx = 0;
|
int device_idx = 0;
|
||||||
std::list<isc::driver::Context> const & contexts = isc::driver::backend::contexts();
|
std::list<isc::driver::Context const *> const & contexts = isc::driver::backend::contexts();
|
||||||
|
|
||||||
std::string operation;
|
std::string operation;
|
||||||
if(contexts.size() > 1)
|
if(contexts.size() > 1)
|
||||||
@@ -413,12 +413,11 @@ int main(int argc, char* argv[])
|
|||||||
std::cerr << "usage : blas-bench DEVICE_IDX OPERATION" << std::endl;
|
std::cerr << "usage : blas-bench DEVICE_IDX OPERATION" << std::endl;
|
||||||
std::cout << "Devices available: " << std::endl;
|
std::cout << "Devices available: " << std::endl;
|
||||||
unsigned int current=0;
|
unsigned int current=0;
|
||||||
for(isc::driver::Context const & context: contexts)
|
for(isc::driver::Context const * context: contexts)
|
||||||
for(isc::driver::CommandQueue const & queue: isc::driver::backend::queues(context))
|
{
|
||||||
{
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
isc::driver::Device device = queue.device();
|
std::cout << current++ << ": " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << current++ << ": " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
}
|
||||||
}
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
device_idx = atoi(argv[1]);
|
device_idx = atoi(argv[1]);
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "isaac/driver/common.h"
|
#include "isaac/driver/common.h"
|
||||||
|
#include "isaac/driver/program.h"
|
||||||
#include "isaac/defines.h"
|
#include "isaac/defines.h"
|
||||||
|
|
||||||
namespace isaac
|
namespace isaac
|
||||||
@@ -18,30 +19,37 @@ class CommandQueue;
|
|||||||
|
|
||||||
class ISAACAPI backend
|
class ISAACAPI backend
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
typedef std::list<Context> context_container;
|
|
||||||
typedef std::map<Context*, std::vector<CommandQueue>> queues_container;
|
|
||||||
private:
|
private:
|
||||||
static void cuinit();
|
static void cuinit();
|
||||||
static void clinit();
|
static void clinit();
|
||||||
static void init();
|
static void init();
|
||||||
public:
|
public:
|
||||||
static std::list<Context> const & contexts();
|
class programs
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static Program const & add(Context const & scontext, std::string const & name, std::string const & src);
|
||||||
|
static Program const * find(Context const & context, std::string const & name);
|
||||||
|
static void release();
|
||||||
|
private:
|
||||||
|
static std::map<driver::Context const *, std::map<std::string, Program*> > programs_;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::list<Context const *> const & contexts();
|
||||||
static Context const & import(cl_context context);
|
static Context const & import(cl_context context);
|
||||||
static Context const & default_context();
|
static Context const & default_context();
|
||||||
static std::vector<CommandQueue> & queues(Context const &);
|
static void synchronize(Context const &);
|
||||||
|
static CommandQueue & queue(Context const &, unsigned int id);
|
||||||
|
|
||||||
|
static void release();
|
||||||
private:
|
private:
|
||||||
static std::list<Context> contexts_;
|
static std::list<Context const *> contexts_;
|
||||||
static std::map<Context*, std::vector<CommandQueue>> queues_;
|
static std::map<Context const *, std::vector<CommandQueue*>> queues_;
|
||||||
public:
|
public:
|
||||||
static unsigned int default_device;
|
static unsigned int default_device;
|
||||||
static cl_command_queue_properties queue_properties;
|
static cl_command_queue_properties queue_properties;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ISAACAPI void synchronize(std::vector<CommandQueue> const &);
|
|
||||||
ISAACAPI void synchronize(Context const &);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,15 +29,6 @@ private:
|
|||||||
HANDLE_TYPE(cl_program, CUmodule) h_;
|
HANDLE_TYPE(cl_program, CUmodule) h_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ISAACAPI ProgramsHandler
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static Program const & add(Context const & scontext, std::string const & name, std::string const & src);
|
|
||||||
static Program const * find(Context const & context, std::string const & name);
|
|
||||||
private:
|
|
||||||
static std::map<driver::Context const *, std::map<std::string, Program> > programs_;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -238,7 +238,7 @@ struct execution_options_type
|
|||||||
{
|
{
|
||||||
if(queue_)
|
if(queue_)
|
||||||
return *queue_;
|
return *queue_;
|
||||||
return driver::backend::queues(context)[queue_id_];
|
return driver::backend::queue(context, queue_id_);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<driver::Event>* events;
|
std::list<driver::Event>* events;
|
||||||
|
@@ -286,7 +286,7 @@ namespace detail
|
|||||||
template<class T>
|
template<class T>
|
||||||
void copy(driver::Context const & context, driver::Buffer const & data, T value)
|
void copy(driver::Context const & context, driver::Buffer const & data, T value)
|
||||||
{
|
{
|
||||||
driver::backend::queues(context)[0].write(data, CL_TRUE, 0, sizeof(T), (void*)&value);
|
driver::backend::queue(context,0).write(data, CL_TRUE, 0, sizeof(T), (void*)&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -323,7 +323,7 @@ void scalar::inject(values_holder & v) const
|
|||||||
int_t dtsize = size_of(dtype_);
|
int_t dtsize = size_of(dtype_);
|
||||||
#define HANDLE_CASE(DTYPE, VAL) \
|
#define HANDLE_CASE(DTYPE, VAL) \
|
||||||
case DTYPE:\
|
case DTYPE:\
|
||||||
driver::backend::queues(context_)[0].read(data_, CL_TRUE, start_[0]*dtsize, dtsize, (void*)&v.VAL); break;\
|
driver::backend::queue(context_, 0).read(data_, CL_TRUE, start_[0]*dtsize, dtsize, (void*)&v.VAL); break;\
|
||||||
|
|
||||||
switch(dtype_)
|
switch(dtype_)
|
||||||
{
|
{
|
||||||
@@ -370,7 +370,7 @@ TYPE scalar::cast() const
|
|||||||
|
|
||||||
scalar& scalar::operator=(value_scalar const & s)
|
scalar& scalar::operator=(value_scalar const & s)
|
||||||
{
|
{
|
||||||
driver::CommandQueue& queue = driver::backend::queues(context_)[0];
|
driver::CommandQueue& queue = driver::backend::queue(context_, 0);
|
||||||
int_t dtsize = size_of(dtype_);
|
int_t dtsize = size_of(dtype_);
|
||||||
|
|
||||||
#define HANDLE_CASE(TYPE, CLTYPE) case TYPE:\
|
#define HANDLE_CASE(TYPE, CLTYPE) case TYPE:\
|
||||||
@@ -801,16 +801,14 @@ void copy(void const * data, array& x, driver::CommandQueue & queue, bool blocki
|
|||||||
unsigned int dtypesize = size_of(x.dtype());
|
unsigned int dtypesize = size_of(x.dtype());
|
||||||
if(x.ld()==x.shape()[0])
|
if(x.ld()==x.shape()[0])
|
||||||
{
|
{
|
||||||
queue.write(x.data(), CL_FALSE, 0, x.dsize()*dtypesize, data);
|
queue.write(x.data(), blocking, 0, x.dsize()*dtypesize, data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
array tmp(x.shape()[0], x.shape()[1], x.dtype(), x.context());
|
array tmp(x.shape()[0], x.shape()[1], x.dtype(), x.context());
|
||||||
queue.write(x.data(), CL_FALSE, 0, tmp.dsize()*dtypesize, data);
|
queue.write(x.data(), blocking, 0, tmp.dsize()*dtypesize, data);
|
||||||
x = tmp;
|
x = tmp;
|
||||||
}
|
}
|
||||||
if(blocking)
|
|
||||||
driver::synchronize(x.context());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy(array const & x, void* data, driver::CommandQueue & queue, bool blocking)
|
void copy(array const & x, void* data, driver::CommandQueue & queue, bool blocking)
|
||||||
@@ -818,23 +816,21 @@ void copy(array const & x, void* data, driver::CommandQueue & queue, bool blocki
|
|||||||
unsigned int dtypesize = size_of(x.dtype());
|
unsigned int dtypesize = size_of(x.dtype());
|
||||||
if(x.ld()==x.shape()[0])
|
if(x.ld()==x.shape()[0])
|
||||||
{
|
{
|
||||||
queue.read(x.data(), CL_FALSE, 0, x.dsize()*dtypesize, data);
|
queue.read(x.data(), blocking, 0, x.dsize()*dtypesize, data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
array tmp(x.shape()[0], x.shape()[1], x.dtype(), x.context());
|
array tmp(x.shape()[0], x.shape()[1], x.dtype(), x.context());
|
||||||
tmp = x;
|
tmp = x;
|
||||||
queue.read(tmp.data(), CL_FALSE, 0, tmp.dsize()*dtypesize, data);
|
queue.read(tmp.data(), blocking, 0, tmp.dsize()*dtypesize, data);
|
||||||
}
|
}
|
||||||
if(blocking)
|
|
||||||
driver::synchronize(x.context());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy(void const *data, array &x, bool blocking)
|
void copy(void const *data, array &x, bool blocking)
|
||||||
{ copy(data, x, driver::backend::queues(x.context())[0], blocking); }
|
{ copy(data, x, driver::backend::queue(x.context(), 0), blocking); }
|
||||||
|
|
||||||
void copy(array const & x, void* data, bool blocking)
|
void copy(array const & x, void* data, bool blocking)
|
||||||
{ copy(x, data, driver::backend::queues(x.context())[0], blocking); }
|
{ copy(x, data, driver::backend::queue(x.context(), 0), blocking); }
|
||||||
|
|
||||||
//std::vector<>
|
//std::vector<>
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -859,11 +855,11 @@ void copy(array const & x, std::vector<T> & cx, driver::CommandQueue & queue, bo
|
|||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void copy(std::vector<T> const & cx, array & x, bool blocking)
|
void copy(std::vector<T> const & cx, array & x, bool blocking)
|
||||||
{ copy(cx, x, driver::backend::queues(x.context())[0], blocking); }
|
{ copy(cx, x, driver::backend::queue(x.context(), 0), blocking); }
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void copy(array const & x, std::vector<T> & cx, bool blocking)
|
void copy(array const & x, std::vector<T> & cx, bool blocking)
|
||||||
{ copy(x, cx, driver::backend::queues(x.context())[0], blocking); }
|
{ copy(x, cx, driver::backend::queue(x.context(), 0), blocking); }
|
||||||
|
|
||||||
#define INSTANTIATE(T) \
|
#define INSTANTIATE(T) \
|
||||||
template void ISAACAPI copy<T>(std::vector<T> const &, array &, driver::CommandQueue&, bool);\
|
template void ISAACAPI copy<T>(std::vector<T> const &, array &, driver::CommandQueue&, bool);\
|
||||||
|
@@ -21,8 +21,8 @@ void backend::cuinit()
|
|||||||
for(int i = 0 ; i < N ; ++i)
|
for(int i = 0 ; i < N ; ++i)
|
||||||
{
|
{
|
||||||
Device device(i);
|
Device device(i);
|
||||||
contexts_.emplace_back(device);
|
contexts_.emplace_back(new Context(device));
|
||||||
queues_.insert(std::make_pair(&contexts_.back(), std::vector<CommandQueue>{CommandQueue(contexts_.back(), device, queue_properties)}));
|
queues_.insert(std::make_pair(contexts_.back(), std::vector<CommandQueue*>{new CommandQueue(contexts_.back(), device, queue_properties)}));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -41,8 +41,8 @@ void backend::clinit()
|
|||||||
ocl::check(clGetDeviceIDs(p, CL_DEVICE_TYPE_ALL, ndevices, devices.data(), NULL));
|
ocl::check(clGetDeviceIDs(p, CL_DEVICE_TYPE_ALL, ndevices, devices.data(), NULL));
|
||||||
for(cl_device_id d : devices){
|
for(cl_device_id d : devices){
|
||||||
Device device(d);
|
Device device(d);
|
||||||
contexts_.emplace_back(device);
|
contexts_.emplace_back(new Context(device));
|
||||||
queues_.insert(std::make_pair(&contexts_.back(), std::vector<CommandQueue>{CommandQueue(contexts_.back(), device, queue_properties)}));
|
queues_.insert(std::make_pair(contexts_.back(), std::vector<CommandQueue*>{new CommandQueue(*contexts_.back(), device, queue_properties)}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,48 +56,105 @@ void backend::init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CommandQueue> & backend::queues(Context const & context)
|
CommandQueue & backend::queue(Context const & context, unsigned int id)
|
||||||
{
|
{
|
||||||
|
assert(id < queues_.size());
|
||||||
init();
|
init();
|
||||||
for(auto & x : queues_)
|
for(auto & x : queues_)
|
||||||
if(x.first==&context)
|
if(x.first==&context)
|
||||||
return x.second;
|
return *x.second[id];
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context const & backend::import(cl_context context)
|
Context const & backend::import(cl_context context)
|
||||||
{
|
{
|
||||||
for(driver::Context const & x: contexts_)
|
for(driver::Context const * x: contexts_)
|
||||||
if(x.handle().cl()==context)
|
if(x->handle().cl()==context)
|
||||||
return x;
|
return *x;
|
||||||
contexts_.emplace_back(context, false);
|
contexts_.emplace_back(new Context(context, false));
|
||||||
return contexts_.back();
|
return *contexts_.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Context const & backend::default_context()
|
Context const & backend::default_context()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
std::list<Context>::const_iterator it = contexts_.begin();
|
std::list<Context const *>::const_iterator it = contexts_.begin();
|
||||||
std::advance(it, default_device);
|
std::advance(it, default_device);
|
||||||
return *it;
|
return **it;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::list<Context> &backend::contexts()
|
const std::list<Context const *> &backend::contexts()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
return contexts_;
|
return contexts_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ISAACAPI void synchronize(std::vector<CommandQueue > & queues)
|
void backend::synchronize(Context const & context)
|
||||||
{
|
{
|
||||||
for(CommandQueue & q: queues)
|
for(CommandQueue * queue: queues_.at(&context))
|
||||||
q.synchronize();
|
queue->synchronize();
|
||||||
}
|
}
|
||||||
|
|
||||||
ISAACAPI void synchronize(Context const & context)
|
void backend::release()
|
||||||
{ synchronize(backend::queues(context)); }
|
{
|
||||||
|
//programs
|
||||||
|
backend::programs::release();
|
||||||
|
|
||||||
|
//queues
|
||||||
|
for(auto & x: queues_)
|
||||||
|
for(auto & y: x.second)
|
||||||
|
{
|
||||||
|
delete y;
|
||||||
|
y = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//context
|
||||||
|
for(auto & x: contexts_)
|
||||||
|
{
|
||||||
|
delete x;
|
||||||
|
x = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Programs -----*/
|
||||||
|
|
||||||
|
Program const & backend::programs::add(Context const & context, std::string const & name, std::string const & src)
|
||||||
|
{
|
||||||
|
std::map<std::string, Program*> & pgms = programs_.at(&context);
|
||||||
|
std::map<std::string, Program*>::iterator it = pgms.find(name);
|
||||||
|
if(it==pgms.end())
|
||||||
|
{
|
||||||
|
std::string extensions;
|
||||||
|
std::string ext = "cl_khr_fp64";
|
||||||
|
if(context.device().extensions().find(ext)!=std::string::npos)
|
||||||
|
extensions = "#pragma OPENCL EXTENSION " + ext + " : enable\n";
|
||||||
|
return *pgms.insert(std::make_pair(name, new driver::Program(context, extensions + src))).first->second;
|
||||||
|
}
|
||||||
|
return *it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Program * backend::programs::find(Context const & context, const std::string &name)
|
||||||
|
{
|
||||||
|
std::map<std::string, Program*> & pgms = programs_[&context];
|
||||||
|
std::map<std::string, Program*>::const_iterator it = pgms.find(name);
|
||||||
|
if(it==pgms.end())
|
||||||
|
return NULL;
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backend::programs::release()
|
||||||
|
{
|
||||||
|
for(auto & x: programs_)
|
||||||
|
for(auto & y: x.second)
|
||||||
|
{
|
||||||
|
delete y.second;
|
||||||
|
y.second = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<driver::Context const *, std::map<std::string, Program*> > backend::programs::programs_;
|
||||||
|
|
||||||
|
|
||||||
//Static variables
|
//Static variables
|
||||||
@@ -106,9 +163,10 @@ unsigned int backend::default_device = 0;
|
|||||||
|
|
||||||
cl_command_queue_properties backend::queue_properties = 0;
|
cl_command_queue_properties backend::queue_properties = 0;
|
||||||
|
|
||||||
std::list<Context> backend::contexts_;
|
std::list<Context const *> backend::contexts_;
|
||||||
|
|
||||||
|
std::map<Context const *, std::vector<CommandQueue*> > backend::queues_;
|
||||||
|
|
||||||
std::map<Context*, std::vector<CommandQueue>> backend::queues_;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -159,31 +159,7 @@ Program::Program(Context const & context, std::string const & source) : backend_
|
|||||||
Context const & Program::context() const
|
Context const & Program::context() const
|
||||||
{ return context_; }
|
{ return context_; }
|
||||||
|
|
||||||
Program const & ProgramsHandler::add(Context const & context, std::string const & name, std::string const & src)
|
|
||||||
{
|
|
||||||
std::map<std::string, Program> & pgms = programs_[&context];
|
|
||||||
std::map<std::string, Program>::iterator it = pgms.find(name);
|
|
||||||
if(it==pgms.end())
|
|
||||||
{
|
|
||||||
std::string extensions;
|
|
||||||
std::string ext = "cl_khr_fp64";
|
|
||||||
if(context.device().extensions().find(ext)!=std::string::npos)
|
|
||||||
extensions = "#pragma OPENCL EXTENSION " + ext + " : enable\n";
|
|
||||||
return pgms.insert(std::make_pair(name, driver::Program(context, extensions + src))).first->second;
|
|
||||||
}
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Program * ProgramsHandler::find(Context const & context, const std::string &name)
|
|
||||||
{
|
|
||||||
std::map<std::string, Program> & pgms = programs_[&context];
|
|
||||||
std::map<std::string, Program>::const_iterator it = pgms.find(name);
|
|
||||||
if(it==pgms.end())
|
|
||||||
return NULL;
|
|
||||||
return &it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map<driver::Context const *, std::map<std::string, Program>> ProgramsHandler::programs_;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ driver::Program const & model::init(controller<expressions_tuple> const & expres
|
|||||||
else
|
else
|
||||||
pname = expressions.compilation_options().program_name;
|
pname = expressions.compilation_options().program_name;
|
||||||
|
|
||||||
driver::Program const * program = driver::ProgramsHandler::find(context, pname);
|
driver::Program const * program = driver::backend::programs::find(context, pname);
|
||||||
if(program)
|
if(program)
|
||||||
return *program;
|
return *program;
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ driver::Program const & model::init(controller<expressions_tuple> const & expres
|
|||||||
srcs += templates_[i]->generate(buffer, expressions.x(), context.device());
|
srcs += templates_[i]->generate(buffer, expressions.x(), context.device());
|
||||||
}
|
}
|
||||||
srcs += fallback_->generate("fallback", expressions.x(), context.device());
|
srcs += fallback_->generate("fallback", expressions.x(), context.device());
|
||||||
return driver::ProgramsHandler::add(context, pname, srcs);
|
return driver::backend::programs::add(context, pname, srcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
model::model(expression_type etype, numeric_type dtype, predictors::random_forest const & predictor, std::vector< std::shared_ptr<templates::base> > const & templates, driver::CommandQueue const & queue) :
|
model::model(expression_type etype, numeric_type dtype, predictors::random_forest const & predictor, std::vector< std::shared_ptr<templates::base> > const & templates, driver::CommandQueue const & queue) :
|
||||||
|
@@ -115,7 +115,7 @@ def main():
|
|||||||
include =' src/include'.split() + ['external/boost/include', os.path.join(find_module("numpy")[1], "core", "include")]
|
include =' src/include'.split() + ['external/boost/include', os.path.join(find_module("numpy")[1], "core", "include")]
|
||||||
|
|
||||||
#Source files
|
#Source files
|
||||||
src = 'src/lib/symbolic/preset.cpp src/lib/symbolic/execute.cpp src/lib/symbolic/io.cpp src/lib/symbolic/expression.cpp src/lib/model/model.cpp src/lib/model/predictors/random_forest.cpp src/lib/backend/templates/gemv.cpp src/lib/backend/templates/axpy.cpp src/lib/backend/templates/gemm.cpp src/lib/backend/templates/ger.cpp src/lib/backend/templates/dot.cpp src/lib/backend/templates/base.cpp src/lib/backend/mapped_object.cpp src/lib/backend/stream.cpp src/lib/backend/parse.cpp src/lib/backend/keywords.cpp src/lib/backend/binder.cpp src/lib/array.cpp src/lib/value_scalar.cpp src/lib/driver/backend.cpp src/lib/driver/device.cpp src/lib/driver/kernel.cpp src/lib/driver/buffer.cpp src/lib/driver/platform.cpp src/lib/driver/check.cpp src/lib/driver/program.cpp src/lib/driver/command_queue.cpp src/lib/driver/context.cpp src/lib/driver/event.cpp src/lib/driver/ndrange.cpp src/lib/driver/handle.cpp src/lib/exception/unknown_datatype.cpp src/lib/exception/operation_not_supported.cpp src/lib/wrap/clBLAS.cpp '.split() + [os.path.join('src', 'wrap', sf) for sf in ['_isaac.cpp', 'core.cpp', 'driver.cpp', 'model.cpp', 'exceptions.cpp']]
|
src = 'src/lib/array.cpp src/lib/value_scalar.cpp src/lib/wrap/clBLAS.cpp src/lib/symbolic/expression.cpp src/lib/symbolic/execute.cpp src/lib/symbolic/preset.cpp src/lib/symbolic/io.cpp src/lib/model/model.cpp src/lib/model/predictors/random_forest.cpp src/lib/exception/unknown_datatype.cpp src/lib/exception/operation_not_supported.cpp src/lib/driver/device.cpp src/lib/driver/command_queue.cpp src/lib/driver/backend.cpp src/lib/driver/platform.cpp src/lib/driver/ndrange.cpp src/lib/driver/kernel.cpp src/lib/driver/event.cpp src/lib/driver/check.cpp src/lib/driver/program.cpp src/lib/driver/context.cpp src/lib/driver/buffer.cpp src/lib/driver/handle.cpp src/lib/backend/parse.cpp src/lib/backend/stream.cpp src/lib/backend/mapped_object.cpp src/lib/backend/keywords.cpp src/lib/backend/binder.cpp src/lib/backend/templates/ger.cpp src/lib/backend/templates/gemv.cpp src/lib/backend/templates/gemm.cpp src/lib/backend/templates/dot.cpp src/lib/backend/templates/axpy.cpp src/lib/backend/templates/base.cpp '.split() + [os.path.join('src', 'wrap', sf) for sf in ['_isaac.cpp', 'core.cpp', 'driver.cpp', 'model.cpp', 'exceptions.cpp']]
|
||||||
boostsrc = 'external/boost/libs/'
|
boostsrc = 'external/boost/libs/'
|
||||||
for s in ['numpy','python','smart_ptr','system','thread']:
|
for s in ['numpy','python','smart_ptr','system','thread']:
|
||||||
src = src + [x for x in recursive_glob('external/boost/libs/' + s + '/src/','.cpp') if 'win32' not in x and 'pthread' not in x]
|
src = src + [x for x in recursive_glob('external/boost/libs/' + s + '/src/','.cpp') if 'win32' not in x and 'pthread' not in x]
|
||||||
|
@@ -15,14 +15,14 @@ void test_element_wise_vector(T epsilon, simple_vector_base<T> & cx, simple_vect
|
|||||||
|
|
||||||
int failure_count = 0;
|
int failure_count = 0;
|
||||||
isc::numeric_type dtype = x.dtype();
|
isc::numeric_type dtype = x.dtype();
|
||||||
isc::driver::Context const & ctx = x.context();
|
isc::driver::Context const & context = x.context();
|
||||||
isc::driver::CommandQueue queue = isc::driver::backend::queues(ctx)[0];
|
isc::driver::CommandQueue queue = isc::driver::backend::queue(context,0);
|
||||||
cl_command_queue clqueue = queue.handle().cl();
|
cl_command_queue clqueue = queue.handle().cl();
|
||||||
int_t N = cz.size();
|
int_t N = cz.size();
|
||||||
|
|
||||||
T aa = -4.378, bb=3.5;
|
T aa = -4.378, bb=3.5;
|
||||||
isaac::value_scalar a(aa), b(bb);
|
isaac::value_scalar a(aa), b(bb);
|
||||||
isaac::scalar da(a, ctx), db(b, ctx);
|
isaac::scalar da(a, context), db(b, context);
|
||||||
|
|
||||||
simple_vector<T> buffer(N);
|
simple_vector<T> buffer(N);
|
||||||
#define CONVERT
|
#define CONVERT
|
||||||
@@ -59,7 +59,7 @@ void test_element_wise_vector(T epsilon, simple_vector_base<T> & cx, simple_vect
|
|||||||
|
|
||||||
#undef PREFIX
|
#undef PREFIX
|
||||||
#define PREFIX "[C++]"
|
#define PREFIX "[C++]"
|
||||||
RUN_TEST_VECTOR_AXPY("z = 0", cz[i] = 0, z = zeros(N, 1, dtype, ctx))
|
RUN_TEST_VECTOR_AXPY("z = 0", cz[i] = 0, z = zeros(N, 1, dtype, context))
|
||||||
RUN_TEST_VECTOR_AXPY("z = x", cz[i] = cx[i], z = x)
|
RUN_TEST_VECTOR_AXPY("z = x", cz[i] = cx[i], z = x)
|
||||||
RUN_TEST_VECTOR_AXPY("z = -x", cz[i] = -cx[i], z = -x)
|
RUN_TEST_VECTOR_AXPY("z = -x", cz[i] = -cx[i], z = -x)
|
||||||
|
|
||||||
@@ -138,20 +138,20 @@ void test_impl(T epsilon, isc::driver::Context const & ctx)
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
clblasSetup();
|
clblasSetup();
|
||||||
std::list<isaac::driver::Context> const & data = isc::driver::backend::contexts();
|
std::list<isaac::driver::Context const *> const & data = isc::driver::backend::contexts();
|
||||||
for(isaac::driver::Context const & context : data)
|
for(isaac::driver::Context const * context : data)
|
||||||
{
|
{
|
||||||
isc::driver::Device device = isc::driver::backend::queues(context)[0].device();
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
if(device.type() != isc::driver::DEVICE_TYPE_GPU)
|
if(device.type() != isc::driver::DEVICE_TYPE_GPU)
|
||||||
continue;
|
continue;
|
||||||
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
std::cout << ">> float" << std::endl;
|
std::cout << ">> float" << std::endl;
|
||||||
test_impl<float>(1e-4, context);
|
test_impl<float>(1e-4, *context);
|
||||||
if(device.fp64_support())
|
if(device.fp64_support())
|
||||||
{
|
{
|
||||||
std::cout << ">> double" << std::endl;
|
std::cout << ">> double" << std::endl;
|
||||||
test_impl<double>(1e-9, context);
|
test_impl<double>(1e-9, *context);
|
||||||
}
|
}
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,7 @@ void test_reduction(T epsilon, simple_vector_base<T> & cx, simple_vector_base<T
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
isc::driver::Context const & ctx = x.context();
|
isc::driver::Context const & ctx = x.context();
|
||||||
int_t N = cx.size();
|
int_t N = cx.size();
|
||||||
isc::driver::CommandQueue queue = isc::driver::backend::queues(ctx)[0];
|
isc::driver::CommandQueue queue = isc::driver::backend::queue(ctx,0);
|
||||||
cl_command_queue clqueue = queue.handle().cl();
|
cl_command_queue clqueue = queue.handle().cl();
|
||||||
isc::array scratch(N, x.dtype());
|
isc::array scratch(N, x.dtype());
|
||||||
|
|
||||||
@@ -90,18 +90,18 @@ void test_impl(T epsilon, isc::driver::Context const & ctx)
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
clblasSetup();
|
clblasSetup();
|
||||||
std::list<isaac::driver::Context> const & data = isc::driver::backend::contexts();
|
std::list<isaac::driver::Context const *> const & data = isc::driver::backend::contexts();
|
||||||
for(isaac::driver::Context const & context : data)
|
for(isaac::driver::Context const * context : data)
|
||||||
{
|
{
|
||||||
isc::driver::Device device = isc::driver::backend::queues(context)[0].device();
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
std::cout << ">> float" << std::endl;
|
std::cout << ">> float" << std::endl;
|
||||||
test_impl<float>(1e-4, context);
|
test_impl<float>(1e-4, *context);
|
||||||
if(device.fp64_support())
|
if(device.fp64_support())
|
||||||
{
|
{
|
||||||
std::cout << ">> double" << std::endl;
|
std::cout << ">> double" << std::endl;
|
||||||
test_impl<double>(1e-9, context);
|
test_impl<double>(1e-9, *context);
|
||||||
}
|
}
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@ void test_impl(T epsilon, simple_matrix_base<T> & cC, simple_matrix_base<T> cons
|
|||||||
T alpha = 1;
|
T alpha = 1;
|
||||||
T beta = 0;
|
T beta = 0;
|
||||||
|
|
||||||
isc::driver::CommandQueue queue = isc::driver::backend::queues(C.context())[0];
|
isc::driver::CommandQueue queue = isc::driver::backend::queue(C.context(),0);
|
||||||
|
|
||||||
for(int i = 0 ; i < M ; ++i)
|
for(int i = 0 ; i < M ; ++i)
|
||||||
{
|
{
|
||||||
@@ -125,21 +125,21 @@ void test_impl(T epsilon, isc::driver::Context const & ctx)
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::list<isaac::driver::Context> const & data = isc::driver::backend::contexts();
|
|
||||||
clblasSetup();
|
clblasSetup();
|
||||||
for(isaac::driver::Context const & context : data)
|
std::list<isaac::driver::Context const *> const & data = isc::driver::backend::contexts();
|
||||||
|
for(isaac::driver::Context const * context : data)
|
||||||
{
|
{
|
||||||
isc::driver::Device device = isc::driver::backend::queues(context)[0].device();
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
if(device.type() != isc::driver::DEVICE_TYPE_GPU)
|
if(device.type() != isc::driver::DEVICE_TYPE_GPU)
|
||||||
continue;
|
continue;
|
||||||
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
std::cout << ">> float" << std::endl;
|
std::cout << ">> float" << std::endl;
|
||||||
test_impl<float>(1e-4, context);
|
test_impl<float>(1e-4, *context);
|
||||||
if(device.fp64_support())
|
if(device.fp64_support())
|
||||||
{
|
{
|
||||||
std::cout << ">> double" << std::endl;
|
std::cout << ">> double" << std::endl;
|
||||||
test_impl<double>(1e-9, context);
|
test_impl<double>(1e-9, *context);
|
||||||
}
|
}
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,7 @@ void test_row_wise_reduction(T epsilon, simple_vector_base<T> & cy, simple_matri
|
|||||||
|
|
||||||
T alpha = 4.2, beta = 5.6;
|
T alpha = 4.2, beta = 5.6;
|
||||||
|
|
||||||
isc::driver::CommandQueue queue = isc::driver::backend::queues(y.context())[0];
|
isc::driver::CommandQueue queue = isc::driver::backend::queue(y.context(),0);
|
||||||
|
|
||||||
T yi = 0, xi = 0;
|
T yi = 0, xi = 0;
|
||||||
#define TEST_OPERATION(NAME, SIZE1, SIZE2, REDUCTION, ASSIGNMENT, GPU_REDUCTION, RES, BUF, CRES)\
|
#define TEST_OPERATION(NAME, SIZE1, SIZE2, REDUCTION, ASSIGNMENT, GPU_REDUCTION, RES, BUF, CRES)\
|
||||||
@@ -108,18 +108,18 @@ void test_impl(T epsilon, isc::driver::Context const & ctx)
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
clblasSetup();
|
clblasSetup();
|
||||||
std::list<isaac::driver::Context> const & data = isc::driver::backend::contexts();
|
std::list<isaac::driver::Context const *> const & data = isc::driver::backend::contexts();
|
||||||
for(isaac::driver::Context const & context : data)
|
for(isaac::driver::Context const * context : data)
|
||||||
{
|
{
|
||||||
isc::driver::Device device = isc::driver::backend::queues(context)[0].device();
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
std::cout << ">> float" << std::endl;
|
std::cout << ">> float" << std::endl;
|
||||||
test_impl<float>(1e-4, context);
|
test_impl<float>(1e-4, *context);
|
||||||
if(device.fp64_support())
|
if(device.fp64_support())
|
||||||
{
|
{
|
||||||
std::cout << ">> double" << std::endl;
|
std::cout << ">> double" << std::endl;
|
||||||
test_impl<double>(1e-9, context);
|
test_impl<double>(1e-9, *context);
|
||||||
}
|
}
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
}
|
}
|
||||||
|
@@ -124,18 +124,18 @@ void test_impl(T epsilon, isc::driver::Context const & ctx)
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::list<isaac::driver::Context> const & data = isc::driver::backend::contexts();
|
std::list<isaac::driver::Context const *> const & data = isc::driver::backend::contexts();
|
||||||
for(isaac::driver::Context const & context : data)
|
for(isaac::driver::Context const * context : data)
|
||||||
{
|
{
|
||||||
isc::driver::Device device = isc::driver::backend::queues(context)[0].device();
|
isc::driver::Device device = isc::driver::backend::queue(*context,0).device();
|
||||||
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
std::cout << "Device: " << device.name() << " on " << device.platform().name() << " " << device.platform().version() << std::endl;
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
std::cout << ">> float" << std::endl;
|
std::cout << ">> float" << std::endl;
|
||||||
test_impl<float>(1e-4, context);
|
test_impl<float>(1e-4, *context);
|
||||||
if(device.fp64_support())
|
if(device.fp64_support())
|
||||||
{
|
{
|
||||||
std::cout << ">> double" << std::endl;
|
std::cout << ">> double" << std::endl;
|
||||||
test_impl<double>(1e-9, context);
|
test_impl<double>(1e-9, *context);
|
||||||
}
|
}
|
||||||
std::cout << "---" << std::endl;
|
std::cout << "---" << std::endl;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user