Commit 4bbacd3f authored by Joseph Noir's avatar Joseph Noir

actor_facade's enqueue no longer throws exceptions

added create to actor_facade, constructor is now private
parent 624a2741
...@@ -72,32 +72,44 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -72,32 +72,44 @@ class actor_facade<Ret(Args...)> : public actor {
typedef std::function<option<args_tuple>(any_tuple)> arg_mapping; typedef std::function<option<args_tuple>(any_tuple)> arg_mapping;
typedef std::function<any_tuple(Ret&)> result_mapping; typedef std::function<any_tuple(Ret&)> result_mapping;
actor_facade(command_dispatcher* dispatcher, static actor_facade* create(command_dispatcher* dispatcher,
const program& prog, const program& prog,
const char* kernel_name, const char* kernel_name,
std::vector<size_t> global_dimensions, std::vector<size_t> global_dimensions,
std::vector<size_t> global_offsets, std::vector<size_t> global_offsets,
std::vector<size_t> local_dimensions, std::vector<size_t> local_dimensions,
arg_mapping map_args, arg_mapping map_args,
result_mapping map_result) result_mapping map_result) {
: m_program(prog.m_program) if(local_dimensions .size() > 3 ||
, m_context(prog.m_context) global_dimensions.size() > 3 ||
, m_dispatcher(dispatcher) global_dimensions.empty()) {
, m_global_dimensions(std::move(global_dimensions))
, m_global_offsets(std::move(global_offsets))
, m_local_dimensions(std::move(local_dimensions))
, m_map_args(std::move(map_args))
, m_map_result(std::move(map_result))
{
CPPA_LOG_TRACE("new actor facde with ID " << this->id());
if(m_local_dimensions .size() > 3 ||
m_global_dimensions.size() > 3) {
std::ostringstream oss; std::ostringstream oss;
oss << "Creating actor facade: a maximum of 3 dimensions allowed."; oss << "OpenCL kernel allows a maximum of 3 dimensions"
" and needs at least 1 global dimension.";
CPPA_LOG_ERROR(oss.str()); CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str()); throw std::runtime_error(oss.str());
} }
init_kernel(m_program.get(), kernel_name); cl_int err{0};
kernel_ptr kernel;
kernel.adopt(clCreateKernel(prog.m_program.get(),
kernel_name,
&err));
if (err != CL_SUCCESS) {
std::ostringstream oss;
oss << "clCreateKernel: '"
<< get_opencl_error(err)
<< "'.";
CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str());
}
return new actor_facade<Ret (Args...)>{dispatcher,
kernel,
prog,
std::move(global_dimensions),
std::move(global_offsets),
std::move(local_dimensions),
std::move(map_args),
std::move(map_result)};
} }
void sync_enqueue(const actor_ptr& sender, message_id id, any_tuple msg) { void sync_enqueue(const actor_ptr& sender, message_id id, any_tuple msg) {
...@@ -115,29 +127,29 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -115,29 +127,29 @@ class actor_facade<Ret(Args...)> : public actor {
private: private:
void init_kernel(cl_program program, const char* kernel_name) { actor_facade(command_dispatcher* dispatcher,
cl_int err{0}; kernel_ptr kernel,
m_kernel.adopt(clCreateKernel(program, const program& prog,
kernel_name, std::vector<size_t> global_dimensions,
&err)); std::vector<size_t> global_offsets,
if (err != CL_SUCCESS) { std::vector<size_t> local_dimensions,
std::ostringstream oss; arg_mapping map_args,
oss << "clCreateKernel: '" result_mapping map_result)
<< get_opencl_error(err) : m_kernel(kernel)
<< "'."; , m_program(prog.m_program)
CPPA_LOG_ERROR(oss.str()); , m_context(prog.m_context)
throw std::runtime_error(oss.str()); , m_dispatcher(dispatcher)
} , m_global_dimensions(std::move(global_dimensions))
, m_global_offsets(std::move(global_offsets))
, m_local_dimensions(std::move(local_dimensions))
, m_map_args(std::move(map_args))
, m_map_result(std::move(map_result))
{
CPPA_LOG_TRACE("new actor_facde with ID " << this->id());
} }
template<long... Is> template<long... Is>
void enqueue_impl(const actor_ptr& sender, any_tuple msg, message_id id, util::int_list<Is...>) { void enqueue_impl(const actor_ptr& sender, any_tuple msg, message_id id, util::int_list<Is...>) {
if (m_global_dimensions.empty()) {
std::ostringstream oss;
oss << "actor_facade::enqueue() global dimensions can't be empty!";
CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str());
}
auto opt = m_map_args(msg); auto opt = m_map_args(msg);
if (opt) { if (opt) {
response_handle handle{this, sender, id}; response_handle handle{this, sender, id};
...@@ -169,8 +181,8 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -169,8 +181,8 @@ class actor_facade<Ret(Args...)> : public actor {
typedef std::vector<mem_ptr> args_vec; typedef std::vector<mem_ptr> args_vec;
program_ptr m_program;
kernel_ptr m_kernel; kernel_ptr m_kernel;
program_ptr m_program;
context_ptr m_context; context_ptr m_context;
command_dispatcher* m_dispatcher; command_dispatcher* m_dispatcher;
std::vector<size_t> m_global_dimensions; std::vector<size_t> m_global_dimensions;
...@@ -194,7 +206,7 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -194,7 +206,7 @@ class actor_facade<Ret(Args...)> : public actor {
<< get_opencl_error(err) << get_opencl_error(err)
<< "'."; << "'.";
CPPA_LOG_ERROR(oss.str()); CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str()); return;
} }
} }
err = clSetKernelArg(kernel, err = clSetKernelArg(kernel,
...@@ -207,7 +219,7 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -207,7 +219,7 @@ class actor_facade<Ret(Args...)> : public actor {
<< get_opencl_error(err) << get_opencl_error(err)
<< "'."; << "'.";
CPPA_LOG_ERROR(oss.str()); CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str()); return;
} }
} }
...@@ -229,7 +241,7 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -229,7 +241,7 @@ class actor_facade<Ret(Args...)> : public actor {
<< get_opencl_error(err) << get_opencl_error(err)
<< "'."; << "'.";
CPPA_LOG_ERROR(oss.str()); CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str()); return;
} }
else { else {
mem_ptr tmp; mem_ptr tmp;
...@@ -261,7 +273,7 @@ class actor_facade<Ret(Args...)> : public actor { ...@@ -261,7 +273,7 @@ class actor_facade<Ret(Args...)> : public actor {
<< get_opencl_error(err) << get_opencl_error(err)
<< "'."; << "'.";
CPPA_LOG_ERROR(oss.str()); CPPA_LOG_ERROR(oss.str());
throw std::runtime_error(oss.str()); return;
} }
else { else {
mem_ptr tmp; mem_ptr tmp;
......
...@@ -91,7 +91,7 @@ class command_dispatcher { ...@@ -91,7 +91,7 @@ class command_dispatcher {
std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> map_args, std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> map_args,
std::function<any_tuple(Ret&)> map_result) std::function<any_tuple(Ret&)> map_result)
{ {
return new actor_facade<Ret (Args...)>(this, return actor_facade<Ret (Args...)>::create(this,
prog, prog,
kernel_name, kernel_name,
std::move(global_dims), std::move(global_dims),
...@@ -108,10 +108,11 @@ class command_dispatcher { ...@@ -108,10 +108,11 @@ class command_dispatcher {
std::vector<size_t> global_offs = {}, std::vector<size_t> global_offs = {},
std::vector<size_t> local_dims = {}) std::vector<size_t> local_dims = {})
{ {
std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)> f0 = [] (any_tuple msg) { std::function<option<cow_tuple<typename util::rm_ref<Args>::type...>>(any_tuple)>
map_args = [] (any_tuple msg) {
return tuple_cast<typename util::rm_ref<Args>::type...>(msg); return tuple_cast<typename util::rm_ref<Args>::type...>(msg);
}; };
std::function<any_tuple(Ret&)> f1 = [] (Ret& result) { std::function<any_tuple(Ret&)> map_result = [] (Ret& result) {
return make_any_tuple(std::move(result)); return make_any_tuple(std::move(result));
}; };
return this->spawn<Ret,Args...>(prog, return this->spawn<Ret,Args...>(prog,
...@@ -119,8 +120,8 @@ class command_dispatcher { ...@@ -119,8 +120,8 @@ class command_dispatcher {
std::move(global_dims), std::move(global_dims),
std::move(global_offs), std::move(global_offs),
std::move(local_dims), std::move(local_dims),
std::move(f0), std::move(map_args),
std::move(f1)); std::move(map_result));
} }
private: private:
......
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