Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb_main.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2005-2020 Intel Corporation
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8  http://www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15 */
16 
17 #include "tbb/tbb_config.h"
18 #include "tbb/global_control.h"
19 #include "tbb_main.h"
20 #include "governor.h"
21 #include "market.h"
22 #include "tbb_misc.h"
23 #include "itt_notify.h"
24 
25 namespace tbb {
26 namespace internal {
27 
28 //------------------------------------------------------------------------
29 // Begin shared data layout.
30 // The following global data items are mostly read-only after initialization.
31 //------------------------------------------------------------------------
32 
34 static const char _pad[NFS_MaxLineSize - sizeof(int)] = {};
35 
36 //------------------------------------------------------------------------
37 // governor data
41 rml::tbb_factory governor::theRMLServerFactory;
45 
46 //------------------------------------------------------------------------
47 // market data
50 
51 //------------------------------------------------------------------------
52 // One time initialization data
53 
55 atomic<int> __TBB_InitOnce::count;
56 
58 
61 
62 #if DO_ITT_NOTIFY
63  static bool ITT_Present;
64  static atomic<bool> ITT_InitializationDone;
65 #endif
66 
67 #if !(_WIN32||_WIN64) || __TBB_SOURCE_DIRECTLY_INCLUDED
69 #endif
70 
71 //------------------------------------------------------------------------
72 // generic_scheduler data
73 
75 generic_scheduler* (*AllocateSchedulerPtr)( market&, bool );
76 
77 #if __TBB_OLD_PRIMES_RNG
78 
81 static const unsigned Primes[] = {
82  0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5,
83  0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,
84  0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231,
85  0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,
86  0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801,
87  0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
88  0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed,
89  0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,
90  0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9,
91  0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,
92  0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7,
93  0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
94  0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b,
95  0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,
96  0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3,
97  0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f
98 };
99 
100 //------------------------------------------------------------------------
101 // End of shared data layout
102 //------------------------------------------------------------------------
103 
104 //------------------------------------------------------------------------
105 // Shared data accessors
106 //------------------------------------------------------------------------
107 
108 unsigned GetPrime ( unsigned seed ) {
109  return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
110 }
111 #endif //__TBB_OLD_PRIMES_RNG
112 
113 //------------------------------------------------------------------------
114 // __TBB_InitOnce
115 //------------------------------------------------------------------------
116 
118  if( ++count==1 )
120 }
121 
123  int k = --count;
124  __TBB_ASSERT(k>=0,"removed __TBB_InitOnce ref that was not added?");
125  if( k==0 ) {
127  ITT_FINI_ITTLIB();
128  }
129 }
130 
131 //------------------------------------------------------------------------
132 // One-time Initializations
133 //------------------------------------------------------------------------
134 
137 
139 void Scheduler_OneTimeInitialization ( bool itt_present );
140 
141 #if DO_ITT_NOTIFY
142 
143 static __itt_domain *tbb_domains[ITT_NUM_DOMAINS] = {};
144 
145 struct resource_string {
146  const char *str;
147  __itt_string_handle *itt_str_handle;
148 };
149 
150 //
151 // populate resource strings
152 //
153 #define TBB_STRING_RESOURCE( index_name, str ) { str, NULL },
154 static resource_string strings_for_itt[] = {
155  #include "tbb/internal/_tbb_strings.h"
156  { "num_resource_strings", NULL }
157 };
158 #undef TBB_STRING_RESOURCE
159 
160 static __itt_string_handle *ITT_get_string_handle(int idx) {
161  __TBB_ASSERT( idx >= 0 && idx < NUM_STRINGS, "string handle out of valid range");
162  return (idx >= 0 && idx < NUM_STRINGS) ? strings_for_itt[idx].itt_str_handle : NULL;
163 }
164 
165 static void ITT_init_domains() {
166  tbb_domains[ITT_DOMAIN_MAIN] = __itt_domain_create( _T("tbb") );
167  tbb_domains[ITT_DOMAIN_MAIN]->flags = 1;
168  tbb_domains[ITT_DOMAIN_FLOW] = __itt_domain_create( _T("tbb.flow") );
169  tbb_domains[ITT_DOMAIN_FLOW]->flags = 1;
170  tbb_domains[ITT_DOMAIN_ALGO] = __itt_domain_create( _T("tbb.algorithm") );
171  tbb_domains[ITT_DOMAIN_ALGO]->flags = 1;
172 }
173 
174 static void ITT_init_strings() {
175  for ( int i = 0; i < NUM_STRINGS; ++i ) {
176 #if _WIN32||_WIN64
177  strings_for_itt[i].itt_str_handle = __itt_string_handle_createA( strings_for_itt[i].str );
178 #else
179  strings_for_itt[i].itt_str_handle = __itt_string_handle_create( strings_for_itt[i].str );
180 #endif
181  }
182 }
183 
184 static void ITT_init() {
185  ITT_init_domains();
186  ITT_init_strings();
187 }
188 
191 void ITT_DoUnsafeOneTimeInitialization () {
192  // Double check ITT_InitializationDone is necessary because the first check
193  // in ITT_DoOneTimeInitialization is not guarded with the __TBB_InitOnce lock.
194  if ( !ITT_InitializationDone ) {
195  ITT_Present = (__TBB_load_ittnotify()!=0);
196  if (ITT_Present) ITT_init();
197  ITT_InitializationDone = true;
198  ITT_SYNC_CREATE(&market::theMarketMutex, SyncType_GlobalLock, SyncObj_SchedulerInitialization);
199  }
200 }
201 
204 extern "C"
205 void ITT_DoOneTimeInitialization() {
206  if ( !ITT_InitializationDone ) {
208  ITT_DoUnsafeOneTimeInitialization();
210  }
211 }
212 #endif /* DO_ITT_NOTIFY */
213 
218  // No fence required for load of InitializationDone, because we are inside a critical section.
221  if( GetBoolEnvironmentVariable("TBB_VERSION") )
222  PrintVersion();
223  bool itt_present = false;
224 #if DO_ITT_NOTIFY
225  ITT_DoUnsafeOneTimeInitialization();
226  itt_present = ITT_Present;
227 #endif /* DO_ITT_NOTIFY */
230  Scheduler_OneTimeInitialization( itt_present );
231  // Force processor groups support detection
233  // Force OS regular page size detection
235  // Dump version data
237  PrintExtraVersionInfo( "Tools support", itt_present ? "enabled" : "disabled" );
239  }
241 }
242 
243 #if (_WIN32||_WIN64) && !__TBB_SOURCE_DIRECTLY_INCLUDED
244 extern "C" bool WINAPI DllMain( HANDLE /*hinstDLL*/, DWORD reason, LPVOID lpvReserved ) {
246  switch( reason ) {
247  case DLL_PROCESS_ATTACH:
249  break;
250  case DLL_PROCESS_DETACH:
251  // Since THREAD_DETACH is not called for the main thread, call auto-termination
252  // here as well - but not during process shutdown (due to risk of a deadlock).
253  if( lpvReserved==NULL ) // library unload
256  // It is assumed that InitializationDone is not set after DLL_PROCESS_DETACH,
257  // and thus no race on InitializationDone is possible.
259  // Remove reference that we added in DoOneTimeInitializations.
261  }
262  break;
263  case DLL_THREAD_DETACH:
265  break;
266  }
267  return true;
268 }
269 #endif /* (_WIN32||_WIN64) && !__TBB_SOURCE_DIRECTLY_INCLUDED */
270 
271 void itt_store_pointer_with_release_v3( void* dst, void* src ) {
273  __TBB_store_with_release(*static_cast<void**>(dst),src);
274 }
275 
276 void* itt_load_pointer_with_acquire_v3( const void* src ) {
277  void* result = __TBB_load_with_acquire(*static_cast<void*const*>(src));
278  ITT_NOTIFY(sync_acquired, const_cast<void*>(src));
279  return result;
280 }
281 
282 #if DO_ITT_NOTIFY
283 void call_itt_notify_v5(int t, void *ptr) {
284  switch (t) {
285  case 0: ITT_NOTIFY(sync_prepare, ptr); break;
286  case 1: ITT_NOTIFY(sync_cancel, ptr); break;
287  case 2: ITT_NOTIFY(sync_acquired, ptr); break;
288  case 3: ITT_NOTIFY(sync_releasing, ptr); break;
289  }
290 }
291 #else
292 void call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}
293 #endif
294 
295 #if DO_ITT_NOTIFY
296 const __itt_id itt_null_id = {0, 0, 0};
297 
298 static inline __itt_domain* get_itt_domain( itt_domain_enum idx ) {
299  if (tbb_domains[idx] == NULL) {
300  ITT_DoOneTimeInitialization();
301  }
302  return tbb_domains[idx];
303 }
304 
305 static inline void itt_id_make(__itt_id *id, void* addr, unsigned long long extra) {
306  *id = __itt_id_make(addr, extra);
307 }
308 
309 static inline void itt_id_create(const __itt_domain *domain, __itt_id id) {
310  ITTNOTIFY_VOID_D1(id_create, domain, id);
311 }
312 
313 void itt_make_task_group_v7( itt_domain_enum domain, void *group, unsigned long long group_extra,
314  void *parent, unsigned long long parent_extra, string_index name_index ) {
315  if ( __itt_domain *d = get_itt_domain( domain ) ) {
316  __itt_id group_id = itt_null_id;
317  __itt_id parent_id = itt_null_id;
318  itt_id_make( &group_id, group, group_extra );
319  itt_id_create( d, group_id );
320  if ( parent ) {
321  itt_id_make( &parent_id, parent, parent_extra );
322  }
323  __itt_string_handle *n = ITT_get_string_handle(name_index);
324  ITTNOTIFY_VOID_D3(task_group, d, group_id, parent_id, n);
325  }
326 }
327 
328 void itt_metadata_str_add_v7( itt_domain_enum domain, void *addr, unsigned long long addr_extra,
329  string_index key, const char *value ) {
330  if ( __itt_domain *d = get_itt_domain( domain ) ) {
331  __itt_id id = itt_null_id;
332  itt_id_make( &id, addr, addr_extra );
333  __itt_string_handle *k = ITT_get_string_handle(key);
334  size_t value_length = strlen( value );
335 #if _WIN32||_WIN64
336  ITTNOTIFY_VOID_D4(metadata_str_addA, d, id, k, value, value_length);
337 #else
338  ITTNOTIFY_VOID_D4(metadata_str_add, d, id, k, value, value_length);
339 #endif
340  }
341 }
342 
343 void itt_metadata_ptr_add_v11( itt_domain_enum domain, void *addr, unsigned long long addr_extra,
344  string_index key, void *value ) {
345  if ( __itt_domain *d = get_itt_domain( domain ) ) {
346  __itt_id id = itt_null_id;
347  itt_id_make( &id, addr, addr_extra );
348  __itt_string_handle *k = ITT_get_string_handle(key);
349 #if __TBB_x86_32
350  ITTNOTIFY_VOID_D5(metadata_add, d, id, k, __itt_metadata_u32, 1, value);
351 #else
352  ITTNOTIFY_VOID_D5(metadata_add, d, id, k, __itt_metadata_u64, 1, value);
353 #endif
354  }
355 }
356 
357 
358 void itt_relation_add_v7( itt_domain_enum domain, void *addr0, unsigned long long addr0_extra,
359  itt_relation relation, void *addr1, unsigned long long addr1_extra ) {
360  if ( __itt_domain *d = get_itt_domain( domain ) ) {
361  __itt_id id0 = itt_null_id;
362  __itt_id id1 = itt_null_id;
363  itt_id_make( &id0, addr0, addr0_extra );
364  itt_id_make( &id1, addr1, addr1_extra );
365  ITTNOTIFY_VOID_D3(relation_add, d, id0, (__itt_relation)relation, id1);
366  }
367 }
368 
369 void itt_task_begin_v7( itt_domain_enum domain, void *task, unsigned long long task_extra,
370  void *parent, unsigned long long parent_extra, string_index name_index ) {
371  if ( __itt_domain *d = get_itt_domain( domain ) ) {
372  __itt_id task_id = itt_null_id;
373  __itt_id parent_id = itt_null_id;
374  if ( task ) {
375  itt_id_make( &task_id, task, task_extra );
376  }
377  if ( parent ) {
378  itt_id_make( &parent_id, parent, parent_extra );
379  }
380  __itt_string_handle *n = ITT_get_string_handle(name_index);
381  ITTNOTIFY_VOID_D3(task_begin, d, task_id, parent_id, n );
382  }
383 }
384 
386  if ( __itt_domain *d = get_itt_domain( domain ) ) {
387  ITTNOTIFY_VOID_D0(task_end, d);
388  }
389 }
390 
391 void itt_region_begin_v9( itt_domain_enum domain, void *region, unsigned long long region_extra,
392  void *parent, unsigned long long parent_extra, string_index /* name_index */ ) {
393  if ( __itt_domain *d = get_itt_domain( domain ) ) {
394  __itt_id region_id = itt_null_id;
395  __itt_id parent_id = itt_null_id;
396  itt_id_make( &region_id, region, region_extra );
397  if ( parent ) {
398  itt_id_make( &parent_id, parent, parent_extra );
399  }
400  ITTNOTIFY_VOID_D3(region_begin, d, region_id, parent_id, NULL );
401  }
402 }
403 
404 void itt_region_end_v9( itt_domain_enum domain, void *region, unsigned long long region_extra ) {
405  if ( __itt_domain *d = get_itt_domain( domain ) ) {
406  __itt_id region_id = itt_null_id;
407  itt_id_make( &region_id, region, region_extra );
408  ITTNOTIFY_VOID_D1( region_end, d, region_id );
409  }
410 }
411 
412 #else // DO_ITT_NOTIFY
413 
414 void itt_make_task_group_v7( itt_domain_enum /*domain*/, void* /*group*/, unsigned long long /*group_extra*/,
415  void* /*parent*/, unsigned long long /*parent_extra*/, string_index /*name_index*/ ) { }
416 
417 void itt_metadata_str_add_v7( itt_domain_enum /*domain*/, void* /*addr*/, unsigned long long /*addr_extra*/,
418  string_index /*key*/, const char* /*value*/ ) { }
419 
420 void itt_relation_add_v7( itt_domain_enum /*domain*/, void* /*addr0*/, unsigned long long /*addr0_extra*/,
421  itt_relation /*relation*/, void* /*addr1*/, unsigned long long /*addr1_extra*/ ) { }
422 
423 void itt_metadata_ptr_add_v11( itt_domain_enum /*domain*/, void * /*addr*/, unsigned long long /*addr_extra*/,
424  string_index /*key*/, void * /*value*/ ) {}
425 
426 void itt_task_begin_v7( itt_domain_enum /*domain*/, void* /*task*/, unsigned long long /*task_extra*/,
427  void* /*parent*/, unsigned long long /*parent_extra*/, string_index /*name_index*/ ) { }
428 
429 void itt_task_end_v7( itt_domain_enum /*domain*/ ) { }
430 
431 void itt_region_begin_v9( itt_domain_enum /*domain*/, void* /*region*/, unsigned long long /*region_extra*/,
432  void* /*parent*/, unsigned long long /*parent_extra*/, string_index /*name_index*/ ) { }
433 
434 void itt_region_end_v9( itt_domain_enum /*domain*/, void* /*region*/, unsigned long long /*region_extra*/ ) { }
435 
436 #endif // DO_ITT_NOTIFY
437 
438 void* itt_load_pointer_v3( const void* src ) {
439  //TODO: replace this with __TBB_load_relaxed
440  void* result = *static_cast<void*const*>(src);
441  return result;
442 }
443 
444 void itt_set_sync_name_v3( void* obj, const tchar* name) {
445  ITT_SYNC_RENAME(obj, name);
447 }
448 
451 protected:
453  atomic<global_control*> my_head;
455 
456  virtual size_t default_value() const = 0;
457  virtual void apply_active() const {}
458  virtual bool is_first_arg_preferred(size_t a, size_t b) const {
459  return a>b; // prefer max by default
460  }
461  virtual size_t active_value() const {
463  }
464 };
465 
466 class allowed_parallelism_control : public padded<control_storage> {
467  virtual size_t default_value() const __TBB_override {
468  return max(1U, governor::default_num_threads());
469  }
470  virtual bool is_first_arg_preferred(size_t a, size_t b) const __TBB_override {
471  return a<b; // prefer min allowed parallelism
472  }
473  virtual void apply_active() const __TBB_override {
474  __TBB_ASSERT( my_active_value>=1, NULL );
475  // -1 to take master into account
477  }
478  virtual size_t active_value() const __TBB_override {
479 /* Reading of my_active_value is not synchronized with possible updating
480  of my_head by other thread. It's ok, as value of my_active_value became
481  not invalid, just obsolete. */
482  if (!my_head)
483  return default_value();
484  // non-zero, if market is active
485  const size_t workers = market::max_num_workers();
486  // We can't exceed market's maximal number of workers.
487  // +1 to take master into account
488  return workers? min(workers+1, my_active_value): my_active_value;
489  }
490 public:
491  size_t active_value_if_present() const {
492  return my_head? my_active_value : 0;
493  }
494 };
495 
496 class stack_size_control : public padded<control_storage> {
497  virtual size_t default_value() const __TBB_override {
499  }
500  virtual void apply_active() const __TBB_override {
501 #if __TBB_WIN8UI_SUPPORT && (_WIN32_WINNT < 0x0A00)
502  __TBB_ASSERT( false, "For Windows 8 Store* apps we must not set stack size" );
503 #endif
504  }
505 };
506 
509 
511 
514 }
515 
516 } // namespace internal
517 
518 namespace interface9 {
519 
520 using namespace internal;
521 using namespace tbb::internal;
522 
525  control_storage *const c = controls[my_param];
526 
528  if (!c->my_head || c->is_first_arg_preferred(my_value, c->my_active_value)) {
529  c->my_active_value = my_value;
530  // to guarantee that apply_active() is called with current active value,
531  // calls it here and in internal_destroy() under my_list_mutex
532  c->apply_active();
533  }
534  my_next = c->my_head;
535  // publish my_head, at this point my_active_value must be valid
536  c->my_head = this;
537 }
538 
540  global_control *prev = 0;
541 
543  control_storage *const c = controls[my_param];
544  __TBB_ASSERT( c->my_head, NULL );
545 
546  // Concurrent reading and changing global parameter is possible.
547  // In this case, my_active_value may not match current state of parameters.
548  // This is OK because:
549  // 1) my_active_value is either current or previous
550  // 2) my_active_value is current on internal_destroy leave
552  size_t new_active = (size_t)-1, old_active = c->my_active_value;
553 
554  if ( c->my_head != this )
555  new_active = c->my_head->my_value;
556  else if ( c->my_head->my_next )
557  new_active = c->my_head->my_next->my_value;
558  // if there is only one element, new_active will be set later
559  for ( global_control *curr = c->my_head; curr; prev = curr, curr = curr->my_next )
560  if ( curr == this ) {
561  if ( prev )
562  prev->my_next = my_next;
563  else
564  c->my_head = my_next;
565  } else
566  if (c->is_first_arg_preferred(curr->my_value, new_active))
567  new_active = curr->my_value;
568 
569  if ( !c->my_head ) {
570  __TBB_ASSERT( new_active==(size_t)-1, NULL );
571  new_active = c->default_value();
572  }
573  if ( new_active != old_active ) {
574  c->my_active_value = new_active;
575  c->apply_active();
576  }
577 }
578 
579 size_t global_control::active_value( int param ) {
581  return controls[param]->active_value();
582 }
583 
584 } // tbb::interface9
585 } // namespace tbb
atomic< global_control * > my_head
Definition: tbb_main.cpp:453
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t * domain
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu relation_add
#define ITT_SYNC_RENAME(obj, name)
Definition: itt_notify.h:116
scheduler_mutex_type global_market_mutex_type
Definition: market.h:60
static __TBB_atomic_flag InitializationLock
Global initialization lock.
Definition: tbb_main.h:57
static unsigned app_parallelism_limit()
Reports active parallelism level according to user&#39;s settings.
Definition: tbb_main.cpp:512
virtual size_t default_value() const __TBB_override
Definition: tbb_main.cpp:467
virtual void apply_active() const __TBB_override
Definition: tbb_main.cpp:473
static bool initialization_done()
Definition: tbb_main.h:64
static stack_size_control stack_size_ctl
Definition: tbb_main.cpp:508
static void terminate_auto_initialized_scheduler()
Undo automatic initialization if necessary; call when a thread exits.
Definition: governor.h:144
void itt_set_sync_name_v3(void *obj, const tchar *name)
Definition: tbb_main.cpp:444
static size_t DefaultPageSize
Caches the size of OS regular memory page.
Definition: governor.h:60
Pads type T to fill out to a multiple of cache line size.
Definition: tbb_stddef.h:261
virtual size_t active_value() const
Definition: tbb_main.cpp:461
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu task_begin
#define __TBB_ASSERT_RELEASE(predicate, message)
Definition: tbb_stddef.h:134
static __TBB_InitOnce __TBB_InitOnceHiddenInstance
Definition: tbb_main.cpp:68
__TBB_atomic __TBB_Flag __TBB_atomic_flag
Definition: gcc_generic.h:106
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle * key
Represents acquisition of a mutex.
Definition: spin_mutex.h:53
void __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(void *dst, void *src)
Definition: tbb_main.cpp:271
static atomic< int > count
Counter of references to global shared resources such as TLS.
Definition: tbb_main.h:41
__itt_string_handle *ITTAPI __itt_string_handle_createA(const char *name)
Create a string handle. Create and return handle value that can be associated with a string...
static void acquire_resources()
Create key for thread-local storage and initialize RML.
Definition: governor.cpp:67
static unsigned DefaultNumberOfThreads
Caches the maximal level of parallelism supported by the hardware.
Definition: governor.h:57
void __TBB_EXPORTED_FUNC itt_metadata_str_add_v7(itt_domain_enum domain, void *addr, unsigned long long addr_extra, string_index key, const char *value)
Definition: tbb_main.cpp:417
void PrintVersion()
Prints TBB version information on stderr.
Definition: tbb_misc.cpp:206
ITT_INLINE __itt_id ITTAPI __itt_id_make(void *addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE
A convenience function is provided to create an ID without domain control.
Definition: ittnotify.h:1870
static void print_version_info()
Definition: governor.cpp:229
void *__TBB_EXPORTED_FUNC itt_load_pointer_v3(const void *src)
Definition: tbb_main.cpp:438
#define __itt_string_handle_create
Definition: ittnotify.h:1980
static size_t active_value(parameter p)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p task_end
virtual size_t active_value() const __TBB_override
Definition: tbb_main.cpp:478
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id parent
int __TBB_load_ittnotify()
static unsigned max_num_workers()
Definition: market.h:377
virtual void apply_active() const
Definition: tbb_main.cpp:457
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p sync_cancel
static global_market_mutex_type theMarketMutex
Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas, and cancellation propagation.
Definition: market.h:63
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
Definition: tbb_stddef.h:398
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:713
static void initialize_rml_factory()
Definition: governor.cpp:242
static bool GetBoolEnvironmentVariable(const char *name)
virtual bool is_first_arg_preferred(size_t a, size_t b) const
Definition: tbb_main.cpp:458
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
void * addr
static bool is_rethrow_broken
Definition: governor.h:68
static basic_tls< uintptr_t > theTLS
TLS for scheduler instances associated with individual threads.
Definition: governor.h:54
#define __itt_domain_create
Definition: ittnotify.h:1791
void __TBB_EXPORTED_FUNC itt_task_begin_v7(itt_domain_enum domain, void *task, unsigned long long task_extra, void *parent, unsigned long long parent_extra, string_index name_index)
Definition: tbb_main.cpp:426
char tchar
Unicode support.
Definition: itt_notify.h:57
A lock that occupies a single byte.
Definition: spin_mutex.h:39
virtual bool is_first_arg_preferred(size_t a, size_t b) const __TBB_override
Definition: tbb_main.cpp:470
static unsigned default_num_threads()
Definition: governor.h:84
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation relation
static allowed_parallelism_control allowed_parallelism_ctl
Definition: tbb_main.cpp:507
virtual size_t default_value() const =0
Class that supports TBB initialization.
Definition: tbb_main.h:37
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p sync_releasing
void __TBB_EXPORTED_FUNC call_itt_notify_v5(int t, void *ptr)
Definition: tbb_main.cpp:292
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
#define ITT_FINI_ITTLIB()
Definition: itt_notify.h:114
static void release_resources()
Destroy the thread-local storage key and deinitialize RML.
Definition: governor.cpp:79
#define _T(string_literal)
Standard Windows style macro to markup the string literals.
Definition: itt_notify.h:59
void __TBB_EXPORTED_FUNC itt_region_begin_v9(itt_domain_enum domain, void *region, unsigned long long region_extra, void *parent, unsigned long long parent_extra, string_index name_index)
Definition: tbb_main.cpp:431
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu region_begin
static rml::tbb_factory theRMLServerFactory
Definition: governor.h:62
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task * task
static bool InitializationDone
Specifies if the one-time initializations has been done.
Definition: tbb_main.h:50
void __TBB_EXPORTED_METHOD internal_destroy()
Definition: tbb_main.cpp:539
T min(const T &val1, const T &val2)
Utility template function returning lesser of the two values.
Definition: tbb_misc.h:110
virtual void apply_active() const __TBB_override
Definition: tbb_main.cpp:500
static void remove_ref()
Remove reference to resources. If last reference removed, release the resources.
Definition: tbb_main.cpp:122
static control_storage * controls[]
Definition: tbb_main.cpp:510
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
Definition: tbb_stddef.h:216
static void add_ref()
Add reference to resources. If first reference added, acquire the resources.
Definition: tbb_main.cpp:117
__itt_relation
The kind of relation between two instances is specified by the enumerated type __itt_relation. Relations between instances can be added with an API call. The relation API uses instance IDs. Relations can be added before or after the actual instances are created and persist independently of the instances. This is the motivation for having different lifetimes for instance IDs and the actual instances.
Definition: ittnotify.h:2618
void const char const char int ITT_FORMAT __itt_group_sync x void const char * name
virtual size_t default_value() const __TBB_override
Definition: tbb_main.cpp:497
void initialize_cache_aligned_allocator()
Defined in cache_aligned_allocator.cpp.
#define __TBB_override
Definition: tbb_stddef.h:240
void DoOneTimeInitializations()
Performs thread-safe lazy one-time general TBB initialization.
Definition: tbb_main.cpp:215
static bool UsePrivateRML
Definition: governor.h:64
static bool is_speculation_enabled
Definition: governor.h:67
void __TBB_EXPORTED_FUNC itt_region_end_v9(itt_domain_enum domain, void *region, unsigned long long region_extra)
Definition: tbb_main.cpp:434
void __TBB_EXPORTED_FUNC itt_make_task_group_v7(itt_domain_enum domain, void *group, unsigned long long group_extra, void *parent, unsigned long long parent_extra, string_index name_index)
Definition: tbb_main.cpp:414
#define ITT_SYNC_CREATE(obj, type, name)
Definition: itt_notify.h:115
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu metadata_add
static const char _pad[NFS_MaxLineSize - sizeof(int)]
Padding in order to prevent false sharing.
Definition: tbb_main.cpp:34
Work stealing task scheduler.
Definition: scheduler.h:137
T max(const T &val1, const T &val2)
Utility template function returning greater of the two values.
Definition: tbb_misc.h:119
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
#define ITT_NOTIFY(name, obj)
Definition: itt_notify.h:112
void *__TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(const void *src)
Definition: tbb_main.cpp:276
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
void Scheduler_OneTimeInitialization(bool itt_present)
Defined in scheduler.cpp.
Definition: scheduler.cpp:52
void __TBB_EXPORTED_FUNC itt_relation_add_v7(itt_domain_enum domain, void *addr0, unsigned long long addr0_extra, itt_relation relation, void *addr1, unsigned long long addr1_extra)
Definition: tbb_main.cpp:420
The graph class.
void __TBB_EXPORTED_METHOD internal_create()
Definition: tbb_main.cpp:523
static void set_active_num_workers(unsigned w)
Set number of active workers.
Definition: market.cpp:235
T __TBB_load_with_acquire(const volatile T &location)
Definition: tbb_machine.h:709
void __TBB_EXPORTED_FUNC itt_task_end_v7(itt_domain_enum domain)
Definition: tbb_main.cpp:429
void __TBB_EXPORTED_FUNC itt_metadata_ptr_add_v11(itt_domain_enum domain, void *addr, unsigned long long addr_extra, string_index key, void *value)
Definition: tbb_main.cpp:423
const size_t ThreadStackSize
Definition: tbb_misc.h:54
void PrintExtraVersionInfo(const char *category, const char *format,...)
Prints arbitrary extra TBB version information on stderr.
Definition: tbb_misc.cpp:211
unsigned GetPrime(unsigned seed)
static size_t default_page_size()
Definition: governor.h:89
Identifiers declared inside namespace internal should never be used directly by client code...
Definition: atomic.h:65
static market * theMarket
Currently active global market.
Definition: market.h:58

Copyright © 2005-2020 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.