Commit d6ddf1ff authored by Joseph Noir's avatar Joseph Noir

changed cl_event handling in command

preparation for asynchronous copy operations to device
parent 9ce2a1cf
...@@ -163,12 +163,14 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -163,12 +163,14 @@ class actor_facade<Ret(Args...)> : public actor {
if (opt) { if (opt) {
response_handle handle{this, sender, id.response_id()}; response_handle handle{this, sender, id.response_id()};
std::vector<mem_ptr> arguments; std::vector<mem_ptr> arguments;
std::vector<cl_event> events;
add_arguments_to_kernel<Ret>(arguments, add_arguments_to_kernel<Ret>(arguments,
m_result_size, m_result_size,
get_ref<Is>(*opt)...); get_ref<Is>(*opt)...);
auto cmd = make_counted<command<actor_facade, Ret>>(handle, auto cmd = make_counted<command<actor_facade, Ret>>(handle,
this, this,
std::move(arguments), std::move(arguments),
std::move(events),
m_result_size); m_result_size);
cmd->enqueue(); cmd->enqueue();
} }
......
...@@ -54,19 +54,32 @@ class command : public ref_counted { ...@@ -54,19 +54,32 @@ class command : public ref_counted {
command(response_handle handle, command(response_handle handle,
intrusive_ptr<T> actor_facade, intrusive_ptr<T> actor_facade,
std::vector<mem_ptr> arguments, std::vector<mem_ptr> arguments,
std::vector<cl_event> events,
size_t result_size) size_t result_size)
: m_result_size(result_size) : m_result_size(result_size)
, m_handle(handle) , m_handle(handle)
, m_actor_facade(actor_facade) , m_actor_facade(actor_facade)
, m_queue(actor_facade->m_queue) , m_queue(actor_facade->m_queue)
, m_arguments(move(arguments)) , m_arguments(std::move(arguments))
, m_events(std::move(events))
, m_result(m_result_size) { } , m_result(m_result_size) { }
~command() {
cl_int err{0};
for(auto& e : m_events) {
err = clReleaseEvent(e);
if (err != CL_SUCCESS) {
CPPA_LOGMF(CPPA_ERROR, self, "clReleaseEvent: "
<< get_opencl_error(err));
}
}
}
void enqueue () { void enqueue () {
CPPA_LOG_TRACE("command::enqueue()"); CPPA_LOG_TRACE("command::enqueue()");
this->ref(); // reference held by the OpenCL comand queue this->ref(); // reference held by the OpenCL comand queue
cl_int err{0}; cl_int err{0};
auto event_k = m_kernel_event.get(); cl_event event_k;
auto data_or_nullptr = [](const dim_vec& vec) { auto data_or_nullptr = [](const dim_vec& vec) {
return vec.empty() ? nullptr : vec.data(); return vec.empty() ? nullptr : vec.data();
}; };
...@@ -80,13 +93,14 @@ class command : public ref_counted { ...@@ -80,13 +93,14 @@ class command : public ref_counted {
0, 0,
nullptr, nullptr,
&event_k); &event_k);
m_events.push_back(event_k);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
CPPA_LOGMF(CPPA_ERROR, self, "clEnqueueNDRangeKernel: " CPPA_LOGMF(CPPA_ERROR, self, "clEnqueueNDRangeKernel: "
<< get_opencl_error(err)); << get_opencl_error(err));
this->deref(); // or can anything actually happen? this->deref(); // or can anything actually happen?
} }
else { else {
auto event_r = m_read_event.get(); cl_event event_r;
err = clEnqueueReadBuffer(m_queue.get(), err = clEnqueueReadBuffer(m_queue.get(),
m_arguments.back().get(), m_arguments.back().get(),
CL_FALSE, CL_FALSE,
...@@ -96,6 +110,7 @@ class command : public ref_counted { ...@@ -96,6 +110,7 @@ class command : public ref_counted {
1, 1,
&event_k, &event_k,
&event_r); &event_r);
m_events.push_back(event_r);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
throw std::runtime_error("clEnqueueReadBuffer: " throw std::runtime_error("clEnqueueReadBuffer: "
+ get_opencl_error(err)); + get_opencl_error(err));
...@@ -127,10 +142,9 @@ class command : public ref_counted { ...@@ -127,10 +142,9 @@ class command : public ref_counted {
int m_result_size; int m_result_size;
response_handle m_handle; response_handle m_handle;
intrusive_ptr<T> m_actor_facade; intrusive_ptr<T> m_actor_facade;
event_ptr m_kernel_event;
event_ptr m_read_event;
command_queue_ptr m_queue; command_queue_ptr m_queue;
std::vector<mem_ptr> m_arguments; std::vector<mem_ptr> m_arguments;
std::vector<cl_event> m_events;
R m_result; R m_result;
void handle_results () { void handle_results () {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment