From c1a0e74470fd0356b26d49f42e0db35a6a0df3ca Mon Sep 17 00:00:00 2001 From: Pavel Kumbrasev Date: Thu, 25 Apr 2024 15:24:46 +0100 Subject: [PATCH] Improve arena construction by applying constraint (#1151) Signed-off-by: pavelkumbrasev --- src/tbb/arena.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/tbb/arena.cpp b/src/tbb/arena.cpp index 8b3102e901..0e7cf43c3b 100644 --- a/src/tbb/arena.cpp +++ b/src/tbb/arena.cpp @@ -60,7 +60,6 @@ numa_binding_observer* construct_binding_observer( d1::task_arena* ta, int num_s if ((core_type >= 0 && core_type_count() > 1) || (numa_id >= 0 && numa_node_count() > 1) || max_threads_per_core > 0) { binding_observer = new(allocate_memory(sizeof(numa_binding_observer))) numa_binding_observer(ta, num_slots, numa_id, core_type, max_threads_per_core); __TBB_ASSERT(binding_observer, "Failure during NUMA binding observer allocation and construction"); - binding_observer->observe(true); } return binding_observer; } @@ -545,7 +544,7 @@ void task_arena_impl::initialize(d1::task_arena_base& ta) { .set_max_threads_per_core(ta.max_threads_per_core()) .set_numa_id(ta.my_numa_id); #endif /*__TBB_ARENA_BINDING*/ - + if (ta.my_max_concurrency < 1) { #if __TBB_ARENA_BINDING ta.my_max_concurrency = (int)default_concurrency(arena_constraints); @@ -554,6 +553,17 @@ void task_arena_impl::initialize(d1::task_arena_base& ta) { #endif /*!__TBB_ARENA_BINDING*/ } +#if __TBB_CPUBIND_PRESENT + numa_binding_observer* observer = construct_binding_observer( + static_cast(&ta), arena::num_arena_slots(ta.my_max_concurrency, ta.my_num_reserved_slots), + ta.my_numa_id, ta.core_type(), ta.max_threads_per_core()); + if (observer) { + // TODO: Consider lazy initialization for internal arena so + // the direct calls to observer might be omitted until actual initialization. + observer->on_scheduler_entry(true); + } +#endif /*__TBB_CPUBIND_PRESENT*/ + __TBB_ASSERT(ta.my_arena.load(std::memory_order_relaxed) == nullptr, "Arena already initialized"); unsigned priority_level = arena_priority_level(ta.my_priority); threading_control* thr_control = threading_control::register_public_reference(); @@ -561,8 +571,11 @@ void task_arena_impl::initialize(d1::task_arena_base& ta) { ta.my_arena.store(&a, std::memory_order_release); #if __TBB_CPUBIND_PRESENT - a.my_numa_binding_observer = construct_binding_observer( - static_cast(&ta), a.my_num_slots, ta.my_numa_id, ta.core_type(), ta.max_threads_per_core()); + a.my_numa_binding_observer = observer; + if (observer) { + observer->on_scheduler_exit(true); + observer->observe(true); + } #endif /*__TBB_CPUBIND_PRESENT*/ }