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...); }
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()); }
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...>{}); }