Driver: made cl and cu attributes private in Handle<>
This commit is contained in:
@@ -95,7 +95,8 @@ void bench(isc::numeric_type dtype, std::string operation)
|
|||||||
//
|
//
|
||||||
// MACROS FOR BENCHMARKING
|
// MACROS FOR BENCHMARKING
|
||||||
//
|
//
|
||||||
#define CL_HANDLE(X) (*X.handle().cl)()
|
#define CL_HANDLE(X) X.handle().cl()()
|
||||||
|
|
||||||
#define BENCHMARK_ISAAC(OP, PERF) \
|
#define BENCHMARK_ISAAC(OP, PERF) \
|
||||||
{\
|
{\
|
||||||
std::vector<long> times;\
|
std::vector<long> times;\
|
||||||
|
@@ -38,11 +38,16 @@ public:
|
|||||||
Handle(backend_type backend);
|
Handle(backend_type backend);
|
||||||
bool operator==(Handle const & other) const;
|
bool operator==(Handle const & other) const;
|
||||||
bool operator<(Handle const & other) const;
|
bool operator<(Handle const & other) const;
|
||||||
|
CLType & cl();
|
||||||
|
CLType const & cl() const;
|
||||||
|
#ifdef ISAAC_WITH_CUDA
|
||||||
|
CUTYPE & cu();
|
||||||
|
#endif
|
||||||
~Handle();
|
~Handle();
|
||||||
|
|
||||||
public:
|
private:
|
||||||
std::shared_ptr<CLType> cl;
|
std::shared_ptr<CLType> cl_;
|
||||||
std::shared_ptr<CUType> cu;
|
std::shared_ptr<CUType> cu_;
|
||||||
private:
|
private:
|
||||||
backend_type backend_;
|
backend_type backend_;
|
||||||
};
|
};
|
||||||
|
@@ -9,7 +9,7 @@ namespace driver
|
|||||||
|
|
||||||
Buffer::Buffer(cl::Buffer const & buffer) : backend_(OPENCL), context_(buffer.getInfo<CL_MEM_CONTEXT>()), h_(backend_)
|
Buffer::Buffer(cl::Buffer const & buffer) : backend_(OPENCL), context_(buffer.getInfo<CL_MEM_CONTEXT>()), h_(backend_)
|
||||||
{
|
{
|
||||||
*h_.cl = buffer;
|
h_.cl() = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer::Buffer(Context const & context, std::size_t size) : backend_(context.backend_), context_(context), h_(backend_)
|
Buffer::Buffer(Context const & context, std::size_t size) : backend_(context.backend_), context_(context), h_(backend_)
|
||||||
@@ -24,7 +24,7 @@ Buffer::Buffer(Context const & context, std::size_t size) : backend_(context.bac
|
|||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
cl_int err;
|
cl_int err;
|
||||||
*h_.cl = cl::Buffer(*context.h_.cl, CL_MEM_READ_WRITE, size, NULL, &err);
|
h_.cl() = cl::Buffer(context.h_.cl(), CL_MEM_READ_WRITE, size, NULL, &err);
|
||||||
ocl::check(err);
|
ocl::check(err);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -15,7 +15,7 @@ namespace driver
|
|||||||
|
|
||||||
CommandQueue::CommandQueue(cl::CommandQueue const & queue) : backend_(OPENCL), context_(queue.getInfo<CL_QUEUE_CONTEXT>()), device_(queue.getInfo<CL_QUEUE_DEVICE>()), h_(backend_)
|
CommandQueue::CommandQueue(cl::CommandQueue const & queue) : backend_(OPENCL), context_(queue.getInfo<CL_QUEUE_CONTEXT>()), device_(queue.getInfo<CL_QUEUE_DEVICE>()), h_(backend_)
|
||||||
{
|
{
|
||||||
*h_.cl = queue;
|
h_.cl() = queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandQueue::CommandQueue(Context const & context, Device const & device, cl_command_queue_properties properties): backend_(device.backend_), context_(context), device_(device), h_(backend_)
|
CommandQueue::CommandQueue(Context const & context, Device const & device, cl_command_queue_properties properties): backend_(device.backend_), context_(context), device_(device), h_(backend_)
|
||||||
@@ -29,7 +29,7 @@ CommandQueue::CommandQueue(Context const & context, Device const & device, cl_co
|
|||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
cl_int err;
|
cl_int err;
|
||||||
*h_.cl = cl::CommandQueue(*context.h_.cl, *device.h_.cl, properties, &err);
|
h_.cl() = cl::CommandQueue(context.h_.cl(), device.h_.cl(), properties, &err);
|
||||||
ocl::check(err);
|
ocl::check(err);
|
||||||
break;
|
break;
|
||||||
default: throw;
|
default: throw;
|
||||||
@@ -49,7 +49,7 @@ void CommandQueue::synchronize()
|
|||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: cuda::check(cuStreamSynchronize(*h_.cu)); break;
|
case CUDA: cuda::check(cuStreamSynchronize(*h_.cu)); break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: h_.cl->finish(); break;
|
case OPENCL: h_.cl().finish(); break;
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ Event CommandQueue::enqueue(Kernel const & kernel, NDRange global, driver::NDRan
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
ocl::check(h_.cl->enqueueNDRangeKernel(*kernel.h_.cl, cl::NullRange, (cl::NDRange)global, (cl::NDRange)local, NULL, event.h_.cl.get()));
|
ocl::check(h_.cl().enqueueNDRangeKernel(kernel.h_.cl(), cl::NullRange, (cl::NDRange)global, (cl::NDRange)local, NULL, &event.h_.cl()));
|
||||||
break;
|
break;
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ void CommandQueue::write(Buffer const & buffer, bool blocking, std::size_t offse
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
h_.cl->enqueueWriteBuffer(*buffer.h_.cl, blocking, offset, size, ptr);
|
h_.cl().enqueueWriteBuffer(buffer.h_.cl(), blocking, offset, size, ptr);
|
||||||
break;
|
break;
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ void CommandQueue::read(Buffer const & buffer, bool blocking, std::size_t offset
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
h_.cl->enqueueReadBuffer(*buffer.h_.cl, blocking, offset, size, ptr);
|
h_.cl().enqueueReadBuffer(buffer.h_.cl(), blocking, offset, size, ptr);
|
||||||
break;
|
break;
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@ namespace driver
|
|||||||
|
|
||||||
Context::Context(cl::Context const & context) : backend_(OPENCL), device_(context.getInfo<CL_CONTEXT_DEVICES>()[0]), h_(backend_)
|
Context::Context(cl::Context const & context) : backend_(OPENCL), device_(context.getInfo<CL_CONTEXT_DEVICES>()[0]), h_(backend_)
|
||||||
{
|
{
|
||||||
*h_.cl = context;
|
h_.cl() = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context::Context(Device const & device) : backend_(device.backend_), device_(device), h_(backend_)
|
Context::Context(Device const & device) : backend_(device.backend_), device_(device), h_(backend_)
|
||||||
@@ -30,7 +30,7 @@ Context::Context(Device const & device) : backend_(device.backend_), device_(dev
|
|||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
cl_int err;
|
cl_int err;
|
||||||
*h_.cl = cl::Context(std::vector<cl::Device>(1, *device_.h_.cl), NULL, NULL, NULL, &err);
|
h_.cl() = cl::Context(std::vector<cl::Device>(1, device_.h_.cl()), NULL, NULL, NULL, &err);
|
||||||
ocl::check(err);
|
ocl::check(err);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -24,7 +24,7 @@ Device::Device(int ordinal): backend_(CUDA), h_(backend_)
|
|||||||
|
|
||||||
|
|
||||||
Device::Device(cl::Device const & device) : backend_(OPENCL), h_(backend_)
|
Device::Device(cl::Device const & device) : backend_(OPENCL), h_(backend_)
|
||||||
{ *h_.cl = device; }
|
{ h_.cl() = device; }
|
||||||
|
|
||||||
backend_type Device::backend() const
|
backend_type Device::backend() const
|
||||||
{ return backend_; }
|
{ return backend_; }
|
||||||
@@ -36,7 +36,7 @@ unsigned int Device::address_bits() const
|
|||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: return sizeof(long long)*8;
|
case CUDA: return sizeof(long long)*8;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: return h_.cl->getInfo<CL_DEVICE_ADDRESS_BITS>();
|
case OPENCL: return h_.cl().getInfo<CL_DEVICE_ADDRESS_BITS>();
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ driver::Platform Device::platform() const
|
|||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: return Platform(CUDA);
|
case CUDA: return Platform(CUDA);
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: return Platform(h_.cl->getInfo<CL_DEVICE_PLATFORM>());
|
case OPENCL: return Platform(h_.cl().getInfo<CL_DEVICE_PLATFORM>());
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ std::string Device::name() const
|
|||||||
cuda::check(cuDeviceGetName(tmp, 128, *h_.cu));
|
cuda::check(cuDeviceGetName(tmp, 128, *h_.cu));
|
||||||
return std::string(tmp);
|
return std::string(tmp);
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: return h_.cl->getInfo<CL_DEVICE_NAME>();
|
case OPENCL: return h_.cl().getInfo<CL_DEVICE_NAME>();
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ std::string Device::vendor_str() const
|
|||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: return "NVidia";
|
case CUDA: return "NVidia";
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: return h_.cl->getInfo<CL_DEVICE_VENDOR>();
|
case OPENCL: return h_.cl().getInfo<CL_DEVICE_VENDOR>();
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,7 +111,7 @@ std::vector<size_t> Device::max_work_item_sizes() const
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
return h_.cl->getInfo<CL_DEVICE_MAX_WORK_ITEM_SIZES>();
|
return h_.cl().getInfo<CL_DEVICE_MAX_WORK_ITEM_SIZES>();
|
||||||
default:
|
default:
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ device_type Device::type() const
|
|||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: return DEVICE_TYPE_GPU;
|
case CUDA: return DEVICE_TYPE_GPU;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: return static_cast<device_type>(h_.cl->getInfo<CL_DEVICE_TYPE>());
|
case OPENCL: return static_cast<device_type>(h_.cl().getInfo<CL_DEVICE_TYPE>());
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,7 +138,7 @@ std::string Device::extensions() const
|
|||||||
return "";
|
return "";
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
return h_.cl->getInfo<CL_DEVICE_EXTENSIONS>();
|
return h_.cl().getInfo<CL_DEVICE_EXTENSIONS>();
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ std::string Device::extensions() const
|
|||||||
switch(backend_)\
|
switch(backend_)\
|
||||||
{\
|
{\
|
||||||
CUDACASE(CUNAME)\
|
CUDACASE(CUNAME)\
|
||||||
case OPENCL: return h_.cl->getInfo<CLNAME>();\
|
case OPENCL: return h_.cl().getInfo<CLNAME>();\
|
||||||
default: throw;\
|
default: throw;\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
@@ -172,7 +172,7 @@ std::pair<unsigned int, unsigned int> Device::nv_compute_capability() const
|
|||||||
switch(backend_)
|
switch(backend_)
|
||||||
{
|
{
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
return std::pair<unsigned int, unsigned int>( h_.cl->getInfo<CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV>(), h_.cl->getInfo<CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV> ());
|
return std::pair<unsigned int, unsigned int>( h_.cl().getInfo<CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV>(), h_.cl().getInfo<CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV> ());
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA:
|
case CUDA:
|
||||||
return std::pair<unsigned int, unsigned int>(cuGetInfo<CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR>(), cuGetInfo<CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR>());
|
return std::pair<unsigned int, unsigned int>(cuGetInfo<CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR>(), cuGetInfo<CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR>());
|
||||||
|
@@ -23,7 +23,7 @@ Event::Event(backend_type backend) : backend_(backend), h_(backend_)
|
|||||||
|
|
||||||
Event::Event(cl::Event const & event) : backend_(OPENCL), h_(backend_)
|
Event::Event(cl::Event const & event) : backend_(OPENCL), h_(backend_)
|
||||||
{
|
{
|
||||||
*h_.cl = event;
|
h_.cl() = event;
|
||||||
}
|
}
|
||||||
|
|
||||||
long Event::elapsed_time() const
|
long Event::elapsed_time() const
|
||||||
@@ -37,7 +37,7 @@ long Event::elapsed_time() const
|
|||||||
return 1e6*time;
|
return 1e6*time;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
return (h_.cl->getProfilingInfo<CL_PROFILING_COMMAND_END>() - h_.cl->getProfilingInfo<CL_PROFILING_COMMAND_START>());
|
return (h_.cl().getProfilingInfo<CL_PROFILING_COMMAND_END>() - h_.cl().getProfilingInfo<CL_PROFILING_COMMAND_START>());
|
||||||
default:
|
default:
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ long Event::elapsed_time() const
|
|||||||
|
|
||||||
Event::operator cl::Event()
|
Event::operator cl::Event()
|
||||||
{
|
{
|
||||||
return *h_.cl;
|
return h_.cl();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -41,9 +41,9 @@ Handle<CLType, CUType>::Handle(backend_type backend): backend_(backend)
|
|||||||
switch(backend_)
|
switch(backend_)
|
||||||
{
|
{
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: cu.reset(new CUType());
|
case CUDA: cu_.reset(new CUType());
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: cl.reset(new CLType());
|
case OPENCL: cl_.reset(new CLType());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,10 +52,10 @@ bool Handle<CLType, CUType>::operator==(Handle const & other) const
|
|||||||
{
|
{
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
if(backend_==CUDA && other.backend_==CUDA)
|
if(backend_==CUDA && other.backend_==CUDA)
|
||||||
return (*cu)==(*other.cu);
|
return cu()==other.cu();
|
||||||
#endif
|
#endif
|
||||||
if(backend_==OPENCL && other.backend_==OPENCL)
|
if(backend_==OPENCL && other.backend_==OPENCL)
|
||||||
return (*cl)()==(*other.cl)();
|
return cl()()==other.cl()();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,10 +64,10 @@ bool Handle<CLType, CUType>::operator<(Handle const & other) const
|
|||||||
{
|
{
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
if(backend_==CUDA && other.backend_==CUDA)
|
if(backend_==CUDA && other.backend_==CUDA)
|
||||||
return (*cu)<(*other.cu);
|
return (*cu_)<(*other.cu_);
|
||||||
#endif
|
#endif
|
||||||
if(backend_==OPENCL && other.backend_==OPENCL)
|
if(backend_==OPENCL && other.backend_==OPENCL)
|
||||||
return (*cl)()<(*other.cl)();
|
return (*cl_)()<(*other.cl_)();
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
if(backend_==CUDA && other.backend_==OPENCL)
|
if(backend_==CUDA && other.backend_==OPENCL)
|
||||||
return true;
|
return true;
|
||||||
@@ -78,21 +78,33 @@ bool Handle<CLType, CUType>::operator<(Handle const & other) const
|
|||||||
template<class CLType, class CUType>
|
template<class CLType, class CUType>
|
||||||
Handle<CLType, CUType>::~Handle()
|
Handle<CLType, CUType>::~Handle()
|
||||||
{
|
{
|
||||||
if(cu && cu.unique())
|
if(cu_ && cu_.unique())
|
||||||
{
|
{
|
||||||
switch(backend_)
|
switch(backend_)
|
||||||
{
|
{
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
case CUDA: _delete(*cu); break;
|
case CUDA: _delete(*cu_); break;
|
||||||
#endif
|
#endif
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class CLType, class CUType>
|
||||||
|
CLType & Handle<CLType, CUType>::cl()
|
||||||
|
{ return *cl_; }
|
||||||
|
|
||||||
|
template<class CLType, class CUType>
|
||||||
|
CLType const & Handle<CLType, CUType>::cl() const
|
||||||
|
{ return *cl_; }
|
||||||
|
|
||||||
#ifdef ISAAC_WITH_CUDA
|
#ifdef ISAAC_WITH_CUDA
|
||||||
|
template<class CLType, class CUType>
|
||||||
|
CUType & Handle<CLType, CUType>::cu()
|
||||||
|
{
|
||||||
|
return *cu_;
|
||||||
|
}
|
||||||
|
|
||||||
template class Handle<cl::Buffer, CUdeviceptr>;
|
template class Handle<cl::Buffer, CUdeviceptr>;
|
||||||
template class Handle<cl::CommandQueue, CUstream>;
|
template class Handle<cl::CommandQueue, CUstream>;
|
||||||
template class Handle<cl::Context, CUcontext>;
|
template class Handle<cl::Context, CUcontext>;
|
||||||
|
@@ -20,7 +20,7 @@ Kernel::Kernel(Program const & program, const char * name) : backend_(program.ba
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
*h_.cl = cl::Kernel(*program.h_.cl, name);
|
h_.cl() = cl::Kernel(program.h_.cl(), name);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw;
|
throw;
|
||||||
@@ -44,7 +44,7 @@ void Kernel::setArg(unsigned int index, std::size_t size, void* ptr)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
h_.cl->setArg(index, size, ptr);
|
h_.cl().setArg(index, size, ptr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw;
|
throw;
|
||||||
@@ -61,7 +61,7 @@ void Kernel::setArg(unsigned int index, Buffer const & data)
|
|||||||
setArg(index, sizeof(CUdeviceptr), data.h_.cu.get()); break;
|
setArg(index, sizeof(CUdeviceptr), data.h_.cu.get()); break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
case OPENCL: h_.cl->setArg(index, *data.h_.cl); break;
|
case OPENCL: h_.cl().setArg(index, data.h_.cl()); break;
|
||||||
default: throw;
|
default: throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,12 +81,12 @@ void Kernel::setSizeArg(unsigned int index, size_t N)
|
|||||||
case OPENCL:
|
case OPENCL:
|
||||||
if(address_bits_==32){
|
if(address_bits_==32){
|
||||||
int32_t NN = N;
|
int32_t NN = N;
|
||||||
h_.cl->setArg(index, 4, &NN);
|
h_.cl().setArg(index, 4, &NN);
|
||||||
}
|
}
|
||||||
else if(address_bits_==64)
|
else if(address_bits_==64)
|
||||||
{
|
{
|
||||||
int64_t NN = N;
|
int64_t NN = N;
|
||||||
h_.cl->setArg(index, 8, &NN);
|
h_.cl().setArg(index, 8, &NN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw;
|
throw;
|
||||||
|
@@ -95,7 +95,7 @@ Program::Program(Context const & context, std::string const & source) : backend_
|
|||||||
#endif
|
#endif
|
||||||
case OPENCL:
|
case OPENCL:
|
||||||
{
|
{
|
||||||
std::vector<cl::Device> devices = context_.h_.cl->getInfo<CL_CONTEXT_DEVICES>();
|
std::vector<cl::Device> devices = context_.h_.cl().getInfo<CL_CONTEXT_DEVICES>();
|
||||||
|
|
||||||
std::string prefix;
|
std::string prefix;
|
||||||
for(std::vector<cl::Device >::const_iterator it = devices.begin(); it != devices.end(); ++it)
|
for(std::vector<cl::Device >::const_iterator it = devices.begin(); it != devices.end(); ++it)
|
||||||
@@ -115,29 +115,29 @@ Program::Program(Context const & context, std::string const & source) : backend_
|
|||||||
buffer.resize(len);
|
buffer.resize(len);
|
||||||
cached.read((char*)buffer.data(), std::streamsize(len));
|
cached.read((char*)buffer.data(), std::streamsize(len));
|
||||||
char* cbuffer = buffer.data();
|
char* cbuffer = buffer.data();
|
||||||
*h_.cl = cl::Program(*context_.h_.cl, devices, cl::Program::Binaries(1, std::make_pair(cbuffer, len)));
|
h_.cl() = cl::Program(context_.h_.cl(), devices, cl::Program::Binaries(1, std::make_pair(cbuffer, len)));
|
||||||
h_.cl->build();
|
h_.cl().build();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*h_.cl = cl::Program(*context_.h_.cl, source);
|
h_.cl() = cl::Program(context_.h_.cl(), source);
|
||||||
try{
|
try{
|
||||||
ocl::check(h_.cl->build(devices));
|
ocl::check(h_.cl().build(devices));
|
||||||
}catch(ocl::exception::build_program_failure const & e){
|
}catch(ocl::exception::build_program_failure const & e){
|
||||||
for(std::vector< cl::Device >::const_iterator it = devices.begin(); it != devices.end(); ++it)
|
for(std::vector< cl::Device >::const_iterator it = devices.begin(); it != devices.end(); ++it)
|
||||||
std::cout << "Device : " << it->getInfo<CL_DEVICE_NAME>()
|
std::cout << "Device : " << it->getInfo<CL_DEVICE_NAME>()
|
||||||
<< "Build Status = " << h_.cl->getBuildInfo<CL_PROGRAM_BUILD_STATUS>(*it) << std::endl
|
<< "Build Status = " << h_.cl().getBuildInfo<CL_PROGRAM_BUILD_STATUS>(*it) << std::endl
|
||||||
<< "Build Log = " << h_.cl->getBuildInfo<CL_PROGRAM_BUILD_LOG>(*it) << std::endl;
|
<< "Build Log = " << h_.cl().getBuildInfo<CL_PROGRAM_BUILD_LOG>(*it) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Save cached program
|
//Save cached program
|
||||||
if (cache_path.size())
|
if (cache_path.size())
|
||||||
{
|
{
|
||||||
std::ofstream cached(fname.c_str(),std::ios::binary);
|
std::ofstream cached(fname.c_str(),std::ios::binary);
|
||||||
std::vector<std::size_t> sizes = h_.cl->getInfo<CL_PROGRAM_BINARY_SIZES>();
|
std::vector<std::size_t> sizes = h_.cl().getInfo<CL_PROGRAM_BINARY_SIZES>();
|
||||||
cached.write((char*)&sizes[0], sizeof(std::size_t));
|
cached.write((char*)&sizes[0], sizeof(std::size_t));
|
||||||
std::vector<char*> binaries = h_.cl->getInfo<CL_PROGRAM_BINARIES>();
|
std::vector<char*> binaries = h_.cl().getInfo<CL_PROGRAM_BINARIES>();
|
||||||
cached.write((char*)binaries[0], std::streamsize(sizes[0]));
|
cached.write((char*)binaries[0], std::streamsize(sizes[0]));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -17,7 +17,7 @@ void test_element_wise_vector(T epsilon, simple_vector_base<T> & cx, simple_vect
|
|||||||
isc::numeric_type dtype = x.dtype();
|
isc::numeric_type dtype = x.dtype();
|
||||||
isc::driver::Context const & ctx = x.context();
|
isc::driver::Context const & ctx = x.context();
|
||||||
isc::driver::CommandQueue queue = isc::driver::queues[ctx][0];
|
isc::driver::CommandQueue queue = isc::driver::queues[ctx][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;
|
||||||
@@ -45,15 +45,15 @@ void test_element_wise_vector(T epsilon, simple_vector_base<T> & cx, simple_vect
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define PREFIX "[C]"
|
#define PREFIX "[C]"
|
||||||
RUN_TEST_VECTOR_AXPY("AXPY", cz[i] = a*cx[i] + cz[i], BLAS<T>::F(clblasSaxpy, clblasDaxpy)(N, a, (*x.data().handle().cl)(), x.start()[0], x.stride()[0],
|
RUN_TEST_VECTOR_AXPY("AXPY", cz[i] = a*cx[i] + cz[i], BLAS<T>::F(clblasSaxpy, clblasDaxpy)(N, a, CHANDLE(x), x.start()[0], x.stride()[0],
|
||||||
(*z.data().handle().cl)(), z.start()[0], z.stride()[0],
|
CHANDLE(z), z.start()[0], z.stride()[0],
|
||||||
1, &clqueue, 0, NULL, NULL));
|
1, &clqueue, 0, NULL, NULL));
|
||||||
|
|
||||||
RUN_TEST_VECTOR_AXPY("COPY", cz[i] = cx[i], BLAS<T>::F(clblasScopy, clblasDcopy)(N, (*x.data().handle().cl)(), x.start()[0], x.stride()[0],
|
RUN_TEST_VECTOR_AXPY("COPY", cz[i] = cx[i], BLAS<T>::F(clblasScopy, clblasDcopy)(N, CHANDLE(x), x.start()[0], x.stride()[0],
|
||||||
(*z.data().handle().cl)(), z.start()[0], z.stride()[0],
|
CHANDLE(z), z.start()[0], z.stride()[0],
|
||||||
1, &clqueue, 0, NULL, NULL));
|
1, &clqueue, 0, NULL, NULL));
|
||||||
|
|
||||||
RUN_TEST_VECTOR_AXPY("SCAL", cz[i] = a*cz[i], BLAS<T>::F(clblasSscal, clblasDscal)(N, a, (*z.data().handle().cl)(), z.start()[0], z.stride()[0],
|
RUN_TEST_VECTOR_AXPY("SCAL", cz[i] = a*cz[i], BLAS<T>::F(clblasSscal, clblasDscal)(N, a, CHANDLE(z), z.start()[0], z.stride()[0],
|
||||||
1, &clqueue, 0, NULL, NULL));
|
1, &clqueue, 0, NULL, NULL));
|
||||||
|
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ enum interface_t
|
|||||||
CPP
|
CPP
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CHANDLE(X) (*X.data().handle().cl)()
|
#define CHANDLE(X) X.data().handle().cl()()
|
||||||
#define OFF(X) X.start()[0] + X.start()[1]*X.ld()
|
#define OFF(X) X.start()[0] + X.start()[1]*X.ld()
|
||||||
#define LD(X) X.ld()
|
#define LD(X) X.ld()
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ void test_reduction(T epsilon, simple_vector_base<T> & cx, simple_vector_base<T
|
|||||||
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::queues[ctx][0];
|
isc::driver::CommandQueue queue = isc::driver::queues[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());
|
||||||
|
|
||||||
unsigned int failure_count = 0;
|
unsigned int failure_count = 0;
|
||||||
@@ -45,10 +45,10 @@ void test_reduction(T epsilon, simple_vector_base<T> & cx, simple_vector_base<T
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
#define PREFIX "[C]"
|
#define PREFIX "[C]"
|
||||||
RUN_TEST("DOT", cs+=cx[i]*cy[i], 0, cs, BLAS<T>::F(clblasSdot, clblasDdot)(N, (*ds.data().handle().cl)(), 0, (*x.data().handle().cl)(), x.start()[0], x.stride()[0],
|
RUN_TEST("DOT", cs+=cx[i]*cy[i], 0, cs, BLAS<T>::F(clblasSdot, clblasDdot)(N, CHANDLE(ds), 0, CHANDLE(x), x.start()[0], x.stride()[0],
|
||||||
(*y.data().handle().cl)(), y.start()[0], y.stride()[0],
|
CHANDLE(y), y.start()[0], y.stride()[0],
|
||||||
CHANDLE(scratch), 1, &clqueue, 0, NULL, NULL));
|
CHANDLE(scratch), 1, &clqueue, 0, NULL, NULL));
|
||||||
RUN_TEST("ASUM", cs+=std::fabs(cx[i]), 0, cs, BLAS<T>::F(clblasSasum, clblasDasum)(N, (*ds.data().handle().cl)(), 0, (*x.data().handle().cl)(), x.start()[0], x.stride()[0],
|
RUN_TEST("ASUM", cs+=std::fabs(cx[i]), 0, cs, BLAS<T>::F(clblasSasum, clblasDasum)(N, CHANDLE(ds), 0, CHANDLE(x), x.start()[0], x.stride()[0],
|
||||||
CHANDLE(scratch), 1, &clqueue, 0, NULL, NULL));
|
CHANDLE(scratch), 1, &clqueue, 0, NULL, NULL));
|
||||||
#undef PREFIX
|
#undef PREFIX
|
||||||
#define PREFIX "[C++]"
|
#define PREFIX "[C++]"
|
||||||
|
@@ -55,7 +55,7 @@ void test_impl(T epsilon, simple_matrix_base<T> & cC, simple_matrix_base<T> cons
|
|||||||
|
|
||||||
if(interf==clBLAS)
|
if(interf==clBLAS)
|
||||||
{
|
{
|
||||||
cl_command_queue clqueue = (*queue.handle().cl)();
|
cl_command_queue clqueue = queue.handle().cl()();
|
||||||
|
|
||||||
//// //Row-major
|
//// //Row-major
|
||||||
RUN_TEST("GEMM(ROW, N, N)", BLAS<T>::F(clblasSgemm,clblasDgemm)(clblasRowMajor, clblasNoTrans, clblasNoTrans, N, M, K, alpha, CHANDLE(B), OFF(B), LD(B),
|
RUN_TEST("GEMM(ROW, N, N)", BLAS<T>::F(clblasSgemm,clblasDgemm)(clblasRowMajor, clblasNoTrans, clblasNoTrans, N, M, K, alpha, CHANDLE(B), OFF(B), LD(B),
|
||||||
|
@@ -47,7 +47,7 @@ void test_row_wise_reduction(T epsilon, simple_vector_base<T> & cy, simple_matri
|
|||||||
|
|
||||||
if(interf==clBLAS)
|
if(interf==clBLAS)
|
||||||
{
|
{
|
||||||
cl_command_queue clqueue = (*queue.handle().cl)();
|
cl_command_queue clqueue = queue.handle().cl()();
|
||||||
|
|
||||||
|
|
||||||
TEST_OPERATION("GEMV(ROW, NoTrans)", M, N, yi+=cA(i,j)*cx[j], cy[i] = alpha*yi + beta*cy[i],
|
TEST_OPERATION("GEMV(ROW, NoTrans)", M, N, yi+=cA(i,j)*cx[j], cy[i] = alpha*yi + beta*cy[i],
|
||||||
|
Reference in New Issue
Block a user