From 28ea6ab3051fbeaa8f395de62b31f066120f9ca0 Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Tue, 26 Apr 2016 16:05:37 +0200 Subject: [PATCH] mtapi_cpp: added functionality to start Function objects directly as a task --- mtapi_cpp/include/embb/mtapi/execution_policy.h | 2 +- mtapi_cpp/include/embb/mtapi/mtapi.h | 1 + mtapi_cpp/include/embb/mtapi/node.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- mtapi_cpp/include/embb/mtapi/task_attributes.h | 26 ++++++++++++++++++++++++++ mtapi_cpp/src/execution_policy.cc | 2 +- mtapi_cpp/src/node.cc | 16 ++++++++-------- 6 files changed, 84 insertions(+), 14 deletions(-) diff --git a/mtapi_cpp/include/embb/mtapi/execution_policy.h b/mtapi_cpp/include/embb/mtapi/execution_policy.h index c6c7efa..bb132da 100644 --- a/mtapi_cpp/include/embb/mtapi/execution_policy.h +++ b/mtapi_cpp/include/embb/mtapi/execution_policy.h @@ -118,7 +118,7 @@ class ExecutionPolicy{ * * \return the affinity */ - const mtapi_affinity_t &GetAffinity() const; + mtapi_affinity_t GetAffinity() const; /** Returns the priority * diff --git a/mtapi_cpp/include/embb/mtapi/mtapi.h b/mtapi_cpp/include/embb/mtapi/mtapi.h index 35e6d26..eba5572 100644 --- a/mtapi_cpp/include/embb/mtapi/mtapi.h +++ b/mtapi_cpp/include/embb/mtapi/mtapi.h @@ -35,6 +35,7 @@ * \ingroup CPP */ +#include #include #include #include diff --git a/mtapi_cpp/include/embb/mtapi/node.h b/mtapi_cpp/include/embb/mtapi/node.h index cc92d59..d300df5 100644 --- a/mtapi_cpp/include/embb/mtapi/node.h +++ b/mtapi_cpp/include/embb/mtapi/node.h @@ -28,6 +28,7 @@ #define EMBB_MTAPI_NODE_H_ #include +#include #include #include #include @@ -37,6 +38,13 @@ #include #include #include +#include + +#ifdef GetJob +#undef GetJob +#endif + +#define EMBB_MTAPI_FUNCTION_JOB_ID 2 namespace embb { @@ -55,6 +63,8 @@ namespace mtapi { */ class Node { public: + typedef embb::base::Function SMPFunction; + /** * Initializes the runtime singleton using default values: * - all available cores will be used @@ -156,6 +166,27 @@ class Node { return task_limit_; } + Task Start( + SMPFunction const & func + ) { + Job job = GetJob(EMBB_MTAPI_FUNCTION_JOB_ID); + void * res = NULL; + return Start( + job, embb::base::Allocation::New(func), res); + } + + Task Start( + SMPFunction const & func, + ExecutionPolicy const & policy + ) { + Job job = GetJob(EMBB_MTAPI_FUNCTION_JOB_ID); + void * res = NULL; + TaskAttributes task_attr; + task_attr.SetPolicy(policy); + return Start( + job, embb::base::Allocation::New(func), res, task_attr); + } + /** * Starts a new Task. * @@ -236,10 +267,6 @@ class Node { MTAPI_DEFAULT_TASK_ATTRIBUTES); } -#ifdef GetJob -#undef GetJob -#endif - Job GetJob(mtapi_job_id_t job_id) { return Job(job_id, domain_id_); } @@ -397,6 +424,21 @@ class Node { return Task(task_hndl); } + static void ActionFunction( + const void* args, + mtapi_size_t /*args_size*/, + void* /*result_buffer*/, + mtapi_size_t /*result_buffer_size*/, + const void* /*node_local_data*/, + mtapi_size_t /*node_local_data_size*/, + mtapi_task_context_t * context) { + TaskContext task_context(context); + embb::base::Function * func = + reinterpret_cast*>(const_cast(args)); + (*func)(task_context); + embb::base::Allocation::Delete(func); + } + static embb::mtapi::Node * node_instance_; mtapi_domain_t domain_id_; @@ -405,6 +447,7 @@ class Node { mtapi_uint_t queue_count_; mtapi_uint_t group_count_; mtapi_uint_t task_limit_; + Action function_action_; }; } // namespace mtapi diff --git a/mtapi_cpp/include/embb/mtapi/task_attributes.h b/mtapi_cpp/include/embb/mtapi/task_attributes.h index 7c16094..2e7a305 100644 --- a/mtapi_cpp/include/embb/mtapi/task_attributes.h +++ b/mtapi_cpp/include/embb/mtapi/task_attributes.h @@ -29,6 +29,7 @@ #include #include +#include namespace embb { namespace mtapi { @@ -86,6 +87,31 @@ class TaskAttributes { } /** + * Sets the affinity of a Task. + * The affinity influences on which worker the Task will be executed. + * + * \returns Reference to this object. + * \notthreadsafe + */ + TaskAttributes & SetAffinity( + mtapi_affinity_t affinity /**< The affinity to set. */ + ) { + mtapi_status_t status; + mtapi_taskattr_set(&attributes_, MTAPI_TASK_AFFINITY, + &affinity, sizeof(affinity), &status); + internal::CheckStatus(status); + return *this; + } + + TaskAttributes & SetPolicy( + ExecutionPolicy const & policy + ) { + SetPriority(policy.GetPriority()); + SetAffinity(policy.GetAffinity()); + return *this; + } + + /** * Sets the number of instances in a Task. * The Task will be launched \c instances times. In the action function, * the number of instances and the current instance can be queried from diff --git a/mtapi_cpp/src/execution_policy.cc b/mtapi_cpp/src/execution_policy.cc index 80f2cf6..6691eda 100644 --- a/mtapi_cpp/src/execution_policy.cc +++ b/mtapi_cpp/src/execution_policy.cc @@ -109,7 +109,7 @@ unsigned int ExecutionPolicy::GetCoreCount() const { return embb_bitset_count(&affinity_); } -const mtapi_affinity_t &ExecutionPolicy::GetAffinity() const { +mtapi_affinity_t ExecutionPolicy::GetAffinity() const { return affinity_; } diff --git a/mtapi_cpp/src/node.cc b/mtapi_cpp/src/node.cc index bf27a62..9238995 100644 --- a/mtapi_cpp/src/node.cc +++ b/mtapi_cpp/src/node.cc @@ -41,11 +41,13 @@ void Node::Initialize( if (IsInitialized()) { EMBB_THROW(StatusException, "MTAPI: node was already initialized."); - } - else { + } else { NodeAttributes attributes; // default attributes node_instance_ = embb::base::Allocation::New( domain_id, node_id, attributes); + Job job = node_instance_->GetJob(EMBB_MTAPI_FUNCTION_JOB_ID); + node_instance_->function_action_ = + node_instance_->CreateAction(EMBB_MTAPI_FUNCTION_JOB_ID, ActionFunction); } } @@ -57,8 +59,7 @@ void Node::Initialize( if (IsInitialized()) { EMBB_THROW(StatusException, "MTAPI: node was already initialized."); - } - else { + } else { node_instance_ = embb::base::Allocation::New( domain_id, node_id, attributes); } @@ -79,8 +80,7 @@ Node & Node::GetInstance() { #else if (IsInitialized()) { return *node_instance_; - } - else { + } else { EMBB_THROW(StatusException, "MTAPI: node is not initialized."); } @@ -89,11 +89,11 @@ Node & Node::GetInstance() { void Node::Finalize() { if (IsInitialized()) { + node_instance_->function_action_.Delete(); mtapi_finalize(MTAPI_NULL); embb::base::Allocation::Delete(node_instance_); node_instance_ = NULL; - } - else { + } else { EMBB_THROW(StatusException, "MTAPI: node is not initialized."); } -- libgit2 0.26.0