Intel(R) Threading Building Blocks Doxygen Documentation
version 4.2.3
|
#include <arena.h>
Public Types | |
enum | new_work_type { work_spawned, wakeup, work_enqueued } |
Types of work advertised by advertise_new_work() More... | |
typedef padded< arena_base > | base_type |
typedef uintptr_t | pool_state_t |
Public Member Functions | |
arena (market &, unsigned max_num_workers, unsigned num_reserved_slots) | |
Constructor. More... | |
mail_outbox & | mailbox (affinity_id id) |
Get reference to mailbox corresponding to given affinity_id. More... | |
void | free_arena () |
Completes arena shutdown, destructs and deallocates it. More... | |
unsigned | num_workers_active () const |
The number of workers active in the arena. More... | |
bool | is_recall_requested () const |
Check if the recall is requested by the market. More... | |
template<arena::new_work_type work_type> | |
void | advertise_new_work () |
If necessary, raise a flag that there is new job in arena. More... | |
bool | is_out_of_work () |
Check if there is job anywhere in arena. More... | |
void | enqueue_task (task &, intptr_t, FastRandom &) |
enqueue a task into starvation-resistance queue More... | |
void | process (generic_scheduler &) |
Registers the worker with the arena and enters TBB scheduler dispatch loop. More... | |
template<unsigned ref_param> | |
void | on_thread_leaving () |
Notification that worker or master leaves its arena. More... | |
bool | has_enqueued_tasks () |
Check for the presence of enqueued tasks at all priority levels. More... | |
template<bool as_worker> | |
size_t | occupy_free_slot (generic_scheduler &s) |
Tries to occupy a slot in the arena. On success, returns the slot index; if no slot is available, returns out_of_arena. More... | |
size_t | occupy_free_slot_in_range (generic_scheduler &s, size_t lower, size_t upper) |
Tries to occupy a slot in the specified range. More... | |
Static Public Member Functions | |
static arena & | allocate_arena (market &, unsigned num_slots, unsigned num_reserved_slots) |
Allocate an instance of arena. More... | |
static int unsigned | num_arena_slots (unsigned num_slots) |
static int | allocation_size (unsigned num_slots) |
static bool | is_busy_or_empty (pool_state_t s) |
No tasks to steal or snapshot is being taken. More... | |
Public Attributes | |
arena_slot | my_slots [1] |
![]() | |
char | pad [S - R] |
![]() | |
unsigned | my_num_workers_allotted |
The number of workers that have been marked out by the resource manager to service the arena. More... | |
atomic< unsigned > | my_references |
Reference counter for the arena. More... | |
atomic< unsigned > | my_limit |
The maximal number of currently busy slots. More... | |
task_stream< num_priority_levels > | my_task_stream |
Task pool for the tasks scheduled via task::enqueue() method. More... | |
unsigned | my_max_num_workers |
The number of workers requested by the master thread owning the arena. More... | |
int | my_num_workers_requested |
The number of workers that are currently requested from the resource manager. More... | |
tbb::atomic< uintptr_t > | my_pool_state |
Current task pool state and estimate of available tasks amount. More... | |
market * | my_market |
The market that owns this arena. More... | |
uintptr_t | my_aba_epoch |
ABA prevention marker. More... | |
cpu_ctl_env | my_cpu_ctl_env |
FPU control settings of arena's master thread captured at the moment of arena instantiation. More... | |
unsigned | my_num_slots |
The number of slots in the arena. More... | |
unsigned | my_num_reserved_slots |
The number of reserved slots (can be occupied only by masters). More... | |
concurrent_monitor | my_exit_monitors |
Waiting object for master threads that cannot join the arena. More... | |
![]() | |
char | pad [S - R] |
![]() | |
intrusive_list_node * | my_prev_node |
intrusive_list_node * | my_next_node |
Static Public Attributes | |
static const pool_state_t | SNAPSHOT_EMPTY = 0 |
No tasks to steal since last snapshot was taken. More... | |
static const pool_state_t | SNAPSHOT_FULL = pool_state_t(-1) |
At least one task has been offered for stealing since the last snapshot started. More... | |
static const unsigned | ref_external_bits = 12 |
The number of least significant bits for external references. More... | |
static const unsigned | ref_external = 1 |
Reference increment values for externals and workers. More... | |
static const unsigned | ref_worker = 1<<ref_external_bits |
static const size_t | out_of_arena = ~size_t(0) |
Private Member Functions | |
void | restore_priority_if_need () |
If enqueued tasks found, restore arena priority and task presence status. More... | |
typedef uintptr_t tbb::internal::arena::pool_state_t |
Types of work advertised by advertise_new_work()
Enumerator | |
---|---|
work_spawned | |
wakeup | |
work_enqueued |
tbb::internal::arena::arena | ( | market & | m, |
unsigned | max_num_workers, | ||
unsigned | num_reserved_slots | ||
) |
Constructor.
Definition at line 226 of file arena.cpp.
References __TBB_ASSERT, tbb::internal::mail_outbox::construct(), tbb::internal::cpu_ctl_env::get_env(), tbb::internal::arena_slot_line2::hint_for_pop, tbb::internal::task_stream< Levels >::initialize(), ITT_SYNC_CREATE, mailbox(), tbb::internal::arena_base::my_aba_epoch, tbb::internal::market::my_arenas_aba_epoch, tbb::internal::arena_base::my_cpu_ctl_env, tbb::internal::arena_base::my_limit, tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_max_num_workers, tbb::internal::arena_base::my_num_reserved_slots, tbb::internal::arena_base::my_num_slots, tbb::internal::arena_base::my_references, my_slots, tbb::internal::arena_base::my_task_stream, tbb::internal::NFS_Allocate(), tbb::internal::NFS_GetLineSize(), num_arena_slots(), and ref_external.
Referenced by allocate_arena().
void tbb::internal::arena::advertise_new_work | ( | ) |
If necessary, raise a flag that there is new job in arena.
Definition at line 484 of file arena.h.
References __TBB_ASSERT, tbb::internal::market::adjust_demand(), tbb::internal::as_atomic(), tbb::atomic_fence(), is_busy_or_empty(), tbb::internal::governor::local_scheduler(), tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_max_num_workers, tbb::internal::arena_base::my_num_reserved_slots, tbb::internal::market::my_num_workers_soft_limit, tbb::internal::arena_base::my_pool_state, SNAPSHOT_EMPTY, SNAPSHOT_FULL, wakeup, work_enqueued, and work_spawned.
Referenced by tbb::internal::generic_scheduler::get_task(), tbb::internal::generic_scheduler::local_spawn(), and tbb::internal::generic_scheduler::steal_task_from().
|
static |
Allocate an instance of arena.
Definition at line 285 of file arena.cpp.
References __TBB_ASSERT, allocation_size(), arena(), tbb::internal::NFS_Allocate(), tbb::internal::NFS_GetLineSize(), tbb::internal::NFS_MaxLineSize, and num_arena_slots().
Referenced by tbb::internal::market::create_arena().
|
inlinestatic |
Definition at line 300 of file arena.h.
Referenced by allocate_arena(), and free_arena().
void tbb::internal::arena::enqueue_task | ( | task & | t, |
intptr_t | prio, | ||
FastRandom & | random | ||
) |
enqueue a task into starvation-resistance queue
Definition at line 597 of file arena.cpp.
References __TBB_ASSERT, tbb::internal::task_prefix::affinity, tbb::task::allocated, tbb::internal::es_ref_count_active, tbb::internal::es_task_enqueued, tbb::internal::task_prefix::extra_state, tbb::internal::is_critical(), tbb::internal::task_prefix::isolation, ITT_NOTIFY, tbb::internal::governor::local_scheduler_if_initialized(), tbb::internal::make_critical(), parent, tbb::task::parent(), tbb::task::prefix(), tbb::internal::priority_critical, tbb::task::ready, s, tbb::internal::task_prefix::state, tbb::task::state(), and sync_releasing.
Referenced by tbb::internal::custom_scheduler< SchedulerTraits >::tally_completion_of_predecessor().
void tbb::internal::arena::free_arena | ( | ) |
Completes arena shutdown, destructs and deallocates it.
Definition at line 296 of file arena.cpp.
References __TBB_ASSERT, allocation_size(), tbb::internal::task_stream< Levels >::drain(), tbb::internal::mail_outbox::drain(), tbb::internal::arena_slot::free_task_pool(), GATHER_STATISTIC, head, mailbox(), tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_max_num_workers, tbb::internal::arena_base::my_num_slots, tbb::internal::arena_base::my_num_workers_allotted, tbb::internal::arena_base::my_num_workers_requested, tbb::internal::arena_base::my_pool_state, tbb::internal::arena_base::my_references, my_slots, tbb::internal::arena_base::my_task_stream, tbb::internal::NFS_Free(), poison_value, tbb::internal::market::release(), SNAPSHOT_EMPTY, and tail.
Referenced by tbb::internal::market::try_destroy_arena().
bool tbb::internal::arena::has_enqueued_tasks | ( | ) |
Check for the presence of enqueued tasks at all priority levels.
Definition at line 426 of file arena.cpp.
References tbb::internal::task_stream< Levels >::empty(), tbb::internal::arena_base::my_task_stream, tbb::internal::num_priority_levels, and p.
Referenced by restore_priority_if_need().
|
inlinestatic |
No tasks to steal or snapshot is being taken.
Definition at line 331 of file arena.h.
References s, and SNAPSHOT_FULL.
Referenced by advertise_new_work().
bool tbb::internal::arena::is_out_of_work | ( | ) |
Check if there is job anywhere in arena.
Return true if no job or if arena is being cleaned up.
Definition at line 454 of file arena.cpp.
References __TBB_ASSERT, tbb::internal::__TBB_load_relaxed(), tbb::internal::__TBB_load_with_acquire(), tbb::internal::market::adjust_demand(), tbb::internal::atomic_update(), tbb::internal::task_stream< Levels >::empty(), EmptyTaskPool, head, int, tbb::internal::arena_base::my_limit, tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_max_num_workers, tbb::internal::arena_base::my_pool_state, my_slots, tbb::internal::arena_base::my_task_stream, restore_priority_if_need(), SNAPSHOT_EMPTY, SNAPSHOT_FULL, and tail.
Referenced by on_thread_leaving().
|
inline |
Check if the recall is requested by the market.
Definition at line 339 of file arena.h.
References tbb::internal::arena_base::my_num_workers_allotted, and num_workers_active().
Referenced by process().
|
inline |
Get reference to mailbox corresponding to given affinity_id.
Definition at line 305 of file arena.h.
References __TBB_ASSERT, int, and tbb::internal::arena_base::my_num_slots.
Referenced by arena(), tbb::internal::generic_scheduler::attach_mailbox(), free_arena(), and tbb::internal::generic_scheduler::prepare_for_spawning().
|
inlinestatic |
Definition at line 296 of file arena.h.
References tbb::internal::max().
Referenced by allocate_arena(), and arena().
|
inline |
The number of workers active in the arena.
Definition at line 334 of file arena.h.
References tbb::internal::arena_base::my_references, and ref_external_bits.
Referenced by tbb::internal::market::arena_in_need(), and is_recall_requested().
size_t tbb::internal::arena::occupy_free_slot | ( | generic_scheduler & | s | ) |
Tries to occupy a slot in the arena. On success, returns the slot index; if no slot is available, returns out_of_arena.
Definition at line 130 of file arena.cpp.
References tbb::internal::atomic_update(), ITT_NOTIFY, tbb::internal::arena_base::my_limit, tbb::internal::arena_base::my_num_reserved_slots, tbb::internal::arena_base::my_num_slots, my_slots, occupy_free_slot_in_range(), out_of_arena, and s.
Referenced by process().
size_t tbb::internal::arena::occupy_free_slot_in_range | ( | generic_scheduler & | s, |
size_t | lower, | ||
size_t | upper | ||
) |
Tries to occupy a slot in the specified range.
Definition at line 115 of file arena.cpp.
References __TBB_ASSERT, my_slots, tbb::internal::occupy_slot(), out_of_arena, and s.
Referenced by occupy_free_slot().
|
inline |
Notification that worker or master leaves its arena.
Definition at line 394 of file arena.h.
References __TBB_ASSERT, GATHER_STATISTIC, is_out_of_work(), tbb::internal::modulo_power_of_two(), tbb::internal::arena_base::my_aba_epoch, tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_num_reserved_slots, tbb::internal::arena_base::my_num_slots, tbb::internal::market::my_num_workers_soft_limit, tbb::internal::arena_base::my_references, tbb::internal::num_priority_levels, ref_external, ref_worker, and tbb::internal::market::try_destroy_arena().
Referenced by tbb::internal::generic_scheduler::cleanup_master().
void tbb::internal::arena::process | ( | generic_scheduler & | s | ) |
Registers the worker with the arena and enters TBB scheduler dispatch loop.
Definition at line 146 of file arena.cpp.
References __TBB_ASSERT, __TBB_ISOLATION_ARG, tbb::internal::__TBB_store_with_release(), EmptyTaskPool, is_recall_requested(), tbb::internal::governor::is_set(), tbb::internal::arena_base::my_cpu_ctl_env, tbb::internal::arena_base::my_num_reserved_slots, tbb::internal::arena_base::my_num_slots, my_slots, tbb::internal::no_isolation, occupy_free_slot(), out_of_arena, s, and tbb::internal::cpu_ctl_env::set_env().
Referenced by tbb::internal::market::process().
|
private |
If enqueued tasks found, restore arena priority and task presence status.
Definition at line 434 of file arena.cpp.
References tbb::internal::task_stream< Levels >::empty(), has_enqueued_tasks(), tbb::internal::arena_base::my_market, tbb::internal::arena_base::my_task_stream, tbb::internal::num_priority_levels, and p.
Referenced by is_out_of_work().
arena_slot tbb::internal::arena::my_slots[1] |
Must be the last data field
Definition at line 390 of file arena.h.
Referenced by tbb::internal::generic_scheduler::acquire_task_pool(), arena(), tbb::internal::generic_scheduler::attach_arena(), tbb::internal::generic_scheduler::cleanup_master(), tbb::internal::market::detach_arena(), free_arena(), is_out_of_work(), tbb::internal::generic_scheduler::leave_task_pool(), tbb::internal::generic_scheduler::nested_arena_exit(), occupy_free_slot(), occupy_free_slot_in_range(), process(), tbb::internal::generic_scheduler::publish_task_pool(), and tbb::internal::generic_scheduler::steal_task().
|
static |
Definition at line 382 of file arena.h.
Referenced by occupy_free_slot(), occupy_free_slot_in_range(), and process().
|
static |
Reference increment values for externals and workers.
Definition at line 327 of file arena.h.
Referenced by arena(), tbb::internal::generic_scheduler::cleanup_master(), and on_thread_leaving().
|
static |
The number of least significant bits for external references.
Definition at line 324 of file arena.h.
Referenced by num_workers_active().
|
static |
Definition at line 328 of file arena.h.
Referenced by tbb::internal::market::arena_in_need(), and on_thread_leaving().
|
static |
No tasks to steal since last snapshot was taken.
Definition at line 318 of file arena.h.
Referenced by advertise_new_work(), free_arena(), is_out_of_work(), tbb::internal::market::try_destroy_arena(), and tbb::internal::generic_scheduler::wait_until_empty().
|
static |
At least one task has been offered for stealing since the last snapshot started.
Definition at line 321 of file arena.h.
Referenced by advertise_new_work(), is_busy_or_empty(), and is_out_of_work().