Ejemplo n.º 1
0
 void add_arguments_to_kernel_rec(evnt_vec& events, args_vec& arguments, 
                                  T0& arg0, Ts&... args) {
     cl_int err{0};
     size_t buffer_size = sizeof(typename T0::value_type) * arg0.size();
     auto buffer = clCreateBuffer(m_context.get(),
                                  CL_MEM_READ_ONLY,
                                  buffer_size,
                                  nullptr,
                                  &err);
     if (err != CL_SUCCESS) {
         CPPA_LOGMF(CPPA_ERROR, "clCreateBuffer: " << get_opencl_error(err));
         return;
     }
     cl_event event;
     err = clEnqueueWriteBuffer(m_queue.get(), buffer, CL_FALSE, 0,
                                buffer_size, arg0.data(),
                                0, nullptr, &event);
     if (err != CL_SUCCESS) {
         CPPA_LOGMF(CPPA_ERROR, "clEnqueueWriteBuffer: "
                                << get_opencl_error(err));
         return;
     }
     events.push_back(std::move(event));
     mem_ptr tmp;
     tmp.adopt(std::move(buffer));
     arguments.push_back(tmp);
     add_arguments_to_kernel_rec(events, arguments, args...);
 }
Ejemplo n.º 2
0
 void add_arguments_to_kernel_rec(evnt_vec&, args_vec& arguments) {
     cl_int err{0};
     // rotate left (output buffer to the end)
     rotate(begin(arguments), begin(arguments) + 1, end(arguments));
     for(size_t i = 0; i < arguments.size(); ++i) {
         err = clSetKernelArg(m_kernel.get(), i, sizeof(cl_mem),
                              static_cast<void*>(&arguments[i]));
         CPPA_LOG_ERROR_IF(err != CL_SUCCESS,
                           "clSetKernelArg: " << get_opencl_error(err));
     }
     clFlush(m_queue.get());
 }
Ejemplo n.º 3
0
 void enqueue_read_buffers(cl_event& kernel_done, detail::int_list<I, Is...>) {
   using container_type =
     typename std::tuple_element<I, std::tuple<Ts...>>::type;
   using value_type = typename container_type::value_type;
   cl_event event;
   auto size = result_sizes_[I];
   auto buffer_size = sizeof(value_type) * result_sizes_[I];
   std::get<I>(result_buffers_).resize(size);
   auto err = clEnqueueReadBuffer(queue_.get(), output_buffers_[I].get(),
                                  CL_FALSE, 0, buffer_size,
                                  std::get<I>(result_buffers_).data(),
                                  1, &kernel_done, &event);
   if (err != CL_SUCCESS) {
     this->deref(); // failed to enqueue command
     throw std::runtime_error("clEnqueueReadBuffer: " +
                              get_opencl_error(err));
   }
   mem_out_events_.push_back(std::move(event));
   enqueue_read_buffers(kernel_done, detail::int_list<Is...>{});
 }