1 #ifndef VIENNACL_OCL_BACKEND_HPP_
2 #define VIENNACL_OCL_BACKEND_HPP_
35 template <
bool dummy = false>
45 current_context_id_ = i;
51 if (!initialized_[
id])
56 std::vector<viennacl::ocl::device> devices = contexts_[id].devices();
58 contexts_[
id].add_queue(devices[j]);
59 initialized_[id] =
true;
86 std::vector<cl_device_id>
const & devices)
89 std::cerr <<
"ViennaCL: Warning in init_context(): Providing a list of devices has no effect, because context for ViennaCL is already created!" << std::endl;
94 contexts_[i].add_device(devices[j]);
107 std::vector<cl_device_id>
const & devices,
108 std::map< cl_device_id, std::vector< cl_command_queue > >
const & queues)
110 assert(devices.size() == queues.size() && bool(
"ViennaCL expects one queue per device!"));
113 std::cerr <<
"ViennaCL: Warning in init_context(): Providing a list of devices has no effect, because context for ViennaCL is already created!" << std::endl;
118 contexts_[i].add_device(devices[j]);
121 contexts_[i].init(c);
124 typedef typename std::map< cl_device_id, std::vector< cl_command_queue > >::const_iterator queue_iterator;
125 for (queue_iterator qit = queues.begin();
129 std::vector<cl_command_queue>
const & queues_for_device = qit->second;
130 for (
vcl_size_t j=0; j<queues_for_device.size(); ++j)
131 contexts_[i].add_queue(qit->first, queues_for_device[j]);
134 initialized_[i] =
true;
145 static void setup_context(
long i, cl_context c, std::vector<cl_device_id>
const & devices, std::vector<cl_command_queue>
const & queue)
147 assert(devices.size() == queue.size() && bool(
"ViennaCL expects one queue per device!"));
150 std::map< cl_device_id, std::vector<cl_command_queue> > queues_map;
152 queues_map[devices[j]].push_back(queue[j]);
160 contexts_[i].default_device_type(t);
166 contexts_[i].default_device_num(num);
172 contexts_[i].platform_index(pf_index);
176 static long current_context_id_;
177 static std::map<long, bool> initialized_;
178 static std::map<long, viennacl::ocl::context> contexts_;
181 template <
bool dummy>
182 long backend<dummy>::current_context_id_ = 0;
184 template <
bool dummy>
185 std::map<long, bool> backend<dummy>::initialized_;
187 template <
bool dummy>
188 std::map<long, viennacl::ocl::context> backend<dummy>::contexts_;
211 std::vector<cl_device_id>
const & devices)
220 std::vector<cl_device_id> device_id_array(1);
221 device_id_array[0] = device.
id();
228 std::vector<cl_device_id>
const & devices,
229 std::map< cl_device_id, std::vector<cl_command_queue> >
const & queues)
235 inline void setup_context(
long i, cl_context c, std::vector<cl_device_id>
const & devices, std::vector<cl_command_queue>
const & queues)
241 inline void setup_context(
long i, cl_context c, cl_device_id d, cl_command_queue q)
243 std::vector<cl_device_id> devices(1);
244 std::vector<cl_command_queue> queues(1);
A tag identifying OpenCL devices as GPUs.
Definition: forwards.h:35
std::size_t vcl_size_t
Definition: forwards.h:58
viennacl::ocl::kernel & get_kernel(std::string const &prog_name, std::string const &kernel_name)
Convenience function for getting the kernel for a particular program from the current active context...
Definition: backend.hpp:318
static void set_context_device_num(long i, vcl_size_t num)
Sets the maximum number of devices per context. Ignored if a device array is provided as well...
Definition: backend.hpp:164
Represents an OpenCL kernel within ViennaCL.
Definition: kernel.hpp:59
Manages an OpenCL context and provides the respective convenience functions for creating buffers...
Definition: context.hpp:51
A tag identifying OpenCL devices as CPUs.
Definition: forwards.h:37
A class representing a compute device (e.g. a GPU)
Definition: device.hpp:49
void switch_device(vcl_size_t i)
Switches the current device to the i-th device in this context.
Definition: context.hpp:102
A class representing a command queue.
Definition: command_queue.hpp:45
static viennacl::ocl::command_queue & get_queue()
Returns the current queue for the active device in the active context.
Definition: backend.hpp:75
static void set_context_platform_index(long i, vcl_size_t pf_index)
Sets the context device type.
Definition: backend.hpp:170
viennacl::ocl::program & get_program(std::string const &name)
Returns the program with the provided name.
Definition: context.hpp:414
viennacl::ocl::device const & current_device() const
Returns the current device.
Definition: context.hpp:95
viennacl::ocl::device const & current_device()
Convenience function for returning the active device in the current context.
Definition: backend.hpp:330
void switch_device(viennacl::ocl::device &d)
Convenience function for switching the active device in the current context.
Definition: backend.hpp:324
viennacl::ocl::command_queue & get_queue()
Definition: context.hpp:249
cl_device_id id() const
Returns the OpenCL device id.
Definition: device.hpp:961
static viennacl::ocl::context & context(long id)
Returns the current active context.
Definition: backend.hpp:49
viennacl::ocl::command_queue & get_queue()
Convenience function for getting the default queue for the currently active device in the active cont...
Definition: backend.hpp:299
A tag identifying OpenCL devices as accelerators (e.g. Intel Xeon Phi)
Definition: forwards.h:39
static viennacl::ocl::context & current_context()
Returns the current active context.
Definition: backend.hpp:69
viennacl::ocl::context & current_context()
Convenience function for returning the current context.
Definition: backend.hpp:192
A backend that provides contexts for ViennaCL objects (vector, matrix, etc.)
Definition: backend.hpp:36
Represents an OpenCL context within ViennaCL.
void switch_context(long i)
Convenience function for switching the current context.
Definition: backend.hpp:198
static void switch_context(long i)
Switches the current context to the context identified by i.
Definition: backend.hpp:43
viennacl::ocl::kernel & get_kernel(std::string const &name)
Returns the kernel with the provided name.
Definition: context.hpp:638
static void setup_context(long i, cl_context c, std::vector< cl_device_id > const &devices, std::map< cl_device_id, std::vector< cl_command_queue > > const &queues)
Initializes ViennaCL with an already existing context.
Definition: backend.hpp:105
Enqueues kernels into command queues.
static void setup_context(long i, std::vector< cl_device_id > const &devices)
Sets a number of devices for the context.
Definition: backend.hpp:85
static void setup_context(long i, cl_context c, std::vector< cl_device_id > const &devices, std::vector< cl_command_queue > const &queue)
Initializes ViennaCL with an already existing context.
Definition: backend.hpp:145
static void set_context_device_type(long i, cl_device_type t)
Sets the context device type.
Definition: backend.hpp:158
void set_context_platform_index(long i, vcl_size_t pf_index)
Convenience function for setting the platform index.
Definition: backend.hpp:292
A tag denoting the default OpenCL device type (SDK-specific)
Definition: forwards.h:41
viennacl::ocl::context & get_context(long i)
Convenience function for returning the current context.
Definition: backend.hpp:204
void set_context_device_type(long i, cl_device_type dev_type)
Convenience function for setting the default device type for a context.
Definition: backend.hpp:251
void setup_context(long i, std::vector< cl_device_id > const &devices)
Convenience function for setting devices for a context.
Definition: backend.hpp:210
void set_context_device_num(long i, vcl_size_t num)
Convenience function for setting the number of default devices per context.
Definition: backend.hpp:281