From 2cacd20f930bac9189ffd1b56ab41a156e1b2ea9 Mon Sep 17 00:00:00 2001 From: Marcus Winter Date: Wed, 29 Jun 2016 12:38:47 +0200 Subject: [PATCH] mtapi_c: added interface to set worker thread priorities --- mtapi_c/include/embb/mtapi/c/mtapi.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- mtapi_c/src/embb_mtapi_node_t.c | 12 ++++++------ mtapi_c/src/embb_mtapi_scheduler_t.c | 21 +++++++++++++++++++-- mtapi_c/src/embb_mtapi_thread_context_t.c | 7 +++++-- mtapi_c/src/embb_mtapi_thread_context_t.h | 7 +++++-- mtapi_c/src/mtapi_node_attributes_t.c | 6 ++++++ 6 files changed, 125 insertions(+), 13 deletions(-) diff --git a/mtapi_c/include/embb/mtapi/c/mtapi.h b/mtapi_c/include/embb/mtapi/c/mtapi.h index f007db7..896d480 100644 --- a/mtapi_c/include/embb/mtapi/c/mtapi.h +++ b/mtapi_c/include/embb/mtapi/c/mtapi.h @@ -244,6 +244,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -529,6 +530,82 @@ enum mtapi_notification_enum { typedef enum mtapi_notification_enum mtapi_notification_t; /**< runtime notification */ +enum mtapi_worker_priority_type_enum { + MTAPI_WORKER_PRIORITY_END = 0, + MTAPI_WORKER_PRIORITY_DEFAULT = 1, + MTAPI_WORKER_PRIORITY_WORKER = 100, + MTAPI_WORKER_PRIORITY_WORKER_0 = MTAPI_WORKER_PRIORITY_WORKER + 0, + MTAPI_WORKER_PRIORITY_WORKER_1 = MTAPI_WORKER_PRIORITY_WORKER + 1, + MTAPI_WORKER_PRIORITY_WORKER_2 = MTAPI_WORKER_PRIORITY_WORKER + 2, + MTAPI_WORKER_PRIORITY_WORKER_3 = MTAPI_WORKER_PRIORITY_WORKER + 3, + MTAPI_WORKER_PRIORITY_WORKER_4 = MTAPI_WORKER_PRIORITY_WORKER + 4, + MTAPI_WORKER_PRIORITY_WORKER_5 = MTAPI_WORKER_PRIORITY_WORKER + 5, + MTAPI_WORKER_PRIORITY_WORKER_6 = MTAPI_WORKER_PRIORITY_WORKER + 6, + MTAPI_WORKER_PRIORITY_WORKER_7 = MTAPI_WORKER_PRIORITY_WORKER + 7, + MTAPI_WORKER_PRIORITY_WORKER_8 = MTAPI_WORKER_PRIORITY_WORKER + 8, + MTAPI_WORKER_PRIORITY_WORKER_9 = MTAPI_WORKER_PRIORITY_WORKER + 9, + MTAPI_WORKER_PRIORITY_WORKER_10 = MTAPI_WORKER_PRIORITY_WORKER + 10, + MTAPI_WORKER_PRIORITY_WORKER_11 = MTAPI_WORKER_PRIORITY_WORKER + 11, + MTAPI_WORKER_PRIORITY_WORKER_12 = MTAPI_WORKER_PRIORITY_WORKER + 12, + MTAPI_WORKER_PRIORITY_WORKER_13 = MTAPI_WORKER_PRIORITY_WORKER + 13, + MTAPI_WORKER_PRIORITY_WORKER_14 = MTAPI_WORKER_PRIORITY_WORKER + 14, + MTAPI_WORKER_PRIORITY_WORKER_15 = MTAPI_WORKER_PRIORITY_WORKER + 15, + MTAPI_WORKER_PRIORITY_WORKER_16 = MTAPI_WORKER_PRIORITY_WORKER + 16, + MTAPI_WORKER_PRIORITY_WORKER_17 = MTAPI_WORKER_PRIORITY_WORKER + 17, + MTAPI_WORKER_PRIORITY_WORKER_18 = MTAPI_WORKER_PRIORITY_WORKER + 18, + MTAPI_WORKER_PRIORITY_WORKER_19 = MTAPI_WORKER_PRIORITY_WORKER + 19, + MTAPI_WORKER_PRIORITY_WORKER_20 = MTAPI_WORKER_PRIORITY_WORKER + 20, + MTAPI_WORKER_PRIORITY_WORKER_21 = MTAPI_WORKER_PRIORITY_WORKER + 21, + MTAPI_WORKER_PRIORITY_WORKER_22 = MTAPI_WORKER_PRIORITY_WORKER + 22, + MTAPI_WORKER_PRIORITY_WORKER_23 = MTAPI_WORKER_PRIORITY_WORKER + 23, + MTAPI_WORKER_PRIORITY_WORKER_24 = MTAPI_WORKER_PRIORITY_WORKER + 24, + MTAPI_WORKER_PRIORITY_WORKER_25 = MTAPI_WORKER_PRIORITY_WORKER + 25, + MTAPI_WORKER_PRIORITY_WORKER_26 = MTAPI_WORKER_PRIORITY_WORKER + 26, + MTAPI_WORKER_PRIORITY_WORKER_27 = MTAPI_WORKER_PRIORITY_WORKER + 27, + MTAPI_WORKER_PRIORITY_WORKER_28 = MTAPI_WORKER_PRIORITY_WORKER + 28, + MTAPI_WORKER_PRIORITY_WORKER_29 = MTAPI_WORKER_PRIORITY_WORKER + 29, + MTAPI_WORKER_PRIORITY_WORKER_30 = MTAPI_WORKER_PRIORITY_WORKER + 30, + MTAPI_WORKER_PRIORITY_WORKER_31 = MTAPI_WORKER_PRIORITY_WORKER + 31, + MTAPI_WORKER_PRIORITY_WORKER_32 = MTAPI_WORKER_PRIORITY_WORKER + 32, + MTAPI_WORKER_PRIORITY_WORKER_33 = MTAPI_WORKER_PRIORITY_WORKER + 33, + MTAPI_WORKER_PRIORITY_WORKER_34 = MTAPI_WORKER_PRIORITY_WORKER + 34, + MTAPI_WORKER_PRIORITY_WORKER_35 = MTAPI_WORKER_PRIORITY_WORKER + 35, + MTAPI_WORKER_PRIORITY_WORKER_36 = MTAPI_WORKER_PRIORITY_WORKER + 36, + MTAPI_WORKER_PRIORITY_WORKER_37 = MTAPI_WORKER_PRIORITY_WORKER + 37, + MTAPI_WORKER_PRIORITY_WORKER_38 = MTAPI_WORKER_PRIORITY_WORKER + 38, + MTAPI_WORKER_PRIORITY_WORKER_39 = MTAPI_WORKER_PRIORITY_WORKER + 39, + MTAPI_WORKER_PRIORITY_WORKER_40 = MTAPI_WORKER_PRIORITY_WORKER + 40, + MTAPI_WORKER_PRIORITY_WORKER_41 = MTAPI_WORKER_PRIORITY_WORKER + 41, + MTAPI_WORKER_PRIORITY_WORKER_42 = MTAPI_WORKER_PRIORITY_WORKER + 42, + MTAPI_WORKER_PRIORITY_WORKER_43 = MTAPI_WORKER_PRIORITY_WORKER + 43, + MTAPI_WORKER_PRIORITY_WORKER_44 = MTAPI_WORKER_PRIORITY_WORKER + 44, + MTAPI_WORKER_PRIORITY_WORKER_45 = MTAPI_WORKER_PRIORITY_WORKER + 45, + MTAPI_WORKER_PRIORITY_WORKER_46 = MTAPI_WORKER_PRIORITY_WORKER + 46, + MTAPI_WORKER_PRIORITY_WORKER_47 = MTAPI_WORKER_PRIORITY_WORKER + 47, + MTAPI_WORKER_PRIORITY_WORKER_48 = MTAPI_WORKER_PRIORITY_WORKER + 48, + MTAPI_WORKER_PRIORITY_WORKER_49 = MTAPI_WORKER_PRIORITY_WORKER + 49, + MTAPI_WORKER_PRIORITY_WORKER_50 = MTAPI_WORKER_PRIORITY_WORKER + 50, + MTAPI_WORKER_PRIORITY_WORKER_51 = MTAPI_WORKER_PRIORITY_WORKER + 51, + MTAPI_WORKER_PRIORITY_WORKER_52 = MTAPI_WORKER_PRIORITY_WORKER + 52, + MTAPI_WORKER_PRIORITY_WORKER_53 = MTAPI_WORKER_PRIORITY_WORKER + 53, + MTAPI_WORKER_PRIORITY_WORKER_54 = MTAPI_WORKER_PRIORITY_WORKER + 54, + MTAPI_WORKER_PRIORITY_WORKER_55 = MTAPI_WORKER_PRIORITY_WORKER + 55, + MTAPI_WORKER_PRIORITY_WORKER_56 = MTAPI_WORKER_PRIORITY_WORKER + 56, + MTAPI_WORKER_PRIORITY_WORKER_57 = MTAPI_WORKER_PRIORITY_WORKER + 57, + MTAPI_WORKER_PRIORITY_WORKER_58 = MTAPI_WORKER_PRIORITY_WORKER + 58, + MTAPI_WORKER_PRIORITY_WORKER_59 = MTAPI_WORKER_PRIORITY_WORKER + 59, + MTAPI_WORKER_PRIORITY_WORKER_60 = MTAPI_WORKER_PRIORITY_WORKER + 60, + MTAPI_WORKER_PRIORITY_WORKER_61 = MTAPI_WORKER_PRIORITY_WORKER + 61, + MTAPI_WORKER_PRIORITY_WORKER_62 = MTAPI_WORKER_PRIORITY_WORKER + 62, + MTAPI_WORKER_PRIORITY_WORKER_63 = MTAPI_WORKER_PRIORITY_WORKER + 63 +}; +typedef enum mtapi_worker_priority_type_enum mtapi_worker_priority_type_t; + +struct mtapi_worker_priority_entry_struct { + mtapi_worker_priority_type_t type; + embb_thread_priority_t priority; +}; +typedef struct mtapi_worker_priority_entry_struct mtapi_worker_priority_entry_t; /** * Node attributes, to be extended for implementation specific attributes @@ -554,7 +631,8 @@ enum mtapi_node_attributes_enum { allowed by the node */ MTAPI_NODE_MAX_PRIORITIES, /**< maximum number of priorities allowed by the node */ - MTAPI_NODE_REUSE_MAIN_THREAD /**< reuse main thread as worker */ + MTAPI_NODE_REUSE_MAIN_THREAD, /**< reuse main thread as worker */ + MTAPI_NODE_WORKER_PRIORITIES /**< set worker priorites */ }; /** size of the \a MTAPI_NODE_CORE_AFFINITY attribute */ #define MTAPI_NODE_CORE_AFFINITY_SIZE sizeof(embb_core_set_t) @@ -580,6 +658,8 @@ enum mtapi_node_attributes_enum { #define MTAPI_NODE_MAX_PRIORITIES_SIZE sizeof(mtapi_uint_t) /** size of the \a MTAPI_NODE_REUSE_MAIN_THREAD attribute */ #define MTAPI_NODE_REUSE_MAIN_THREAD_SIZE sizeof(mtapi_boolean_t) +/** size of the \a MTAPI_NODE_WORKER_PRIORITIES attribute */ +#define MTAPI_NODE_WORKER_PRIORITIES_SIZE 0 /* example attribute value */ #define MTAPI_NODE_TYPE_SMP 1 @@ -693,6 +773,9 @@ struct mtapi_node_attributes_struct { mtapi_uint_t max_priorities; /**< stores MTAPI_NODE_MAX_PRIORITIES */ mtapi_boolean_t reuse_main_thread; /**< stores MTAPI_NODE_REUSE_MAIN_THREAD */ + mtapi_worker_priority_entry_t * worker_priorities; + /**< stores + MTAPI_NODE_WORKER_PRIORITIES */ }; /** diff --git a/mtapi_c/src/embb_mtapi_node_t.c b/mtapi_c/src/embb_mtapi_node_t.c index da6a8b3..130fc64 100644 --- a/mtapi_c/src/embb_mtapi_node_t.c +++ b/mtapi_c/src/embb_mtapi_node_t.c @@ -131,12 +131,12 @@ void mtapi_initialize( node->scheduler = embb_mtapi_scheduler_new(); if (MTAPI_NULL != node->scheduler) { /* fill information structure */ - node->info.mtapi_version = 0x1000; // mtapi version 1.0 - node->info.organization_id = MCA_ORG_ID_EMB; - node->info.implementation_version = - EMBB_BASE_VERSION_MAJOR * 0x1000 + EMBB_BASE_VERSION_MINOR; - node->info.number_of_domains = ~0u; - node->info.number_of_nodes = ~0u; + node->info.mtapi_version = 0x1000; // mtapi version 1.0 + node->info.organization_id = MCA_ORG_ID_EMB; + node->info.implementation_version = + EMBB_BASE_VERSION_MAJOR * 0x1000 + EMBB_BASE_VERSION_MINOR; + node->info.number_of_domains = ~0u; + node->info.number_of_nodes = ~0u; node->info.hardware_concurrency = embb_core_count_available(); node->info.used_memory = embb_mtapi_alloc_get_bytes_allocated(); if (MTAPI_NULL != mtapi_info) { diff --git a/mtapi_c/src/embb_mtapi_scheduler_t.c b/mtapi_c/src/embb_mtapi_scheduler_t.c index 7e4052c..a5ad6d3 100644 --- a/mtapi_c/src/embb_mtapi_scheduler_t.c +++ b/mtapi_c/src/embb_mtapi_scheduler_t.c @@ -503,8 +503,25 @@ mtapi_boolean_t embb_mtapi_scheduler_initialize_with_mode( } core_num++; } - isinit &= embb_mtapi_thread_context_initialize_with_node_worker_and_core( - &that->worker_contexts[ii], node, ii, core_num); + embb_thread_priority_t priority = EMBB_THREAD_PRIORITY_NORMAL; + if (NULL != node->attributes.worker_priorities) { + mtapi_worker_priority_entry_t * entry = + node->attributes.worker_priorities; + mtapi_worker_priority_type_t type = entry->type; + while (type != MTAPI_WORKER_PRIORITY_END) { + if (type == MTAPI_WORKER_PRIORITY_DEFAULT) { + priority = entry->priority; + } else if (type == + (mtapi_worker_priority_type_t)(MTAPI_WORKER_PRIORITY_WORKER + ii)) { + priority = entry->priority; + break; + } + entry++; + type = entry->type; + } + } + isinit &= embb_mtapi_thread_context_initialize( + &that->worker_contexts[ii], node, ii, core_num, priority); } if (!isinit) { return MTAPI_FALSE; diff --git a/mtapi_c/src/embb_mtapi_thread_context_t.c b/mtapi_c/src/embb_mtapi_thread_context_t.c index 56077ac..5f64104 100644 --- a/mtapi_c/src/embb_mtapi_thread_context_t.c +++ b/mtapi_c/src/embb_mtapi_thread_context_t.c @@ -38,11 +38,12 @@ /* ---- CLASS MEMBERS ------------------------------------------------------ */ -mtapi_boolean_t embb_mtapi_thread_context_initialize_with_node_worker_and_core( +mtapi_boolean_t embb_mtapi_thread_context_initialize( embb_mtapi_thread_context_t* that, embb_mtapi_node_t* node, mtapi_uint_t worker_index, - mtapi_uint_t core_num) { + mtapi_uint_t core_num, + embb_thread_priority_t priority) { mtapi_uint_t ii; mtapi_boolean_t result = MTAPI_TRUE; @@ -54,6 +55,7 @@ mtapi_boolean_t embb_mtapi_thread_context_initialize_with_node_worker_and_core( that->core_num = core_num; that->priorities = node->attributes.max_priorities; that->is_initialized = MTAPI_FALSE; + that->thread_priority = priority; that->is_main_thread = (worker_index == 0) ? node->attributes.reuse_main_thread : MTAPI_FALSE; embb_atomic_store_int(&that->run, 0); @@ -142,6 +144,7 @@ mtapi_boolean_t embb_mtapi_thread_context_start( "create thread %d on core %d\n", that->worker_index, that->core_num); return MTAPI_FALSE; } + embb_thread_set_priority(&that->thread, that->thread_priority); /* wait for worker to come up */ while (0 == embb_atomic_load_int(&that->run)) { embb_thread_yield(); diff --git a/mtapi_c/src/embb_mtapi_thread_context_t.h b/mtapi_c/src/embb_mtapi_thread_context_t.h index a2ba731..89288b3 100644 --- a/mtapi_c/src/embb_mtapi_thread_context_t.h +++ b/mtapi_c/src/embb_mtapi_thread_context_t.h @@ -69,6 +69,8 @@ struct embb_mtapi_thread_context_struct { mtapi_status_t status; mtapi_boolean_t is_initialized; mtapi_boolean_t is_main_thread; + + embb_thread_priority_t thread_priority; }; #include @@ -78,11 +80,12 @@ struct embb_mtapi_thread_context_struct { * \memberof embb_mtapi_thread_context_struct * \returns MTAPI_TRUE if successful, MTAPI_FALSE on error */ -mtapi_boolean_t embb_mtapi_thread_context_initialize_with_node_worker_and_core( +mtapi_boolean_t embb_mtapi_thread_context_initialize( embb_mtapi_thread_context_t* that, embb_mtapi_node_t* node, mtapi_uint_t worker_index, - mtapi_uint_t core_num); + mtapi_uint_t core_num, + embb_thread_priority_t priority); /** * Destructor. diff --git a/mtapi_c/src/mtapi_node_attributes_t.c b/mtapi_c/src/mtapi_node_attributes_t.c index 791bc37..3144654 100644 --- a/mtapi_c/src/mtapi_node_attributes_t.c +++ b/mtapi_c/src/mtapi_node_attributes_t.c @@ -53,6 +53,7 @@ void mtapi_nodeattr_init( attributes->max_actions_per_job = MTAPI_NODE_MAX_ACTIONS_PER_JOB_DEFAULT; attributes->max_priorities = MTAPI_NODE_MAX_PRIORITIES_DEFAULT; attributes->reuse_main_thread = MTAPI_FALSE; + attributes->worker_priorities = NULL; embb_core_set_init(&attributes->core_affinity, 1); attributes->num_cores = embb_core_set_count(&attributes->core_affinity); @@ -149,6 +150,11 @@ void mtapi_nodeattr_set( &attributes->reuse_main_thread, attribute, attribute_size); break; + case MTAPI_NODE_WORKER_PRIORITIES: + local_status = MTAPI_SUCCESS; + attributes->worker_priorities = (mtapi_worker_priority_entry_t*)attribute; + break; + default: /* attribute unknown */ local_status = MTAPI_ERR_ATTR_NUM; -- libgit2 0.26.0