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
25namespace tbb {
26namespace internal {
27
28//------------------------------------------------------------------------
29// Begin shared data layout.
30// The following global data items are mostly read-only after initialization.
31//------------------------------------------------------------------------
32
34static const char _pad[NFS_MaxLineSize - sizeof(int)] = {};
35
36//------------------------------------------------------------------------
37// governor data
41rml::tbb_factory governor::theRMLServerFactory;
45
46//------------------------------------------------------------------------
47// market data
50
51//------------------------------------------------------------------------
52// One time initialization data
53
55atomic<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
75generic_scheduler* (*AllocateSchedulerPtr)( market&, bool );
76
77#if __TBB_OLD_PRIMES_RNG
79
81static 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
108unsigned 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 ) {
128 }
129}
130
131//------------------------------------------------------------------------
132// One-time Initializations
133//------------------------------------------------------------------------
134
137
139void Scheduler_OneTimeInitialization ( bool itt_present );
140
141#if DO_ITT_NOTIFY
142
143static __itt_domain *tbb_domains[ITT_NUM_DOMAINS] = {};
144
145struct 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 },
154static resource_string strings_for_itt[] = {
156 { "num_resource_strings", NULL }
157};
158#undef TBB_STRING_RESOURCE
159
160static __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
165static 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
174static 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
184static void ITT_init() {
185 ITT_init_domains();
186 ITT_init_strings();
187}
188
191void 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
204extern "C"
205void 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
245extern "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
271void itt_store_pointer_with_release_v3( void* dst, void* src ) {
273 __TBB_store_with_release(*static_cast<void**>(dst),src);
274}
275
276void* 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
283void 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
292void call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}
293#endif
294
295#if DO_ITT_NOTIFY
296const __itt_id itt_null_id = {0, 0, 0};
297
298static 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
305static inline void itt_id_make(__itt_id *id, void* addr, unsigned long long extra) {
306 *id = __itt_id_make(addr, extra);
307}
308
309static inline void itt_id_create(const __itt_domain *domain, __itt_id id) {
310 ITTNOTIFY_VOID_D1(id_create, domain, id);
311}
312
313void 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
328void 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
343void 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
358void 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
369void 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
391void 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
404void 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
414void 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
417void itt_metadata_str_add_v7( itt_domain_enum /*domain*/, void* /*addr*/, unsigned long long /*addr_extra*/,
418 string_index /*key*/, const char* /*value*/ ) { }
419
420void 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
423void itt_metadata_ptr_add_v11( itt_domain_enum /*domain*/, void * /*addr*/, unsigned long long /*addr_extra*/,
424 string_index /*key*/, void * /*value*/ ) {}
425
426void 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
429void itt_task_end_v7( itt_domain_enum /*domain*/ ) { }
430
431void 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
434void itt_region_end_v9( itt_domain_enum /*domain*/, void* /*region*/, unsigned long long /*region_extra*/ ) { }
435
436#endif // DO_ITT_NOTIFY
437
438void* 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
444void itt_set_sync_name_v3( void* obj, const tchar* name) {
445 ITT_SYNC_RENAME(obj, name);
447}
448
451protected:
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
466class allowed_parallelism_control : public padded<control_storage> {
467 virtual size_t default_value() const __TBB_override {
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 }
490public:
491 size_t active_value_if_present() const {
492 return my_head? my_active_value : 0;
493 }
494};
495
496class 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
518namespace interface9 {
519
520using namespace internal;
521using namespace tbb::internal;
522
526
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
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
579size_t global_control::active_value( int param ) {
581 return controls[param]->active_value();
582}
583
584} // tbb::interface9
585} // namespace tbb
#define __TBB_ASSERT_RELEASE(predicate, message)
Definition: tbb_stddef.h:134
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
#define __TBB_override
Definition: tbb_stddef.h:240
__TBB_atomic __TBB_Flag __TBB_atomic_flag
Definition: gcc_generic.h:106
#define _T(string_literal)
Standard Windows style macro to markup the string literals.
Definition: itt_notify.h:59
#define ITT_SYNC_RENAME(obj, name)
Definition: itt_notify.h:116
#define ITT_SYNC_CREATE(obj, type, name)
Definition: itt_notify.h:115
#define ITT_FINI_ITTLIB()
Definition: itt_notify.h:114
#define ITT_NOTIFY(name, obj)
Definition: itt_notify.h:112
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
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
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 * addr
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
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 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
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
void const char const char int ITT_FORMAT __itt_group_sync x void const char * name
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
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 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 task_begin
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 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
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 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
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
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
Definition: tbb_stddef.h:216
#define __itt_domain_create
Definition: ittnotify.h:1791
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
#define __itt_string_handle_create
Definition: ittnotify.h:1980
__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....
@ __itt_metadata_u64
Definition: ittnotify.h:2405
@ __itt_metadata_u32
Definition: ittnotify.h:2407
__itt_relation
The kind of relation between two instances is specified by the enumerated type __itt_relation....
Definition: ittnotify.h:2619
The graph class.
char tchar
Unicode support.
Definition: itt_notify.h:57
Identifiers declared inside namespace internal should never be used directly by client code.
Definition: atomic.h:65
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
T __TBB_load_with_acquire(const volatile T &location)
Definition: tbb_machine.h:709
int __TBB_load_ittnotify()
static __TBB_InitOnce __TBB_InitOnceHiddenInstance
Definition: tbb_main.cpp:68
void initialize_cache_aligned_allocator()
Defined in cache_aligned_allocator.cpp.
unsigned GetPrime(unsigned seed)
static stack_size_control stack_size_ctl
Definition: tbb_main.cpp:508
void __TBB_EXPORTED_FUNC call_itt_notify_v5(int t, void *ptr)
Definition: tbb_main.cpp:292
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 suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
Definition: tbb_stddef.h:398
void DoOneTimeInitializations()
Performs thread-safe lazy one-time general TBB initialization.
Definition: tbb_main.cpp:215
void __TBB_EXPORTED_FUNC itt_task_end_v7(itt_domain_enum domain)
Definition: tbb_main.cpp:429
void Scheduler_OneTimeInitialization(bool itt_present)
Defined in scheduler.cpp.
Definition: scheduler.cpp:52
T max(const T &val1, const T &val2)
Utility template function returning greater of the two values.
Definition: tbb_misc.h:119
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
void PrintExtraVersionInfo(const char *category, const char *format,...)
Prints arbitrary extra TBB version information on stderr.
Definition: tbb_misc.cpp:211
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
static const char _pad[NFS_MaxLineSize - sizeof(int)]
Padding in order to prevent false sharing.
Definition: tbb_main.cpp:34
static bool GetBoolEnvironmentVariable(const char *name)
T min(const T &val1, const T &val2)
Utility template function returning lesser of the two values.
Definition: tbb_misc.h:110
void itt_set_sync_name_v3(void *obj, const tchar *name)
Definition: tbb_main.cpp:444
void *__TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(const void *src)
Definition: tbb_main.cpp:276
void *__TBB_EXPORTED_FUNC itt_load_pointer_v3(const void *src)
Definition: tbb_main.cpp:438
static allowed_parallelism_control allowed_parallelism_ctl
Definition: tbb_main.cpp:507
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
const size_t ThreadStackSize
Definition: tbb_misc.h:54
void __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(void *dst, void *src)
Definition: tbb_main.cpp:271
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
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
static control_storage * controls[]
Definition: tbb_main.cpp:510
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:713
void PrintVersion()
Prints TBB version information on stderr.
Definition: tbb_misc.cpp:206
static size_t active_value(parameter p)
void __TBB_EXPORTED_METHOD internal_destroy()
Definition: tbb_main.cpp:539
void __TBB_EXPORTED_METHOD internal_create()
Definition: tbb_main.cpp:523
A lock that occupies a single byte.
Definition: spin_mutex.h:39
Represents acquisition of a mutex.
Definition: spin_mutex.h:53
Pads type T to fill out to a multiple of cache line size.
Definition: tbb_stddef.h:261
static void release_resources()
Destroy the thread-local storage key and deinitialize RML.
Definition: governor.cpp:79
static bool is_rethrow_broken
Definition: governor.h:68
static void print_version_info()
Definition: governor.cpp:229
static void terminate_auto_initialized_scheduler()
Undo automatic initialization if necessary; call when a thread exits.
Definition: governor.h:144
static void acquire_resources()
Create key for thread-local storage and initialize RML.
Definition: governor.cpp:67
static size_t DefaultPageSize
Caches the size of OS regular memory page.
Definition: governor.h:60
static basic_tls< uintptr_t > theTLS
TLS for scheduler instances associated with individual threads.
Definition: governor.h:54
static size_t default_page_size()
Definition: governor.h:89
static unsigned default_num_threads()
Definition: governor.h:84
static rml::tbb_factory theRMLServerFactory
Definition: governor.h:62
static bool UsePrivateRML
Definition: governor.h:64
static void initialize_rml_factory()
Definition: governor.cpp:242
static unsigned DefaultNumberOfThreads
Caches the maximal level of parallelism supported by the hardware.
Definition: governor.h:57
static bool is_speculation_enabled
Definition: governor.h:67
static market * theMarket
Currently active global market.
Definition: market.h:58
static unsigned max_num_workers()
Definition: market.h:377
static void set_active_num_workers(unsigned w)
Set number of active workers.
Definition: market.cpp:235
static unsigned app_parallelism_limit()
Reports active parallelism level according to user's settings.
Definition: tbb_main.cpp:512
static global_market_mutex_type theMarketMutex
Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas,...
Definition: market.h:63
scheduler_mutex_type global_market_mutex_type
Definition: market.h:60
Work stealing task scheduler.
Definition: scheduler.h:140
virtual void apply_active() const
Definition: tbb_main.cpp:457
virtual size_t default_value() const =0
atomic< global_control * > my_head
Definition: tbb_main.cpp:453
virtual size_t active_value() const
Definition: tbb_main.cpp:461
virtual bool is_first_arg_preferred(size_t a, size_t b) const
Definition: tbb_main.cpp:458
virtual size_t active_value() const __TBB_override
Definition: tbb_main.cpp:478
virtual void apply_active() const __TBB_override
Definition: tbb_main.cpp:473
virtual size_t default_value() const __TBB_override
Definition: tbb_main.cpp:467
virtual bool is_first_arg_preferred(size_t a, size_t b) const __TBB_override
Definition: tbb_main.cpp:470
virtual void apply_active() const __TBB_override
Definition: tbb_main.cpp:500
virtual size_t default_value() const __TBB_override
Definition: tbb_main.cpp:497
Class that supports TBB initialization.
Definition: tbb_main.h:37
static bool initialization_done()
Definition: tbb_main.h:64
static bool InitializationDone
Specifies if the one-time initializations has been done.
Definition: tbb_main.h:50
static void remove_ref()
Remove reference to resources. If last reference removed, release the resources.
Definition: tbb_main.cpp:122
static atomic< int > count
Counter of references to global shared resources such as TLS.
Definition: tbb_main.h:41
static void add_ref()
Add reference to resources. If first reference added, acquire the resources.
Definition: tbb_main.cpp:117
static __TBB_atomic_flag InitializationLock
Global initialization lock.
Definition: tbb_main.h:57

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.