1 #ifndef VIENNACL_OCL_ENQUEUE_HPP_
2 #define VIENNACL_OCL_ENQUEUE_HPP_
26 #include <OpenCL/cl.h>
39 namespace device_specific
41 class custom_operation;
49 template<
typename KernelType>
52 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
57 if (k.local_work_size(1) == 0)
59 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
60 std::cout <<
"ViennaCL: Starting 1D-kernel '" << k.name() <<
"'..." << std::endl;
61 std::cout <<
"ViennaCL: Global work size: '" << k.global_work_size() <<
"'..." << std::endl;
62 std::cout <<
"ViennaCL: Local work size: '" << k.local_work_size() <<
"'..." << std::endl;
69 if (tmp_global == 1 && tmp_local == 1)
70 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
71 err = clEnqueueTask(queue.
handle().
get(), k.handle().get(), 0, NULL, &event);
73 err = clEnqueueTask(queue.
handle().
get(), k.handle().get(), 0, NULL, NULL);
76 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
77 err = clEnqueueNDRangeKernel(queue.
handle().
get(), k.handle().get(), 1, NULL, &tmp_global, &tmp_local, 0, NULL, &event);
79 err = clEnqueueNDRangeKernel(queue.
handle().
get(), k.handle().get(), 1, NULL, &tmp_global, &tmp_local, 0, NULL, NULL);
82 if (err != CL_SUCCESS)
84 std::cerr <<
"ViennaCL: FATAL ERROR: Kernel start failed for '" << k.name() <<
"'." << std::endl;
85 std::cerr <<
"ViennaCL: Smaller work sizes could not solve the problem. " << std::endl;
91 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
92 std::cout <<
"ViennaCL: Starting 2D/3D-kernel '" << k.name() <<
"'..." << std::endl;
93 std::cout <<
"ViennaCL: Global work size: '" << k.global_work_size(0) <<
", " << k.global_work_size(1) <<
", " << k.global_work_size(2) <<
"'..." << std::endl;
94 std::cout <<
"ViennaCL: Local work size: '" << k.local_work_size(0) <<
", " << k.local_work_size(1) <<
", " << k.local_work_size(2) <<
"'..." << std::endl;
98 tmp_global[0] = k.global_work_size(0);
99 tmp_global[1] = k.global_work_size(1);
100 tmp_global[2] = k.global_work_size(2);
103 tmp_local[0] = k.local_work_size(0);
104 tmp_local[1] = k.local_work_size(1);
105 tmp_local[2] = k.local_work_size(2);
107 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
108 cl_int err = clEnqueueNDRangeKernel(queue.
handle().
get(), k.handle().get(), (tmp_global[2] == 0) ? 2 : 3, NULL, tmp_global, tmp_local, 0, NULL, &event);
110 cl_int err = clEnqueueNDRangeKernel(queue.
handle().
get(), k.handle().get(), (tmp_global[2] == 0) ? 2 : 3, NULL, tmp_global, tmp_local, 0, NULL, NULL);
112 if (err != CL_SUCCESS)
115 std::cerr <<
"ViennaCL: FATAL ERROR: Kernel start failed for '" << k.name() <<
"'." << std::endl;
120 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_KERNEL)
122 cl_int execution_status;
123 clGetEventInfo(event, CL_EVENT_COMMAND_EXECUTION_STATUS,
sizeof(cl_int), &execution_status, NULL);
124 std::cout <<
"ViennaCL: Kernel " << k.name() <<
" finished with status " << execution_status <<
"!" << std::endl;
130 template<
typename KernelType>
133 enqueue(k, k.context().get_queue());
141 inline void enqueue(viennacl::device_specific::custom_operation & op)
void finish() const
Waits until all kernels in the queue have finished their execution.
viennacl::ocl::context & current_context()
Convenience function for returning the current context.
A class representing a command queue.
viennacl::ocl::handle< cl_command_queue > const & handle() const
Implementations of command queue representations.
#define VIENNACL_ERR_CHECK(err)
const OCL_TYPE & get() const
viennacl::ocl::command_queue & get_queue()
Convenience function for getting the default queue for the currently active device in the active cont...
void enqueue_custom_op(viennacl::device_specific::custom_operation &op, viennacl::ocl::command_queue const &queue)
Represents an OpenCL context within ViennaCL.
Implementations of the OpenCL backend, where all contexts are stored in.
void enqueue(KernelType &k, viennacl::ocl::command_queue const &queue)
Enqueues a kernel in the provided queue.
Representation of an OpenCL kernel in ViennaCL.