Rework custom::task_arena initialization logic (#5860)

* Rework custom::task_arena initialization logic & add custom::task_scheduler_observer wrapper

* Remove iostream
This commit is contained in:
Ivan Kochin 2021-05-29 09:26:31 +03:00 committed by GitHub
parent 67c75740bd
commit 69f5586d06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 20 deletions

View File

@ -27,7 +27,7 @@ namespace InferenceEngine {
struct CPUStreamsExecutor::Impl {
struct Stream {
#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO
struct Observer: public tbb::task_scheduler_observer {
struct Observer: public custom::task_scheduler_observer {
CpuSet _mask;
int _ncpus = 0;
int _threadBindingStep = 0;
@ -39,7 +39,7 @@ struct CPUStreamsExecutor::Impl {
const int threadsPerStream,
const int threadBindingStep,
const int threadBindingOffset) :
tbb::task_scheduler_observer(static_cast<tbb::task_arena&>(arena)),
custom::task_scheduler_observer(arena),
_mask{std::move(mask)},
_ncpus(ncpus),
_threadBindingStep(threadBindingStep),

View File

@ -127,7 +127,7 @@ binding_oberver_ptr construct_binding_observer(tbb::task_arena& ta, int num_slot
#endif /*USE_TBBBIND_2_4*/
#if TBB_NUMA_SUPPORT_PRESENT
tbb::task_arena::constraints convert_constraints(custom::task_arena::constraints& c) {
tbb::task_arena::constraints convert_constraints(const custom::task_arena::constraints& c) {
tbb::task_arena::constraints result{};
#if TBB_HYBRID_CPUS_SUPPORT_PRESENT
result.core_type = c.core_type;
@ -148,7 +148,13 @@ task_arena::task_arena(int max_concurrency_, unsigned reserved_for_masters)
{}
task_arena::task_arena(const constraints& constraints_, unsigned reserved_for_masters)
: my_task_arena{info::default_concurrency(constraints_), reserved_for_masters}
#if USE_TBBBIND_2_4
: my_task_arena {info::default_concurrency(constraints_), reserved_for_masters}
#elif TBB_NUMA_SUPPORT_PRESENT || TBB_HYBRID_CPUS_SUPPORT_PRESENT
: my_task_arena {convert_constraints(constraints_), reserved_for_masters}
#else
: my_task_arena {constraints_.max_concurrency, reserved_for_masters}
#endif
, my_initialization_state{}
, my_constraints{constraints_}
, my_binding_observer{}
@ -162,47 +168,38 @@ task_arena::task_arena(const task_arena &s)
{}
void task_arena::initialize() {
my_task_arena.initialize();
#if USE_TBBBIND_2_4
std::call_once(my_initialization_state, [this] {
my_task_arena.initialize();
my_binding_observer = detail::construct_binding_observer(
my_task_arena, my_task_arena.max_concurrency(), my_constraints);
});
#elif TBB_NUMA_SUPPORT_PRESENT || TBB_HYBRID_CPUS_SUPPORT_PRESENT
my_task_arena.initialize(convert_constraints(my_constraints));
#else
my_task_arena.initialize();
#endif
}
void task_arena::initialize(int max_concurrency_, unsigned reserved_for_masters) {
my_task_arena.initialize(max_concurrency_, reserved_for_masters);
#if USE_TBBBIND_2_4
std::call_once(my_initialization_state, [this, &max_concurrency_, &reserved_for_masters] {
my_task_arena.initialize(max_concurrency_, reserved_for_masters);
std::call_once(my_initialization_state, [this] {
my_binding_observer = detail::construct_binding_observer(
my_task_arena, my_task_arena.max_concurrency(), my_constraints);
});
#elif TBB_NUMA_SUPPORT_PRESENT || TBB_HYBRID_CPUS_SUPPORT_PRESENT
my_constraints.max_concurrency = max_concurrency_;
my_task_arena.initialize(convert_constraints(my_constraints), reserved_for_masters);
#else
my_task_arena.initialize(max_concurrency_, reserved_for_masters);
#endif
}
void task_arena::initialize(constraints constraints_, unsigned reserved_for_masters) {
std::call_once(my_initialization_state, [this, &constraints_, &reserved_for_masters] {
my_constraints = constraints_;
#if USE_TBBBIND_2_4
my_task_arena.initialize(info::default_concurrency(constraints_), reserved_for_masters);
my_binding_observer = detail::construct_binding_observer(
my_task_arena, my_task_arena.max_concurrency(), my_constraints);
std::call_once(my_initialization_state, [this] {
my_binding_observer = detail::construct_binding_observer(
my_task_arena, my_task_arena.max_concurrency(), my_constraints);
});
#elif TBB_NUMA_SUPPORT_PRESENT || TBB_HYBRID_CPUS_SUPPORT_PRESENT
my_task_arena.initialize(convert_constraints(my_constraints), reserved_for_masters);
#else
my_task_arena.initialize(my_constraints.max_concurrency, reserved_for_masters);
#endif
});
}
task_arena::operator tbb::task_arena&() {

View File

@ -114,6 +114,22 @@ public:
}
};
struct task_scheduler_observer: public tbb::task_scheduler_observer {
task_scheduler_observer(custom::task_arena& arena) :
tbb::task_scheduler_observer(static_cast<tbb::task_arena&>(arena)),
my_arena(arena)
{}
void observe(bool state = true) {
if (state) {
my_arena.initialize();
}
tbb::task_scheduler_observer::observe(state);
}
custom::task_arena& my_arena;
};
namespace info {
std::vector<numa_node_id> numa_nodes();
std::vector<core_type_id> core_types();