14#include "kmp_affinity.h"
15#include "kmp_atomic.h"
16#include "kmp_environment.h"
21#include "kmp_settings.h"
24#include "kmp_wait_release.h"
25#include "kmp_wrapper_getpid.h"
26#include "kmp_dispatch.h"
29#include "kmp_dispatch_hier.h"
33#include "ompt-specific.h"
36#include "ompd-specific.h"
39#if OMP_PROFILING_SUPPORT
40#include "llvm/Support/TimeProfiler.h"
41static char *ProfileTraceFile =
nullptr;
45#define KMP_USE_PRCTL 0
61#if defined(KMP_GOMP_COMPAT)
62char const __kmp_version_alt_comp[] =
63 KMP_VERSION_PREFIX
"alternative compiler support: yes";
66char const __kmp_version_omp_api[] =
67 KMP_VERSION_PREFIX
"API version: 5.0 (201611)";
70char const __kmp_version_lock[] =
71 KMP_VERSION_PREFIX
"lock type: run time selectable";
74#define KMP_MIN(x, y) ((x) < (y) ? (x) : (y))
79kmp_info_t __kmp_monitor;
84void __kmp_cleanup(
void);
86static void __kmp_initialize_info(kmp_info_t *, kmp_team_t *,
int tid,
88static void __kmp_initialize_team(kmp_team_t *team,
int new_nproc,
89 kmp_internal_control_t *new_icvs,
91#if KMP_AFFINITY_SUPPORTED
92static void __kmp_partition_places(kmp_team_t *team,
93 int update_master_only = 0);
95static void __kmp_do_serial_initialize(
void);
96#if ENABLE_LIBOMPTARGET
97static void __kmp_target_init(
void);
99void __kmp_fork_barrier(
int gtid,
int tid);
100void __kmp_join_barrier(
int gtid);
101void __kmp_setup_icv_copy(kmp_team_t *team,
int new_nproc,
102 kmp_internal_control_t *new_icvs,
ident_t *loc);
104#ifdef USE_LOAD_BALANCE
105static int __kmp_load_balance_nproc(kmp_root_t *root,
int set_nproc);
108static int __kmp_expand_threads(
int nNeed);
110static int __kmp_unregister_root_other_thread(
int gtid);
112static void __kmp_reap_thread(kmp_info_t *thread,
int is_root);
113kmp_info_t *__kmp_thread_pool_insert_pt = NULL;
115void __kmp_resize_dist_barrier(kmp_team_t *team,
int old_nthreads,
117void __kmp_add_threads_to_team(kmp_team_t *team,
int new_nthreads);
119static kmp_nested_nthreads_t *__kmp_override_nested_nth(kmp_info_t *thr,
121 kmp_nested_nthreads_t *new_nested_nth =
122 (kmp_nested_nthreads_t *)KMP_INTERNAL_MALLOC(
123 sizeof(kmp_nested_nthreads_t));
124 int new_size = level + thr->th.th_set_nested_nth_sz;
125 new_nested_nth->nth = (
int *)KMP_INTERNAL_MALLOC(new_size *
sizeof(
int));
126 for (
int i = 0; i < level + 1; ++i)
127 new_nested_nth->nth[i] = 0;
128 for (
int i = level + 1, j = 1; i < new_size; ++i, ++j)
129 new_nested_nth->nth[i] = thr->th.th_set_nested_nth[j];
130 new_nested_nth->size = new_nested_nth->used = new_size;
131 return new_nested_nth;
137int __kmp_get_global_thread_id() {
139 kmp_info_t **other_threads;
147 (
"*** __kmp_get_global_thread_id: entering, nproc=%d all_nproc=%d\n",
148 __kmp_nth, __kmp_all_nth));
155 if (!TCR_4(__kmp_init_gtid))
159 if (TCR_4(__kmp_gtid_mode) >= 3) {
160 KA_TRACE(1000, (
"*** __kmp_get_global_thread_id: using TDATA\n"));
164 if (TCR_4(__kmp_gtid_mode) >= 2) {
165 KA_TRACE(1000, (
"*** __kmp_get_global_thread_id: using keyed TLS\n"));
166 return __kmp_gtid_get_specific();
168 KA_TRACE(1000, (
"*** __kmp_get_global_thread_id: using internal alg.\n"));
170 stack_addr = (
char *)&stack_data;
171 other_threads = __kmp_threads;
184 for (i = 0; i < __kmp_threads_capacity; i++) {
186 kmp_info_t *thr = (kmp_info_t *)TCR_SYNC_PTR(other_threads[i]);
190 stack_size = (size_t)TCR_PTR(thr->th.th_info.ds.ds_stacksize);
191 stack_base = (
char *)TCR_PTR(thr->th.th_info.ds.ds_stackbase);
195 if (stack_addr <= stack_base) {
196 size_t stack_diff = stack_base - stack_addr;
198 if (stack_diff <= stack_size) {
205 KMP_DEBUG_ASSERT(__kmp_gtid_get_specific() < 0 ||
206 __kmp_gtid_get_specific() == i);
214 (
"*** __kmp_get_global_thread_id: internal alg. failed to find "
215 "thread, using TLS\n"));
216 i = __kmp_gtid_get_specific();
227 if (!TCR_SYNC_PTR(other_threads[i]))
232 if (!TCR_4(other_threads[i]->th.th_info.ds.ds_stackgrow)) {
233 KMP_FATAL(StackOverflow, i);
236 stack_base = (
char *)other_threads[i]->th.th_info.ds.ds_stackbase;
237 if (stack_addr > stack_base) {
238 TCW_PTR(other_threads[i]->th.th_info.ds.ds_stackbase, stack_addr);
239 TCW_PTR(other_threads[i]->th.th_info.ds.ds_stacksize,
240 other_threads[i]->th.th_info.ds.ds_stacksize + stack_addr -
243 TCW_PTR(other_threads[i]->th.th_info.ds.ds_stacksize,
244 stack_base - stack_addr);
248 if (__kmp_storage_map) {
249 char *stack_end = (
char *)other_threads[i]->th.th_info.ds.ds_stackbase;
250 char *stack_beg = stack_end - other_threads[i]->th.th_info.ds.ds_stacksize;
251 __kmp_print_storage_map_gtid(i, stack_beg, stack_end,
252 other_threads[i]->th.th_info.ds.ds_stacksize,
253 "th_%d stack (refinement)", i);
258int __kmp_get_global_thread_id_reg() {
261 if (!__kmp_init_serial) {
265 if (TCR_4(__kmp_gtid_mode) >= 3) {
266 KA_TRACE(1000, (
"*** __kmp_get_global_thread_id_reg: using TDATA\n"));
270 if (TCR_4(__kmp_gtid_mode) >= 2) {
271 KA_TRACE(1000, (
"*** __kmp_get_global_thread_id_reg: using keyed TLS\n"));
272 gtid = __kmp_gtid_get_specific();
275 (
"*** __kmp_get_global_thread_id_reg: using internal alg.\n"));
276 gtid = __kmp_get_global_thread_id();
280 if (gtid == KMP_GTID_DNE) {
282 (
"__kmp_get_global_thread_id_reg: Encountered new root thread. "
283 "Registering a new gtid.\n"));
284 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
285 if (!__kmp_init_serial) {
286 __kmp_do_serial_initialize();
287 gtid = __kmp_gtid_get_specific();
289 gtid = __kmp_register_root(FALSE);
291 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
295 KMP_DEBUG_ASSERT(gtid >= 0);
301void __kmp_check_stack_overlap(kmp_info_t *th) {
303 char *stack_beg = NULL;
304 char *stack_end = NULL;
307 KA_TRACE(10, (
"__kmp_check_stack_overlap: called\n"));
308 if (__kmp_storage_map) {
309 stack_end = (
char *)th->th.th_info.ds.ds_stackbase;
310 stack_beg = stack_end - th->th.th_info.ds.ds_stacksize;
312 gtid = __kmp_gtid_from_thread(th);
314 if (gtid == KMP_GTID_MONITOR) {
315 __kmp_print_storage_map_gtid(
316 gtid, stack_beg, stack_end, th->th.th_info.ds.ds_stacksize,
317 "th_%s stack (%s)",
"mon",
318 (th->th.th_info.ds.ds_stackgrow) ?
"initial" :
"actual");
320 __kmp_print_storage_map_gtid(
321 gtid, stack_beg, stack_end, th->th.th_info.ds.ds_stacksize,
322 "th_%d stack (%s)", gtid,
323 (th->th.th_info.ds.ds_stackgrow) ?
"initial" :
"actual");
329 gtid = __kmp_gtid_from_thread(th);
330 if (__kmp_env_checks == TRUE && !KMP_UBER_GTID(gtid)) {
332 (
"__kmp_check_stack_overlap: performing extensive checking\n"));
333 if (stack_beg == NULL) {
334 stack_end = (
char *)th->th.th_info.ds.ds_stackbase;
335 stack_beg = stack_end - th->th.th_info.ds.ds_stacksize;
338 for (f = 0; f < __kmp_threads_capacity; f++) {
339 kmp_info_t *f_th = (kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[f]);
341 if (f_th && f_th != th) {
342 char *other_stack_end =
343 (
char *)TCR_PTR(f_th->th.th_info.ds.ds_stackbase);
344 char *other_stack_beg =
345 other_stack_end - (size_t)TCR_PTR(f_th->th.th_info.ds.ds_stacksize);
346 if ((stack_beg > other_stack_beg && stack_beg < other_stack_end) ||
347 (stack_end > other_stack_beg && stack_end < other_stack_end)) {
350 if (__kmp_storage_map)
351 __kmp_print_storage_map_gtid(
352 -1, other_stack_beg, other_stack_end,
353 (
size_t)TCR_PTR(f_th->th.th_info.ds.ds_stacksize),
354 "th_%d stack (overlapped)", __kmp_gtid_from_thread(f_th));
356 __kmp_fatal(KMP_MSG(StackOverlap), KMP_HNT(ChangeStackLimit),
362 KA_TRACE(10, (
"__kmp_check_stack_overlap: returning\n"));
367void __kmp_infinite_loop(
void) {
368 static int done = FALSE;
375#define MAX_MESSAGE 512
377void __kmp_print_storage_map_gtid(
int gtid,
void *p1,
void *p2,
size_t size,
378 char const *format, ...) {
379 char buffer[MAX_MESSAGE];
382 va_start(ap, format);
383 KMP_SNPRINTF(buffer,
sizeof(buffer),
"OMP storage map: %p %p%8lu %s\n", p1,
384 p2, (
unsigned long)size, format);
385 __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
386 __kmp_vprintf(kmp_err, buffer, ap);
387#if KMP_PRINT_DATA_PLACEMENT
390 if (p1 <= p2 && (
char *)p2 - (
char *)p1 == size) {
391 if (__kmp_storage_map_verbose) {
392 node = __kmp_get_host_node(p1);
394 __kmp_storage_map_verbose = FALSE;
398 int localProc = __kmp_get_cpu_from_gtid(gtid);
400 const int page_size = KMP_GET_PAGE_SIZE();
402 p1 = (
void *)((
size_t)p1 & ~((size_t)page_size - 1));
403 p2 = (
void *)(((
size_t)p2 - 1) & ~((
size_t)page_size - 1));
405 __kmp_printf_no_lock(
" GTID %d localNode %d\n", gtid,
408 __kmp_printf_no_lock(
" GTID %d\n", gtid);
417 (
char *)p1 += page_size;
418 }
while (p1 <= p2 && (node = __kmp_get_host_node(p1)) == lastNode);
419 __kmp_printf_no_lock(
" %p-%p memNode %d\n", last, (
char *)p1 - 1,
423 __kmp_printf_no_lock(
" %p-%p memNode %d\n", p1,
424 (
char *)p1 + (page_size - 1),
425 __kmp_get_host_node(p1));
427 __kmp_printf_no_lock(
" %p-%p memNode %d\n", p2,
428 (
char *)p2 + (page_size - 1),
429 __kmp_get_host_node(p2));
435 __kmp_printf_no_lock(
" %s\n", KMP_I18N_STR(StorageMapWarning));
438 __kmp_release_bootstrap_lock(&__kmp_stdio_lock);
443void __kmp_warn(
char const *format, ...) {
444 char buffer[MAX_MESSAGE];
447 if (__kmp_generate_warnings == kmp_warnings_off) {
451 va_start(ap, format);
453 KMP_SNPRINTF(buffer,
sizeof(buffer),
"OMP warning: %s\n", format);
454 __kmp_acquire_bootstrap_lock(&__kmp_stdio_lock);
455 __kmp_vprintf(kmp_err, buffer, ap);
456 __kmp_release_bootstrap_lock(&__kmp_stdio_lock);
461void __kmp_abort_process() {
466 static KMP_THREAD_LOCAL
bool aborting =
false;
472 __kmp_acquire_bootstrap_lock(&__kmp_exit_lock);
474 if (__kmp_debug_buf) {
475 __kmp_dump_debug_buffer();
481 __kmp_global.g.g_abort = SIGABRT;
495 __kmp_unregister_library();
499 __kmp_infinite_loop();
500 __kmp_release_bootstrap_lock(&__kmp_exit_lock);
504void __kmp_abort_thread(
void) {
507 __kmp_infinite_loop();
513static void __kmp_print_thread_storage_map(kmp_info_t *thr,
int gtid) {
514 __kmp_print_storage_map_gtid(gtid, thr, thr + 1,
sizeof(kmp_info_t),
"th_%d",
517 __kmp_print_storage_map_gtid(gtid, &thr->th.th_info, &thr->th.th_team,
518 sizeof(kmp_desc_t),
"th_%d.th_info", gtid);
520 __kmp_print_storage_map_gtid(gtid, &thr->th.th_local, &thr->th.th_pri_head,
521 sizeof(kmp_local_t),
"th_%d.th_local", gtid);
523 __kmp_print_storage_map_gtid(
524 gtid, &thr->th.th_bar[0], &thr->th.th_bar[bs_last_barrier],
525 sizeof(kmp_balign_t) * bs_last_barrier,
"th_%d.th_bar", gtid);
527 __kmp_print_storage_map_gtid(gtid, &thr->th.th_bar[bs_plain_barrier],
528 &thr->th.th_bar[bs_plain_barrier + 1],
529 sizeof(kmp_balign_t),
"th_%d.th_bar[plain]",
532 __kmp_print_storage_map_gtid(gtid, &thr->th.th_bar[bs_forkjoin_barrier],
533 &thr->th.th_bar[bs_forkjoin_barrier + 1],
534 sizeof(kmp_balign_t),
"th_%d.th_bar[forkjoin]",
537#if KMP_FAST_REDUCTION_BARRIER
538 __kmp_print_storage_map_gtid(gtid, &thr->th.th_bar[bs_reduction_barrier],
539 &thr->th.th_bar[bs_reduction_barrier + 1],
540 sizeof(kmp_balign_t),
"th_%d.th_bar[reduction]",
548static void __kmp_print_team_storage_map(
const char *header, kmp_team_t *team,
549 int team_id,
int num_thr) {
550 int num_disp_buff = team->t.t_max_nproc > 1 ? __kmp_dispatch_num_buffers : 2;
551 __kmp_print_storage_map_gtid(-1, team, team + 1,
sizeof(kmp_team_t),
"%s_%d",
554 __kmp_print_storage_map_gtid(-1, &team->t.t_bar[0],
555 &team->t.t_bar[bs_last_barrier],
556 sizeof(kmp_balign_team_t) * bs_last_barrier,
557 "%s_%d.t_bar", header, team_id);
559 __kmp_print_storage_map_gtid(-1, &team->t.t_bar[bs_plain_barrier],
560 &team->t.t_bar[bs_plain_barrier + 1],
561 sizeof(kmp_balign_team_t),
"%s_%d.t_bar[plain]",
564 __kmp_print_storage_map_gtid(-1, &team->t.t_bar[bs_forkjoin_barrier],
565 &team->t.t_bar[bs_forkjoin_barrier + 1],
566 sizeof(kmp_balign_team_t),
567 "%s_%d.t_bar[forkjoin]", header, team_id);
569#if KMP_FAST_REDUCTION_BARRIER
570 __kmp_print_storage_map_gtid(-1, &team->t.t_bar[bs_reduction_barrier],
571 &team->t.t_bar[bs_reduction_barrier + 1],
572 sizeof(kmp_balign_team_t),
573 "%s_%d.t_bar[reduction]", header, team_id);
576 __kmp_print_storage_map_gtid(
577 -1, &team->t.t_dispatch[0], &team->t.t_dispatch[num_thr],
578 sizeof(kmp_disp_t) * num_thr,
"%s_%d.t_dispatch", header, team_id);
580 __kmp_print_storage_map_gtid(
581 -1, &team->t.t_threads[0], &team->t.t_threads[num_thr],
582 sizeof(kmp_info_t *) * num_thr,
"%s_%d.t_threads", header, team_id);
584 __kmp_print_storage_map_gtid(-1, &team->t.t_disp_buffer[0],
585 &team->t.t_disp_buffer[num_disp_buff],
586 sizeof(dispatch_shared_info_t) * num_disp_buff,
587 "%s_%d.t_disp_buffer", header, team_id);
590static void __kmp_init_allocator() {
591 __kmp_init_memkind();
592 __kmp_init_target_mem();
594static void __kmp_fini_allocator() {
595 __kmp_fini_target_mem();
596 __kmp_fini_memkind();
601#if ENABLE_LIBOMPTARGET
602static void __kmp_init_omptarget() {
603 __kmp_init_target_task();
612BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved) {
617 case DLL_PROCESS_ATTACH:
618 KA_TRACE(10, (
"DllMain: PROCESS_ATTACH\n"));
622 case DLL_PROCESS_DETACH:
623 KA_TRACE(10, (
"DllMain: PROCESS_DETACH T#%d\n", __kmp_gtid_get_specific()));
636 if (lpReserved == NULL)
637 __kmp_internal_end_library(__kmp_gtid_get_specific());
641 case DLL_THREAD_ATTACH:
642 KA_TRACE(10, (
"DllMain: THREAD_ATTACH\n"));
648 case DLL_THREAD_DETACH:
649 KA_TRACE(10, (
"DllMain: THREAD_DETACH T#%d\n", __kmp_gtid_get_specific()));
651 __kmp_internal_end_thread(__kmp_gtid_get_specific());
662void __kmp_parallel_deo(
int *gtid_ref,
int *cid_ref,
ident_t *loc_ref) {
663 int gtid = *gtid_ref;
664#ifdef BUILD_PARALLEL_ORDERED
665 kmp_team_t *team = __kmp_team_from_gtid(gtid);
668 if (__kmp_env_consistency_check) {
669 if (__kmp_threads[gtid]->th.th_root->r.r_active)
670#if KMP_USE_DYNAMIC_LOCK
671 __kmp_push_sync(gtid, ct_ordered_in_parallel, loc_ref, NULL, 0);
673 __kmp_push_sync(gtid, ct_ordered_in_parallel, loc_ref, NULL);
676#ifdef BUILD_PARALLEL_ORDERED
677 if (!team->t.t_serialized) {
679 KMP_WAIT(&team->t.t_ordered.dt.t_value, __kmp_tid_from_gtid(gtid), KMP_EQ,
687void __kmp_parallel_dxo(
int *gtid_ref,
int *cid_ref,
ident_t *loc_ref) {
688 int gtid = *gtid_ref;
689#ifdef BUILD_PARALLEL_ORDERED
690 int tid = __kmp_tid_from_gtid(gtid);
691 kmp_team_t *team = __kmp_team_from_gtid(gtid);
694 if (__kmp_env_consistency_check) {
695 if (__kmp_threads[gtid]->th.th_root->r.r_active)
696 __kmp_pop_sync(gtid, ct_ordered_in_parallel, loc_ref);
698#ifdef BUILD_PARALLEL_ORDERED
699 if (!team->t.t_serialized) {
704 team->t.t_ordered.dt.t_value = ((tid + 1) % team->t.t_nproc);
714int __kmp_enter_single(
int gtid,
ident_t *id_ref,
int push_ws) {
719 if (!TCR_4(__kmp_init_parallel))
720 __kmp_parallel_initialize();
721 __kmp_resume_if_soft_paused();
723 th = __kmp_threads[gtid];
724 team = th->th.th_team;
727 th->th.th_ident = id_ref;
729 if (team->t.t_serialized) {
732 kmp_int32 old_this = th->th.th_local.this_construct;
734 ++th->th.th_local.this_construct;
738 if (team->t.t_construct == old_this) {
739 status = __kmp_atomic_compare_store_acq(&team->t.t_construct, old_this,
740 th->th.th_local.this_construct);
743 if (__itt_metadata_add_ptr && __kmp_forkjoin_frames_mode == 3 &&
744 KMP_MASTER_GTID(gtid) && th->th.th_teams_microtask == NULL &&
745 team->t.t_active_level == 1) {
747 __kmp_itt_metadata_single(id_ref);
752 if (__kmp_env_consistency_check) {
753 if (status && push_ws) {
754 __kmp_push_workshare(gtid, ct_psingle, id_ref);
756 __kmp_check_workshare(gtid, ct_psingle, id_ref);
761 __kmp_itt_single_start(gtid);
767void __kmp_exit_single(
int gtid) {
769 __kmp_itt_single_end(gtid);
771 if (__kmp_env_consistency_check)
772 __kmp_pop_workshare(gtid, ct_psingle, NULL);
781static int __kmp_reserve_threads(kmp_root_t *root, kmp_team_t *parent_team,
782 int master_tid,
int set_nthreads,
786 KMP_DEBUG_ASSERT(__kmp_init_serial);
787 KMP_DEBUG_ASSERT(root && parent_team);
788 kmp_info_t *this_thr = parent_team->t.t_threads[master_tid];
792 new_nthreads = set_nthreads;
793 if (!get__dynamic_2(parent_team, master_tid)) {
796#ifdef USE_LOAD_BALANCE
797 else if (__kmp_global.g.g_dynamic_mode == dynamic_load_balance) {
798 new_nthreads = __kmp_load_balance_nproc(root, set_nthreads);
799 if (new_nthreads == 1) {
800 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d load balance reduced "
801 "reservation to 1 thread\n",
805 if (new_nthreads < set_nthreads) {
806 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d load balance reduced "
807 "reservation to %d threads\n",
808 master_tid, new_nthreads));
812 else if (__kmp_global.g.g_dynamic_mode == dynamic_thread_limit) {
813 new_nthreads = __kmp_avail_proc - __kmp_nth +
814 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc);
815 if (new_nthreads <= 1) {
816 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d thread limit reduced "
817 "reservation to 1 thread\n",
821 if (new_nthreads < set_nthreads) {
822 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d thread limit reduced "
823 "reservation to %d threads\n",
824 master_tid, new_nthreads));
826 new_nthreads = set_nthreads;
828 }
else if (__kmp_global.g.g_dynamic_mode == dynamic_random) {
829 if (set_nthreads > 2) {
830 new_nthreads = __kmp_get_random(parent_team->t.t_threads[master_tid]);
831 new_nthreads = (new_nthreads % set_nthreads) + 1;
832 if (new_nthreads == 1) {
833 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d dynamic random reduced "
834 "reservation to 1 thread\n",
838 if (new_nthreads < set_nthreads) {
839 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d dynamic random reduced "
840 "reservation to %d threads\n",
841 master_tid, new_nthreads));
849 if (__kmp_nth + new_nthreads -
850 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc) >
852 int tl_nthreads = __kmp_max_nth - __kmp_nth +
853 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc);
854 if (tl_nthreads <= 0) {
859 if (!get__dynamic_2(parent_team, master_tid) && (!__kmp_reserve_warn)) {
860 __kmp_reserve_warn = 1;
861 __kmp_msg(kmp_ms_warning,
862 KMP_MSG(CantFormThrTeam, set_nthreads, tl_nthreads),
863 KMP_HNT(Unset_ALL_THREADS), __kmp_msg_null);
865 if (tl_nthreads == 1) {
866 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d KMP_DEVICE_THREAD_LIMIT "
867 "reduced reservation to 1 thread\n",
871 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d KMP_DEVICE_THREAD_LIMIT reduced "
872 "reservation to %d threads\n",
873 master_tid, tl_nthreads));
874 new_nthreads = tl_nthreads;
878 int cg_nthreads = this_thr->th.th_cg_roots->cg_nthreads;
879 int max_cg_threads = this_thr->th.th_cg_roots->cg_thread_limit;
880 if (cg_nthreads + new_nthreads -
881 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc) >
883 int tl_nthreads = max_cg_threads - cg_nthreads +
884 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc);
885 if (tl_nthreads <= 0) {
890 if (!get__dynamic_2(parent_team, master_tid) && (!__kmp_reserve_warn)) {
891 __kmp_reserve_warn = 1;
892 __kmp_msg(kmp_ms_warning,
893 KMP_MSG(CantFormThrTeam, set_nthreads, tl_nthreads),
894 KMP_HNT(Unset_ALL_THREADS), __kmp_msg_null);
896 if (tl_nthreads == 1) {
897 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d OMP_THREAD_LIMIT "
898 "reduced reservation to 1 thread\n",
902 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d OMP_THREAD_LIMIT reduced "
903 "reservation to %d threads\n",
904 master_tid, tl_nthreads));
905 new_nthreads = tl_nthreads;
911 capacity = __kmp_threads_capacity;
912 if (TCR_PTR(__kmp_threads[0]) == NULL) {
918 if (__kmp_enable_hidden_helper && !TCR_4(__kmp_init_hidden_helper_threads)) {
919 capacity -= __kmp_hidden_helper_threads_num;
921 if (__kmp_nth + new_nthreads -
922 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc) >
925 int slotsRequired = __kmp_nth + new_nthreads -
926 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc) -
928 int slotsAdded = __kmp_expand_threads(slotsRequired);
929 if (slotsAdded < slotsRequired) {
931 new_nthreads -= (slotsRequired - slotsAdded);
932 KMP_ASSERT(new_nthreads >= 1);
935 if (!get__dynamic_2(parent_team, master_tid) && (!__kmp_reserve_warn)) {
936 __kmp_reserve_warn = 1;
937 if (__kmp_tp_cached) {
938 __kmp_msg(kmp_ms_warning,
939 KMP_MSG(CantFormThrTeam, set_nthreads, new_nthreads),
940 KMP_HNT(Set_ALL_THREADPRIVATE, __kmp_tp_capacity),
941 KMP_HNT(PossibleSystemLimitOnThreads), __kmp_msg_null);
943 __kmp_msg(kmp_ms_warning,
944 KMP_MSG(CantFormThrTeam, set_nthreads, new_nthreads),
945 KMP_HNT(SystemLimitOnThreads), __kmp_msg_null);
952 if (new_nthreads == 1) {
954 (
"__kmp_reserve_threads: T#%d serializing team after reclaiming "
955 "dead roots and rechecking; requested %d threads\n",
956 __kmp_get_gtid(), set_nthreads));
958 KC_TRACE(10, (
"__kmp_reserve_threads: T#%d allocating %d threads; requested"
960 __kmp_get_gtid(), new_nthreads, set_nthreads));
964 if (this_thr->th.th_nt_strict && new_nthreads < set_nthreads) {
965 __kmpc_error(this_thr->th.th_nt_loc, this_thr->th.th_nt_sev,
966 this_thr->th.th_nt_msg);
974static void __kmp_fork_team_threads(kmp_root_t *root, kmp_team_t *team,
975 kmp_info_t *master_th,
int master_gtid,
976 int fork_teams_workers) {
980 KA_TRACE(10, (
"__kmp_fork_team_threads: new_nprocs = %d\n", team->t.t_nproc));
981 KMP_DEBUG_ASSERT(master_gtid == __kmp_get_gtid());
985 master_th->th.th_info.ds.ds_tid = 0;
986 master_th->th.th_team = team;
987 master_th->th.th_team_nproc = team->t.t_nproc;
988 master_th->th.th_team_master = master_th;
989 master_th->th.th_team_serialized = FALSE;
990 master_th->th.th_dispatch = &team->t.t_dispatch[0];
994 kmp_hot_team_ptr_t *hot_teams = master_th->th.th_hot_teams;
997 int level = team->t.t_active_level - 1;
998 if (master_th->th.th_teams_microtask) {
999 if (master_th->th.th_teams_size.nteams > 1) {
1003 if (team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
1004 master_th->th.th_teams_level == team->t.t_level) {
1009 if (level < __kmp_hot_teams_max_level) {
1010 if (hot_teams[level].hot_team) {
1012 KMP_DEBUG_ASSERT(hot_teams[level].hot_team == team);
1016 hot_teams[level].hot_team = team;
1017 hot_teams[level].hot_team_nth = team->t.t_nproc;
1023 if (!use_hot_team) {
1026 team->t.t_threads[0] = master_th;
1027 __kmp_initialize_info(master_th, team, 0, master_gtid);
1030 for (i = 1; i < team->t.t_nproc; i++) {
1033 kmp_info_t *thr = __kmp_allocate_thread(root, team, i);
1034 team->t.t_threads[i] = thr;
1035 KMP_DEBUG_ASSERT(thr);
1036 KMP_DEBUG_ASSERT(thr->th.th_team == team);
1038 KA_TRACE(20, (
"__kmp_fork_team_threads: T#%d(%d:%d) init arrived "
1039 "T#%d(%d:%d) join =%llu, plain=%llu\n",
1040 __kmp_gtid_from_tid(0, team), team->t.t_id, 0,
1041 __kmp_gtid_from_tid(i, team), team->t.t_id, i,
1042 team->t.t_bar[bs_forkjoin_barrier].b_arrived,
1043 team->t.t_bar[bs_plain_barrier].b_arrived));
1044 thr->th.th_teams_microtask = master_th->th.th_teams_microtask;
1045 thr->th.th_teams_level = master_th->th.th_teams_level;
1046 thr->th.th_teams_size = master_th->th.th_teams_size;
1049 kmp_balign_t *balign = team->t.t_threads[i]->th.th_bar;
1050 for (b = 0; b < bs_last_barrier; ++b) {
1051 balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
1052 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
1054 balign[b].bb.b_worker_arrived = team->t.t_bar[b].b_team_arrived;
1060#if KMP_AFFINITY_SUPPORTED
1064 if (!fork_teams_workers) {
1065 __kmp_partition_places(team);
1069 if (team->t.t_nproc > 1 &&
1070 __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
1071 team->t.b->update_num_threads(team->t.t_nproc);
1072 __kmp_add_threads_to_team(team, team->t.t_nproc);
1077 if (__kmp_tasking_mode != tskm_immediate_exec) {
1079 KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team->t.t_parent, master_th);
1082 (
"__kmp_fork_team_threads: Primary T#%d pushing task_team %p / team "
1083 "%p, new task_team %p / team %p\n",
1084 __kmp_gtid_from_thread(master_th), master_th->th.th_task_team,
1085 team->t.t_parent, team->t.t_task_team[master_th->th.th_task_state],
1089 KMP_CHECK_UPDATE(team->t.t_primary_task_state,
1090 master_th->th.th_task_state);
1094 if (team->t.t_nproc > 1) {
1095 KMP_DEBUG_ASSERT(team->t.t_threads[1]->th.th_task_state == 0 ||
1096 team->t.t_threads[1]->th.th_task_state == 1);
1097 KMP_CHECK_UPDATE(master_th->th.th_task_state,
1098 team->t.t_threads[1]->th.th_task_state);
1100 master_th->th.th_task_state = 0;
1104 KMP_CHECK_UPDATE(team->t.t_primary_task_state,
1105 master_th->th.th_task_state);
1107 master_th->th.th_task_state = 0;
1111 if (__kmp_display_affinity && team->t.t_display_affinity != 1) {
1112 for (i = 0; i < team->t.t_nproc; i++) {
1113 kmp_info_t *thr = team->t.t_threads[i];
1114 if (thr->th.th_prev_num_threads != team->t.t_nproc ||
1115 thr->th.th_prev_level != team->t.t_level) {
1116 team->t.t_display_affinity = 1;
1125#if KMP_ARCH_X86 || KMP_ARCH_X86_64
1129inline static void propagateFPControl(kmp_team_t *team) {
1130 if (__kmp_inherit_fp_control) {
1131 kmp_int16 x87_fpu_control_word;
1135 __kmp_store_x87_fpu_control_word(&x87_fpu_control_word);
1136 __kmp_store_mxcsr(&mxcsr);
1137 mxcsr &= KMP_X86_MXCSR_MASK;
1148 KMP_CHECK_UPDATE(team->t.t_x87_fpu_control_word, x87_fpu_control_word);
1149 KMP_CHECK_UPDATE(team->t.t_mxcsr, mxcsr);
1152 KMP_CHECK_UPDATE(team->t.t_fp_control_saved, TRUE);
1156 KMP_CHECK_UPDATE(team->t.t_fp_control_saved, FALSE);
1162inline static void updateHWFPControl(kmp_team_t *team) {
1163 if (__kmp_inherit_fp_control && team->t.t_fp_control_saved) {
1166 kmp_int16 x87_fpu_control_word;
1168 __kmp_store_x87_fpu_control_word(&x87_fpu_control_word);
1169 __kmp_store_mxcsr(&mxcsr);
1170 mxcsr &= KMP_X86_MXCSR_MASK;
1172 if (team->t.t_x87_fpu_control_word != x87_fpu_control_word) {
1173 __kmp_clear_x87_fpu_status_word();
1174 __kmp_load_x87_fpu_control_word(&team->t.t_x87_fpu_control_word);
1177 if (team->t.t_mxcsr != mxcsr) {
1178 __kmp_load_mxcsr(&team->t.t_mxcsr);
1183#define propagateFPControl(x) ((void)0)
1184#define updateHWFPControl(x) ((void)0)
1187static void __kmp_alloc_argv_entries(
int argc, kmp_team_t *team,
1192void __kmp_serialized_parallel(
ident_t *loc, kmp_int32 global_tid) {
1193 kmp_info_t *this_thr;
1194 kmp_team_t *serial_team;
1196 KC_TRACE(10, (
"__kmpc_serialized_parallel: called by T#%d\n", global_tid));
1203 if (!TCR_4(__kmp_init_parallel))
1204 __kmp_parallel_initialize();
1205 __kmp_resume_if_soft_paused();
1207 this_thr = __kmp_threads[global_tid];
1208 serial_team = this_thr->th.th_serial_team;
1211 KMP_DEBUG_ASSERT(serial_team);
1214 kmp_proc_bind_t proc_bind = this_thr->th.th_set_proc_bind;
1215 if (this_thr->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
1216 proc_bind = proc_bind_false;
1217 }
else if (proc_bind == proc_bind_default) {
1220 proc_bind = this_thr->th.th_current_task->td_icvs.proc_bind;
1223 this_thr->th.th_set_proc_bind = proc_bind_default;
1228 if (this_thr->th.th_nt_strict && this_thr->th.th_set_nproc > 1)
1229 __kmpc_error(this_thr->th.th_nt_loc, this_thr->th.th_nt_sev,
1230 this_thr->th.th_nt_msg);
1232 this_thr->th.th_set_nproc = 0;
1235 ompt_data_t ompt_parallel_data = ompt_data_none;
1236 void *codeptr = OMPT_LOAD_RETURN_ADDRESS(global_tid);
1237 if (ompt_enabled.enabled &&
1238 this_thr->th.ompt_thread_info.state != ompt_state_overhead) {
1240 ompt_task_info_t *parent_task_info;
1241 parent_task_info = OMPT_CUR_TASK_INFO(this_thr);
1243 parent_task_info->frame.enter_frame.ptr = OMPT_GET_FRAME_ADDRESS(0);
1244 if (ompt_enabled.ompt_callback_parallel_begin) {
1247 ompt_callbacks.ompt_callback(ompt_callback_parallel_begin)(
1248 &(parent_task_info->task_data), &(parent_task_info->frame),
1249 &ompt_parallel_data, team_size,
1250 ompt_parallel_invoker_program | ompt_parallel_team, codeptr);
1255 if (this_thr->th.th_team != serial_team) {
1257 int level = this_thr->th.th_team->t.t_level;
1259 if (serial_team->t.t_serialized) {
1262 kmp_team_t *new_team;
1264 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
1266 new_team = __kmp_allocate_team(
1267 this_thr->th.th_root, 1, 1,
1271 proc_bind, &this_thr->th.th_current_task->td_icvs, 0, NULL);
1272 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
1273 KMP_ASSERT(new_team);
1276 new_team->t.t_threads[0] = this_thr;
1277 new_team->t.t_parent = this_thr->th.th_team;
1278 serial_team = new_team;
1279 this_thr->th.th_serial_team = serial_team;
1283 (
"__kmpc_serialized_parallel: T#%d allocated new serial team %p\n",
1284 global_tid, serial_team));
1292 (
"__kmpc_serialized_parallel: T#%d reusing cached serial team %p\n",
1293 global_tid, serial_team));
1297 KMP_DEBUG_ASSERT(serial_team->t.t_threads);
1298 KMP_DEBUG_ASSERT(serial_team->t.t_threads[0] == this_thr);
1299 KMP_DEBUG_ASSERT(this_thr->th.th_team != serial_team);
1300 serial_team->t.t_ident = loc;
1301 serial_team->t.t_serialized = 1;
1302 serial_team->t.t_nproc = 1;
1303 serial_team->t.t_parent = this_thr->th.th_team;
1304 if (this_thr->th.th_team->t.t_nested_nth)
1305 serial_team->t.t_nested_nth = this_thr->th.th_team->t.t_nested_nth;
1307 serial_team->t.t_nested_nth = &__kmp_nested_nth;
1309 serial_team->t.t_primary_task_state = this_thr->th.th_task_state;
1310 serial_team->t.t_sched.sched = this_thr->th.th_team->t.t_sched.sched;
1311 this_thr->th.th_team = serial_team;
1312 serial_team->t.t_master_tid = this_thr->th.th_info.ds.ds_tid;
1314 KF_TRACE(10, (
"__kmpc_serialized_parallel: T#%d curtask=%p\n", global_tid,
1315 this_thr->th.th_current_task));
1316 KMP_ASSERT(this_thr->th.th_current_task->td_flags.executing == 1);
1317 this_thr->th.th_current_task->td_flags.executing = 0;
1319 __kmp_push_current_task_to_thread(this_thr, serial_team, 0);
1324 copy_icvs(&this_thr->th.th_current_task->td_icvs,
1325 &this_thr->th.th_current_task->td_parent->td_icvs);
1329 kmp_nested_nthreads_t *nested_nth = &__kmp_nested_nth;
1330 if (this_thr->th.th_team->t.t_nested_nth)
1331 nested_nth = this_thr->th.th_team->t.t_nested_nth;
1332 if (nested_nth->used && (level + 1 < nested_nth->used)) {
1333 this_thr->th.th_current_task->td_icvs.nproc = nested_nth->nth[level + 1];
1336 if (__kmp_nested_proc_bind.used &&
1337 (level + 1 < __kmp_nested_proc_bind.used)) {
1338 this_thr->th.th_current_task->td_icvs.proc_bind =
1339 __kmp_nested_proc_bind.bind_types[level + 1];
1343 serial_team->t.t_pkfn = (microtask_t)(~0);
1345 this_thr->th.th_info.ds.ds_tid = 0;
1348 this_thr->th.th_team_nproc = 1;
1349 this_thr->th.th_team_master = this_thr;
1350 this_thr->th.th_team_serialized = 1;
1351 this_thr->th.th_task_team = NULL;
1352 this_thr->th.th_task_state = 0;
1354 serial_team->t.t_level = serial_team->t.t_parent->t.t_level + 1;
1355 serial_team->t.t_active_level = serial_team->t.t_parent->t.t_active_level;
1356 serial_team->t.t_def_allocator = this_thr->th.th_def_allocator;
1358 propagateFPControl(serial_team);
1361 KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
1362 if (!serial_team->t.t_dispatch->th_disp_buffer) {
1363 serial_team->t.t_dispatch->th_disp_buffer =
1364 (dispatch_private_info_t *)__kmp_allocate(
1365 sizeof(dispatch_private_info_t));
1367 this_thr->th.th_dispatch = serial_team->t.t_dispatch;
1374 KMP_DEBUG_ASSERT(this_thr->th.th_team == serial_team);
1375 KMP_DEBUG_ASSERT(serial_team->t.t_threads);
1376 KMP_DEBUG_ASSERT(serial_team->t.t_threads[0] == this_thr);
1377 ++serial_team->t.t_serialized;
1378 this_thr->th.th_team_serialized = serial_team->t.t_serialized;
1381 int level = this_thr->th.th_team->t.t_level;
1385 kmp_nested_nthreads_t *nested_nth = &__kmp_nested_nth;
1386 if (serial_team->t.t_nested_nth)
1387 nested_nth = serial_team->t.t_nested_nth;
1388 if (nested_nth->used && (level + 1 < nested_nth->used)) {
1389 this_thr->th.th_current_task->td_icvs.nproc = nested_nth->nth[level + 1];
1392 serial_team->t.t_level++;
1393 KF_TRACE(10, (
"__kmpc_serialized_parallel: T#%d increasing nesting level "
1394 "of serial team %p to %d\n",
1395 global_tid, serial_team, serial_team->t.t_level));
1398 KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
1400 dispatch_private_info_t *disp_buffer =
1401 (dispatch_private_info_t *)__kmp_allocate(
1402 sizeof(dispatch_private_info_t));
1403 disp_buffer->next = serial_team->t.t_dispatch->th_disp_buffer;
1404 serial_team->t.t_dispatch->th_disp_buffer = disp_buffer;
1406 this_thr->th.th_dispatch = serial_team->t.t_dispatch;
1409 __kmp_push_task_team_node(this_thr, serial_team);
1413 KMP_CHECK_UPDATE(serial_team->t.t_cancel_request, cancel_noreq);
1417 if (__kmp_display_affinity) {
1418 if (this_thr->th.th_prev_level != serial_team->t.t_level ||
1419 this_thr->th.th_prev_num_threads != 1) {
1421 __kmp_aux_display_affinity(global_tid, NULL);
1422 this_thr->th.th_prev_level = serial_team->t.t_level;
1423 this_thr->th.th_prev_num_threads = 1;
1427 if (__kmp_env_consistency_check)
1428 __kmp_push_parallel(global_tid, NULL);
1430 serial_team->t.ompt_team_info.master_return_address = codeptr;
1431 if (ompt_enabled.enabled &&
1432 this_thr->th.ompt_thread_info.state != ompt_state_overhead) {
1433 OMPT_CUR_TASK_INFO(this_thr)->frame.exit_frame.ptr =
1434 OMPT_GET_FRAME_ADDRESS(0);
1436 ompt_lw_taskteam_t lw_taskteam;
1437 __ompt_lw_taskteam_init(&lw_taskteam, this_thr, global_tid,
1438 &ompt_parallel_data, codeptr);
1440 __ompt_lw_taskteam_link(&lw_taskteam, this_thr, 1);
1444 if (ompt_enabled.ompt_callback_implicit_task) {
1445 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1446 ompt_scope_begin, OMPT_CUR_TEAM_DATA(this_thr),
1447 OMPT_CUR_TASK_DATA(this_thr), 1, __kmp_tid_from_gtid(global_tid),
1448 ompt_task_implicit);
1449 OMPT_CUR_TASK_INFO(this_thr)->thread_num =
1450 __kmp_tid_from_gtid(global_tid);
1454 this_thr->th.ompt_thread_info.state = ompt_state_work_parallel;
1455 OMPT_CUR_TASK_INFO(this_thr)->frame.exit_frame.ptr =
1456 OMPT_GET_FRAME_ADDRESS(0);
1462static inline bool __kmp_is_fork_in_teams(kmp_info_t *master_th,
1463 microtask_t microtask,
int level,
1464 int teams_level, kmp_va_list ap) {
1465 return (master_th->th.th_teams_microtask && ap &&
1466 microtask != (microtask_t)__kmp_teams_master && level == teams_level);
1471static inline bool __kmp_is_entering_teams(
int active_level,
int level,
1472 int teams_level, kmp_va_list ap) {
1473 return ((ap == NULL && active_level == 0) ||
1474 (ap && teams_level > 0 && teams_level == level));
1481__kmp_fork_in_teams(
ident_t *loc,
int gtid, kmp_team_t *parent_team,
1482 kmp_int32 argc, kmp_info_t *master_th, kmp_root_t *root,
1483 enum fork_context_e call_context, microtask_t microtask,
1484 launch_t invoker,
int master_set_numthreads,
int level,
1486 ompt_data_t ompt_parallel_data,
void *return_address,
1492 parent_team->t.t_ident = loc;
1493 __kmp_alloc_argv_entries(argc, parent_team, TRUE);
1494 parent_team->t.t_argc = argc;
1495 argv = (
void **)parent_team->t.t_argv;
1496 for (i = argc - 1; i >= 0; --i) {
1497 *argv++ = va_arg(kmp_va_deref(ap),
void *);
1500 if (parent_team == master_th->th.th_serial_team) {
1503 KMP_DEBUG_ASSERT(parent_team->t.t_serialized > 1);
1505 if (call_context == fork_context_gnu) {
1508 parent_team->t.t_serialized--;
1513 parent_team->t.t_pkfn = microtask;
1518 void **exit_frame_p;
1519 ompt_data_t *implicit_task_data;
1520 ompt_lw_taskteam_t lw_taskteam;
1522 if (ompt_enabled.enabled) {
1523 __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
1524 &ompt_parallel_data, return_address);
1525 exit_frame_p = &(lw_taskteam.ompt_task_info.frame.exit_frame.ptr);
1527 __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
1531 implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
1532 if (ompt_enabled.ompt_callback_implicit_task) {
1533 OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
1534 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1535 ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th), implicit_task_data,
1536 1, OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
1540 master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
1542 exit_frame_p = &dummy;
1548 parent_team->t.t_serialized--;
1551 KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
1552 KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
1553 __kmp_invoke_microtask(microtask, gtid, 0, argc, parent_team->t.t_argv
1562 if (ompt_enabled.enabled) {
1563 *exit_frame_p = NULL;
1564 OMPT_CUR_TASK_INFO(master_th)->frame.exit_frame = ompt_data_none;
1565 if (ompt_enabled.ompt_callback_implicit_task) {
1566 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1567 ompt_scope_end, NULL, implicit_task_data, 1,
1568 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
1570 ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
1571 __ompt_lw_taskteam_unlink(master_th);
1572 if (ompt_enabled.ompt_callback_parallel_end) {
1573 ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
1574 &ompt_parallel_data, OMPT_CUR_TASK_DATA(master_th),
1575 OMPT_INVOKER(call_context) | ompt_parallel_team, return_address);
1577 master_th->th.ompt_thread_info.state = ompt_state_overhead;
1583 parent_team->t.t_pkfn = microtask;
1584 parent_team->t.t_invoke = invoker;
1585 KMP_ATOMIC_INC(&root->r.r_in_parallel);
1586 parent_team->t.t_active_level++;
1587 parent_team->t.t_level++;
1588 parent_team->t.t_def_allocator = master_th->th.th_def_allocator;
1595 master_th->th.th_teams_size.nth = parent_team->t.t_nproc;
1598 if (ompt_enabled.enabled) {
1599 ompt_lw_taskteam_t lw_taskteam;
1600 __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid, &ompt_parallel_data,
1602 __ompt_lw_taskteam_link(&lw_taskteam, master_th, 1,
true);
1607 if (master_set_numthreads) {
1608 if (master_set_numthreads <= master_th->th.th_teams_size.nth) {
1610 kmp_info_t **other_threads = parent_team->t.t_threads;
1613 int old_proc = master_th->th.th_teams_size.nth;
1614 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
1615 __kmp_resize_dist_barrier(parent_team, old_proc, master_set_numthreads);
1616 __kmp_add_threads_to_team(parent_team, master_set_numthreads);
1618 parent_team->t.t_nproc = master_set_numthreads;
1619 for (i = 0; i < master_set_numthreads; ++i) {
1620 other_threads[i]->th.th_team_nproc = master_set_numthreads;
1624 master_th->th.th_set_nproc = 0;
1628 if (__kmp_debugging) {
1629 int nth = __kmp_omp_num_threads(loc);
1631 master_set_numthreads = nth;
1637 kmp_proc_bind_t proc_bind = master_th->th.th_set_proc_bind;
1639 kmp_proc_bind_t proc_bind_icv = proc_bind_default;
1640 if (master_th->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
1641 proc_bind = proc_bind_false;
1644 if (proc_bind == proc_bind_default) {
1645 proc_bind = master_th->th.th_current_task->td_icvs.proc_bind;
1651 if ((level + 1 < __kmp_nested_proc_bind.used) &&
1652 (__kmp_nested_proc_bind.bind_types[level + 1] !=
1653 master_th->th.th_current_task->td_icvs.proc_bind)) {
1654 proc_bind_icv = __kmp_nested_proc_bind.bind_types[level + 1];
1657 KMP_CHECK_UPDATE(parent_team->t.t_proc_bind, proc_bind);
1659 if (proc_bind_icv != proc_bind_default &&
1660 master_th->th.th_current_task->td_icvs.proc_bind != proc_bind_icv) {
1661 kmp_info_t **other_threads = parent_team->t.t_threads;
1662 for (i = 0; i < master_th->th.th_team_nproc; ++i) {
1663 other_threads[i]->th.th_current_task->td_icvs.proc_bind = proc_bind_icv;
1667 master_th->th.th_set_proc_bind = proc_bind_default;
1669#if USE_ITT_BUILD && USE_ITT_NOTIFY
1670 if (((__itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr) ||
1672 __kmp_forkjoin_frames_mode == 3 &&
1673 parent_team->t.t_active_level == 1
1674 && master_th->th.th_teams_size.nteams == 1) {
1675 kmp_uint64 tmp_time = __itt_get_timestamp();
1676 master_th->th.th_frame_time = tmp_time;
1677 parent_team->t.t_region_time = tmp_time;
1679 if (__itt_stack_caller_create_ptr) {
1680 KMP_DEBUG_ASSERT(parent_team->t.t_stack_id == NULL);
1682 parent_team->t.t_stack_id = __kmp_itt_stack_caller_create();
1685#if KMP_AFFINITY_SUPPORTED
1686 __kmp_partition_places(parent_team);
1689 KF_TRACE(10, (
"__kmp_fork_in_teams: before internal fork: root=%p, team=%p, "
1690 "master_th=%p, gtid=%d\n",
1691 root, parent_team, master_th, gtid));
1692 __kmp_internal_fork(loc, gtid, parent_team);
1693 KF_TRACE(10, (
"__kmp_fork_in_teams: after internal fork: root=%p, team=%p, "
1694 "master_th=%p, gtid=%d\n",
1695 root, parent_team, master_th, gtid));
1697 if (call_context == fork_context_gnu)
1701 KA_TRACE(20, (
"__kmp_fork_in_teams: T#%d(%d:0) invoke microtask = %p\n", gtid,
1702 parent_team->t.t_id, parent_team->t.t_pkfn));
1704 if (!parent_team->t.t_invoke(gtid)) {
1705 KMP_ASSERT2(0,
"cannot invoke microtask for PRIMARY thread");
1707 KA_TRACE(20, (
"__kmp_fork_in_teams: T#%d(%d:0) done microtask = %p\n", gtid,
1708 parent_team->t.t_id, parent_team->t.t_pkfn));
1711 KA_TRACE(20, (
"__kmp_fork_in_teams: parallel exit T#%d\n", gtid));
1718__kmp_serial_fork_call(
ident_t *loc,
int gtid,
enum fork_context_e call_context,
1719 kmp_int32 argc, microtask_t microtask, launch_t invoker,
1720 kmp_info_t *master_th, kmp_team_t *parent_team,
1722 ompt_data_t *ompt_parallel_data,
void **return_address,
1723 ompt_data_t **parent_task_data,
1731#if KMP_OS_LINUX && \
1732 (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64)
1735 void **args = (
void **)KMP_ALLOCA(argc *
sizeof(
void *));
1740 20, (
"__kmp_serial_fork_call: T#%d serializing parallel region\n", gtid));
1745 master_th->th.th_serial_team->t.t_pkfn = microtask;
1748 if (call_context == fork_context_intel) {
1750 master_th->th.th_serial_team->t.t_ident = loc;
1753 master_th->th.th_serial_team->t.t_level--;
1758 void **exit_frame_p;
1759 ompt_task_info_t *task_info;
1760 ompt_lw_taskteam_t lw_taskteam;
1762 if (ompt_enabled.enabled) {
1763 __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
1764 ompt_parallel_data, *return_address);
1766 __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
1768 task_info = OMPT_CUR_TASK_INFO(master_th);
1769 exit_frame_p = &(task_info->frame.exit_frame.ptr);
1770 if (ompt_enabled.ompt_callback_implicit_task) {
1771 OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
1772 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1773 ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
1774 &(task_info->task_data), 1,
1775 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
1779 master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
1781 exit_frame_p = &dummy;
1786 KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
1787 KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
1788 __kmp_invoke_microtask(microtask, gtid, 0, argc, parent_team->t.t_argv
1797 if (ompt_enabled.enabled) {
1798 *exit_frame_p = NULL;
1799 if (ompt_enabled.ompt_callback_implicit_task) {
1800 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1801 ompt_scope_end, NULL, &(task_info->task_data), 1,
1802 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
1804 *ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
1805 __ompt_lw_taskteam_unlink(master_th);
1806 if (ompt_enabled.ompt_callback_parallel_end) {
1807 ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
1808 ompt_parallel_data, *parent_task_data,
1809 OMPT_INVOKER(call_context) | ompt_parallel_team, *return_address);
1811 master_th->th.ompt_thread_info.state = ompt_state_overhead;
1814 }
else if (microtask == (microtask_t)__kmp_teams_master) {
1815 KMP_DEBUG_ASSERT(master_th->th.th_team == master_th->th.th_serial_team);
1816 team = master_th->th.th_team;
1818 team->t.t_invoke = invoker;
1819 __kmp_alloc_argv_entries(argc, team, TRUE);
1820 team->t.t_argc = argc;
1821 argv = (
void **)team->t.t_argv;
1822 for (i = argc - 1; i >= 0; --i)
1823 *argv++ = va_arg(kmp_va_deref(ap),
void *);
1830 if (ompt_enabled.enabled) {
1831 ompt_task_info_t *task_info = OMPT_CUR_TASK_INFO(master_th);
1832 if (ompt_enabled.ompt_callback_implicit_task) {
1833 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1834 ompt_scope_end, NULL, &(task_info->task_data), 0,
1835 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_initial);
1837 if (ompt_enabled.ompt_callback_parallel_end) {
1838 ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
1839 ompt_parallel_data, *parent_task_data,
1840 OMPT_INVOKER(call_context) | ompt_parallel_league,
1843 master_th->th.ompt_thread_info.state = ompt_state_overhead;
1848 for (i = argc - 1; i >= 0; --i)
1849 *argv++ = va_arg(kmp_va_deref(ap),
void *);
1854 void **exit_frame_p;
1855 ompt_task_info_t *task_info;
1856 ompt_lw_taskteam_t lw_taskteam;
1857 ompt_data_t *implicit_task_data;
1859 if (ompt_enabled.enabled) {
1860 __ompt_lw_taskteam_init(&lw_taskteam, master_th, gtid,
1861 ompt_parallel_data, *return_address);
1862 __ompt_lw_taskteam_link(&lw_taskteam, master_th, 0);
1864 task_info = OMPT_CUR_TASK_INFO(master_th);
1865 exit_frame_p = &(task_info->frame.exit_frame.ptr);
1868 implicit_task_data = OMPT_CUR_TASK_DATA(master_th);
1869 if (ompt_enabled.ompt_callback_implicit_task) {
1870 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1871 ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th),
1872 implicit_task_data, 1, __kmp_tid_from_gtid(gtid),
1873 ompt_task_implicit);
1874 OMPT_CUR_TASK_INFO(master_th)->thread_num = __kmp_tid_from_gtid(gtid);
1878 master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
1880 exit_frame_p = &dummy;
1885 KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
1886 KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
1887 __kmp_invoke_microtask(microtask, gtid, 0, argc, args
1896 if (ompt_enabled.enabled) {
1897 *exit_frame_p = NULL;
1898 if (ompt_enabled.ompt_callback_implicit_task) {
1899 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
1900 ompt_scope_end, NULL, &(task_info->task_data), 1,
1901 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
1904 *ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
1905 __ompt_lw_taskteam_unlink(master_th);
1906 if (ompt_enabled.ompt_callback_parallel_end) {
1907 ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
1908 ompt_parallel_data, *parent_task_data,
1909 OMPT_INVOKER(call_context) | ompt_parallel_team, *return_address);
1911 master_th->th.ompt_thread_info.state = ompt_state_overhead;
1915 }
else if (call_context == fork_context_gnu) {
1917 if (ompt_enabled.enabled) {
1918 ompt_lw_taskteam_t lwt;
1919 __ompt_lw_taskteam_init(&lwt, master_th, gtid, ompt_parallel_data,
1922 lwt.ompt_task_info.frame.exit_frame = ompt_data_none;
1923 __ompt_lw_taskteam_link(&lwt, master_th, 1);
1929 KA_TRACE(20, (
"__kmp_serial_fork_call: T#%d serial exit\n", gtid));
1932 KMP_ASSERT2(call_context < fork_context_last,
1933 "__kmp_serial_fork_call: unknown fork_context parameter");
1936 KA_TRACE(20, (
"__kmp_serial_fork_call: T#%d serial exit\n", gtid));
1943int __kmp_fork_call(
ident_t *loc,
int gtid,
1944 enum fork_context_e call_context,
1945 kmp_int32 argc, microtask_t microtask, launch_t invoker,
1950 int master_this_cons;
1952 kmp_team_t *parent_team;
1953 kmp_info_t *master_th;
1957 int master_set_numthreads;
1958 int task_thread_limit = 0;
1962 kmp_hot_team_ptr_t **p_hot_teams;
1964 KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(KMP_fork_call);
1967 KA_TRACE(20, (
"__kmp_fork_call: enter T#%d\n", gtid));
1968 if (__kmp_stkpadding > 0 && __kmp_root[gtid] != NULL) {
1971 void *dummy = KMP_ALLOCA(__kmp_stkpadding);
1973 if (__kmp_stkpadding > KMP_MAX_STKPADDING)
1974 __kmp_stkpadding += (short)((kmp_int64)dummy);
1980 if (!TCR_4(__kmp_init_parallel))
1981 __kmp_parallel_initialize();
1982 __kmp_resume_if_soft_paused();
1987 master_th = __kmp_threads[gtid];
1989 parent_team = master_th->th.th_team;
1990 master_tid = master_th->th.th_info.ds.ds_tid;
1991 master_this_cons = master_th->th.th_local.this_construct;
1992 root = master_th->th.th_root;
1993 master_active = root->r.r_active;
1994 master_set_numthreads = master_th->th.th_set_nproc;
1996 master_th->th.th_current_task->td_icvs.task_thread_limit;
1999 ompt_data_t ompt_parallel_data = ompt_data_none;
2000 ompt_data_t *parent_task_data = NULL;
2001 ompt_frame_t *ompt_frame = NULL;
2002 void *return_address = NULL;
2004 if (ompt_enabled.enabled) {
2005 __ompt_get_task_info_internal(0, NULL, &parent_task_data, &ompt_frame,
2007 return_address = OMPT_LOAD_RETURN_ADDRESS(gtid);
2012 __kmp_assign_root_init_mask();
2015 level = parent_team->t.t_level;
2017 active_level = parent_team->t.t_active_level;
2019 teams_level = master_th->th.th_teams_level;
2020 p_hot_teams = &master_th->th.th_hot_teams;
2021 if (*p_hot_teams == NULL && __kmp_hot_teams_max_level > 0) {
2022 *p_hot_teams = (kmp_hot_team_ptr_t *)__kmp_allocate(
2023 sizeof(kmp_hot_team_ptr_t) * __kmp_hot_teams_max_level);
2024 (*p_hot_teams)[0].hot_team = root->r.r_hot_team;
2026 (*p_hot_teams)[0].hot_team_nth = 1;
2030 if (ompt_enabled.enabled) {
2031 if (ompt_enabled.ompt_callback_parallel_begin) {
2032 int team_size = master_set_numthreads
2033 ? master_set_numthreads
2034 : get__nproc_2(parent_team, master_tid);
2035 int flags = OMPT_INVOKER(call_context) |
2036 ((microtask == (microtask_t)__kmp_teams_master)
2037 ? ompt_parallel_league
2038 : ompt_parallel_team);
2039 ompt_callbacks.ompt_callback(ompt_callback_parallel_begin)(
2040 parent_task_data, ompt_frame, &ompt_parallel_data, team_size, flags,
2043 master_th->th.ompt_thread_info.state = ompt_state_overhead;
2047 master_th->th.th_ident = loc;
2050 if (__kmp_is_fork_in_teams(master_th, microtask, level, teams_level, ap)) {
2051 return __kmp_fork_in_teams(loc, gtid, parent_team, argc, master_th, root,
2052 call_context, microtask, invoker,
2053 master_set_numthreads, level,
2055 ompt_parallel_data, return_address,
2064 KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(parent_team, master_th);
2068 __kmp_is_entering_teams(active_level, level, teams_level, ap);
2069 if ((!enter_teams &&
2070 (parent_team->t.t_active_level >=
2071 master_th->th.th_current_task->td_icvs.max_active_levels)) ||
2072 (__kmp_library == library_serial)) {
2073 KC_TRACE(10, (
"__kmp_fork_call: T#%d serializing team\n", gtid));
2076 nthreads = master_set_numthreads
2077 ? master_set_numthreads
2079 : get__nproc_2(parent_team, master_tid);
2082 nthreads = task_thread_limit > 0 && task_thread_limit < nthreads
2089 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
2094 nthreads = __kmp_reserve_threads(root, parent_team, master_tid,
2095 nthreads, enter_teams);
2096 if (nthreads == 1) {
2100 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
2104 KMP_DEBUG_ASSERT(nthreads > 0);
2107 master_th->th.th_set_nproc = 0;
2109 if (nthreads == 1) {
2110 return __kmp_serial_fork_call(loc, gtid, call_context, argc, microtask,
2111 invoker, master_th, parent_team,
2113 &ompt_parallel_data, &return_address,
2121 KF_TRACE(10, (
"__kmp_fork_call: parent_team_aclevel=%d, master_th=%p, "
2122 "curtask=%p, curtask_max_aclevel=%d\n",
2123 parent_team->t.t_active_level, master_th,
2124 master_th->th.th_current_task,
2125 master_th->th.th_current_task->td_icvs.max_active_levels));
2129 master_th->th.th_current_task->td_flags.executing = 0;
2131 if (!master_th->th.th_teams_microtask || level > teams_level) {
2133 KMP_ATOMIC_INC(&root->r.r_in_parallel);
2137 int nthreads_icv = master_th->th.th_current_task->td_icvs.nproc;
2138 kmp_nested_nthreads_t *nested_nth = NULL;
2139 if (!master_th->th.th_set_nested_nth &&
2140 (level + 1 < parent_team->t.t_nested_nth->used) &&
2141 (parent_team->t.t_nested_nth->nth[level + 1] != nthreads_icv)) {
2142 nthreads_icv = parent_team->t.t_nested_nth->nth[level + 1];
2143 }
else if (master_th->th.th_set_nested_nth) {
2144 nested_nth = __kmp_override_nested_nth(master_th, level);
2145 if ((level + 1 < nested_nth->used) &&
2146 (nested_nth->nth[level + 1] != nthreads_icv))
2147 nthreads_icv = nested_nth->nth[level + 1];
2155 kmp_proc_bind_t proc_bind = master_th->th.th_set_proc_bind;
2157 kmp_proc_bind_t proc_bind_icv = proc_bind_default;
2158 if (master_th->th.th_current_task->td_icvs.proc_bind == proc_bind_false) {
2159 proc_bind = proc_bind_false;
2163 if (proc_bind == proc_bind_default) {
2164 proc_bind = master_th->th.th_current_task->td_icvs.proc_bind;
2167 if (master_th->th.th_teams_microtask &&
2168 microtask == (microtask_t)__kmp_teams_master) {
2169 proc_bind = __kmp_teams_proc_bind;
2175 if ((level + 1 < __kmp_nested_proc_bind.used) &&
2176 (__kmp_nested_proc_bind.bind_types[level + 1] !=
2177 master_th->th.th_current_task->td_icvs.proc_bind)) {
2180 if (!master_th->th.th_teams_microtask ||
2181 !(microtask == (microtask_t)__kmp_teams_master || ap == NULL))
2182 proc_bind_icv = __kmp_nested_proc_bind.bind_types[level + 1];
2187 master_th->th.th_set_proc_bind = proc_bind_default;
2189 if ((nthreads_icv > 0) || (proc_bind_icv != proc_bind_default)) {
2190 kmp_internal_control_t new_icvs;
2191 copy_icvs(&new_icvs, &master_th->th.th_current_task->td_icvs);
2192 new_icvs.next = NULL;
2193 if (nthreads_icv > 0) {
2194 new_icvs.nproc = nthreads_icv;
2196 if (proc_bind_icv != proc_bind_default) {
2197 new_icvs.proc_bind = proc_bind_icv;
2201 KF_TRACE(10, (
"__kmp_fork_call: before __kmp_allocate_team\n"));
2202 team = __kmp_allocate_team(root, nthreads, nthreads,
2206 proc_bind, &new_icvs, argc, master_th);
2207 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar)
2208 copy_icvs((kmp_internal_control_t *)team->t.b->team_icvs, &new_icvs);
2211 KF_TRACE(10, (
"__kmp_fork_call: before __kmp_allocate_team\n"));
2212 team = __kmp_allocate_team(
2213 root, nthreads, nthreads,
2217 proc_bind, &master_th->th.th_current_task->td_icvs, argc, master_th);
2218 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar)
2219 copy_icvs((kmp_internal_control_t *)team->t.b->team_icvs,
2220 &master_th->th.th_current_task->td_icvs);
2223 10, (
"__kmp_fork_call: after __kmp_allocate_team - team = %p\n", team));
2226 KMP_CHECK_UPDATE(team->t.t_master_tid, master_tid);
2227 KMP_CHECK_UPDATE(team->t.t_master_this_cons, master_this_cons);
2228 KMP_CHECK_UPDATE(team->t.t_ident, loc);
2229 KMP_CHECK_UPDATE(team->t.t_parent, parent_team);
2230 KMP_CHECK_UPDATE_SYNC(team->t.t_pkfn, microtask);
2232 KMP_CHECK_UPDATE_SYNC(team->t.ompt_team_info.master_return_address,
2235 KMP_CHECK_UPDATE(team->t.t_invoke, invoker);
2237 if (!master_th->th.th_teams_microtask || level > teams_level) {
2238 int new_level = parent_team->t.t_level + 1;
2239 KMP_CHECK_UPDATE(team->t.t_level, new_level);
2240 new_level = parent_team->t.t_active_level + 1;
2241 KMP_CHECK_UPDATE(team->t.t_active_level, new_level);
2244 int new_level = parent_team->t.t_level;
2245 KMP_CHECK_UPDATE(team->t.t_level, new_level);
2246 new_level = parent_team->t.t_active_level;
2247 KMP_CHECK_UPDATE(team->t.t_active_level, new_level);
2249 kmp_r_sched_t new_sched = get__sched_2(parent_team, master_tid);
2251 KMP_CHECK_UPDATE(team->t.t_sched.sched, new_sched.sched);
2253 KMP_CHECK_UPDATE(team->t.t_cancel_request, cancel_noreq);
2254 KMP_CHECK_UPDATE(team->t.t_def_allocator, master_th->th.th_def_allocator);
2257 if (team->t.t_nested_nth &&
2258 team->t.t_nested_nth != parent_team->t.t_nested_nth) {
2259 KMP_INTERNAL_FREE(team->t.t_nested_nth->nth);
2260 KMP_INTERNAL_FREE(team->t.t_nested_nth);
2261 team->t.t_nested_nth = NULL;
2263 team->t.t_nested_nth = parent_team->t.t_nested_nth;
2264 if (master_th->th.th_set_nested_nth) {
2266 nested_nth = __kmp_override_nested_nth(master_th, level);
2267 team->t.t_nested_nth = nested_nth;
2268 KMP_INTERNAL_FREE(master_th->th.th_set_nested_nth);
2269 master_th->th.th_set_nested_nth = NULL;
2270 master_th->th.th_set_nested_nth_sz = 0;
2271 master_th->th.th_nt_strict =
false;
2275 propagateFPControl(team);
2277 if (ompd_state & OMPD_ENABLE_BP)
2278 ompd_bp_parallel_begin();
2283 (
"__kmp_fork_call: T#%d(%d:%d)->(%d:0) created a team of %d threads\n",
2284 gtid, parent_team->t.t_id, team->t.t_master_tid, team->t.t_id,
2286 KMP_DEBUG_ASSERT(team != root->r.r_hot_team ||
2287 (team->t.t_master_tid == 0 &&
2288 (team->t.t_parent == root->r.r_root_team ||
2289 team->t.t_parent->t.t_serialized)));
2293 argv = (
void **)team->t.t_argv;
2295 for (i = argc - 1; i >= 0; --i) {
2296 void *new_argv = va_arg(kmp_va_deref(ap),
void *);
2297 KMP_CHECK_UPDATE(*argv, new_argv);
2301 for (i = 0; i < argc; ++i) {
2303 KMP_CHECK_UPDATE(argv[i], team->t.t_parent->t.t_argv[i]);
2308 KMP_CHECK_UPDATE(team->t.t_master_active, master_active);
2309 if (!root->r.r_active)
2310 root->r.r_active = TRUE;
2312 __kmp_fork_team_threads(root, team, master_th, gtid, !ap);
2313 __kmp_setup_icv_copy(team, nthreads,
2314 &master_th->th.th_current_task->td_icvs, loc);
2317 master_th->th.ompt_thread_info.state = ompt_state_work_parallel;
2320 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
2323 if (team->t.t_active_level == 1
2324 && !master_th->th.th_teams_microtask) {
2326 if ((__itt_frame_submit_v3_ptr || KMP_ITT_DEBUG) &&
2327 (__kmp_forkjoin_frames_mode == 3 ||
2328 __kmp_forkjoin_frames_mode == 1)) {
2329 kmp_uint64 tmp_time = 0;
2330 if (__itt_get_timestamp_ptr)
2331 tmp_time = __itt_get_timestamp();
2333 master_th->th.th_frame_time = tmp_time;
2334 if (__kmp_forkjoin_frames_mode == 3)
2335 team->t.t_region_time = tmp_time;
2339 if ((__itt_frame_begin_v3_ptr || KMP_ITT_DEBUG) &&
2340 __kmp_forkjoin_frames && !__kmp_forkjoin_frames_mode) {
2342 __kmp_itt_region_forking(gtid, team->t.t_nproc, 0);
2348 KMP_DEBUG_ASSERT(team == __kmp_threads[gtid]->th.th_team);
2351 (
"__kmp_internal_fork : root=%p, team=%p, master_th=%p, gtid=%d\n",
2352 root, team, master_th, gtid));
2355 if (__itt_stack_caller_create_ptr) {
2358 KMP_DEBUG_ASSERT(team->t.t_stack_id == NULL);
2359 team->t.t_stack_id = __kmp_itt_stack_caller_create();
2360 }
else if (parent_team->t.t_serialized) {
2365 KMP_DEBUG_ASSERT(parent_team->t.t_stack_id == NULL);
2366 parent_team->t.t_stack_id = __kmp_itt_stack_caller_create();
2374 __kmp_internal_fork(loc, gtid, team);
2375 KF_TRACE(10, (
"__kmp_internal_fork : after : root=%p, team=%p, "
2376 "master_th=%p, gtid=%d\n",
2377 root, team, master_th, gtid));
2380 if (call_context == fork_context_gnu) {
2381 KA_TRACE(20, (
"__kmp_fork_call: parallel exit T#%d\n", gtid));
2386 KA_TRACE(20, (
"__kmp_fork_call: T#%d(%d:0) invoke microtask = %p\n", gtid,
2387 team->t.t_id, team->t.t_pkfn));
2390#if KMP_STATS_ENABLED
2394 KMP_SET_THREAD_STATE(stats_state_e::TEAMS_REGION);
2398 if (!team->t.t_invoke(gtid)) {
2399 KMP_ASSERT2(0,
"cannot invoke microtask for PRIMARY thread");
2402#if KMP_STATS_ENABLED
2405 KMP_SET_THREAD_STATE(previous_state);
2409 KA_TRACE(20, (
"__kmp_fork_call: T#%d(%d:0) done microtask = %p\n", gtid,
2410 team->t.t_id, team->t.t_pkfn));
2413 KA_TRACE(20, (
"__kmp_fork_call: parallel exit T#%d\n", gtid));
2415 if (ompt_enabled.enabled) {
2416 master_th->th.ompt_thread_info.state = ompt_state_overhead;
2424static inline void __kmp_join_restore_state(kmp_info_t *thread,
2427 thread->th.ompt_thread_info.state =
2428 ((team->t.t_serialized) ? ompt_state_work_serial
2429 : ompt_state_work_parallel);
2432static inline void __kmp_join_ompt(
int gtid, kmp_info_t *thread,
2433 kmp_team_t *team, ompt_data_t *parallel_data,
2434 int flags,
void *codeptr) {
2435 ompt_task_info_t *task_info = __ompt_get_task_info_object(0);
2436 if (ompt_enabled.ompt_callback_parallel_end) {
2437 ompt_callbacks.ompt_callback(ompt_callback_parallel_end)(
2438 parallel_data, &(task_info->task_data), flags, codeptr);
2441 task_info->frame.enter_frame = ompt_data_none;
2442 __kmp_join_restore_state(thread, team);
2446void __kmp_join_call(
ident_t *loc,
int gtid
2449 enum fork_context_e fork_context
2453 KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(KMP_join_call);
2455 kmp_team_t *parent_team;
2456 kmp_info_t *master_th;
2460 KA_TRACE(20, (
"__kmp_join_call: enter T#%d\n", gtid));
2463 master_th = __kmp_threads[gtid];
2464 root = master_th->th.th_root;
2465 team = master_th->th.th_team;
2466 parent_team = team->t.t_parent;
2468 master_th->th.th_ident = loc;
2471 void *team_microtask = (
void *)team->t.t_pkfn;
2475 if (ompt_enabled.enabled &&
2476 !(team->t.t_serialized && fork_context == fork_context_gnu)) {
2477 master_th->th.ompt_thread_info.state = ompt_state_overhead;
2482 if (__kmp_tasking_mode != tskm_immediate_exec && !exit_teams) {
2483 KA_TRACE(20, (
"__kmp_join_call: T#%d, old team = %p old task_team = %p, "
2484 "th_task_team = %p\n",
2485 __kmp_gtid_from_thread(master_th), team,
2486 team->t.t_task_team[master_th->th.th_task_state],
2487 master_th->th.th_task_team));
2488 KMP_DEBUG_ASSERT_TASKTEAM_INVARIANT(team, master_th);
2492 if (team->t.t_serialized) {
2493 if (master_th->th.th_teams_microtask) {
2495 int level = team->t.t_level;
2496 int tlevel = master_th->th.th_teams_level;
2497 if (level == tlevel) {
2501 }
else if (level == tlevel + 1) {
2505 team->t.t_serialized++;
2511 if (ompt_enabled.enabled) {
2512 if (fork_context == fork_context_gnu) {
2513 __ompt_lw_taskteam_unlink(master_th);
2515 __kmp_join_restore_state(master_th, parent_team);
2522 master_active = team->t.t_master_active;
2527 __kmp_internal_join(loc, gtid, team);
2529 if (__itt_stack_caller_create_ptr) {
2530 KMP_DEBUG_ASSERT(team->t.t_stack_id != NULL);
2532 __kmp_itt_stack_caller_destroy((__itt_caller)team->t.t_stack_id);
2533 team->t.t_stack_id = NULL;
2537 master_th->th.th_task_state =
2540 if (__itt_stack_caller_create_ptr && parent_team->t.t_serialized) {
2541 KMP_DEBUG_ASSERT(parent_team->t.t_stack_id != NULL);
2545 __kmp_itt_stack_caller_destroy((__itt_caller)parent_team->t.t_stack_id);
2546 parent_team->t.t_stack_id = NULL;
2554 ompt_data_t *parallel_data = &(team->t.ompt_team_info.parallel_data);
2555 void *codeptr = team->t.ompt_team_info.master_return_address;
2560 if (team->t.t_active_level == 1 &&
2561 (!master_th->th.th_teams_microtask ||
2562 master_th->th.th_teams_size.nteams == 1)) {
2563 master_th->th.th_ident = loc;
2566 if ((__itt_frame_submit_v3_ptr || KMP_ITT_DEBUG) &&
2567 __kmp_forkjoin_frames_mode == 3)
2568 __kmp_itt_frame_submit(gtid, team->t.t_region_time,
2569 master_th->th.th_frame_time, 0, loc,
2570 master_th->th.th_team_nproc, 1);
2571 else if ((__itt_frame_end_v3_ptr || KMP_ITT_DEBUG) &&
2572 !__kmp_forkjoin_frames_mode && __kmp_forkjoin_frames)
2573 __kmp_itt_region_joined(gtid);
2577#if KMP_AFFINITY_SUPPORTED
2580 master_th->th.th_first_place = team->t.t_first_place;
2581 master_th->th.th_last_place = team->t.t_last_place;
2585 if (master_th->th.th_teams_microtask && !exit_teams &&
2586 team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
2587 team->t.t_level == master_th->th.th_teams_level + 1) {
2592 ompt_data_t ompt_parallel_data = ompt_data_none;
2593 if (ompt_enabled.enabled) {
2594 ompt_task_info_t *task_info = __ompt_get_task_info_object(0);
2595 if (ompt_enabled.ompt_callback_implicit_task) {
2596 int ompt_team_size = team->t.t_nproc;
2597 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
2598 ompt_scope_end, NULL, &(task_info->task_data), ompt_team_size,
2599 OMPT_CUR_TASK_INFO(master_th)->thread_num, ompt_task_implicit);
2601 task_info->frame.exit_frame = ompt_data_none;
2602 task_info->task_data = ompt_data_none;
2603 ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th);
2604 __ompt_lw_taskteam_unlink(master_th);
2609 team->t.t_active_level--;
2610 KMP_ATOMIC_DEC(&root->r.r_in_parallel);
2616 if (master_th->th.th_team_nproc < master_th->th.th_teams_size.nth) {
2617 int old_num = master_th->th.th_team_nproc;
2618 int new_num = master_th->th.th_teams_size.nth;
2619 kmp_info_t **other_threads = team->t.t_threads;
2620 team->t.t_nproc = new_num;
2621 for (
int i = 0; i < old_num; ++i) {
2622 other_threads[i]->th.th_team_nproc = new_num;
2625 for (
int i = old_num; i < new_num; ++i) {
2627 KMP_DEBUG_ASSERT(other_threads[i]);
2628 kmp_balign_t *balign = other_threads[i]->th.th_bar;
2629 for (
int b = 0; b < bs_last_barrier; ++b) {
2630 balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
2631 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
2633 balign[b].bb.b_worker_arrived = team->t.t_bar[b].b_team_arrived;
2636 if (__kmp_tasking_mode != tskm_immediate_exec) {
2638 other_threads[i]->th.th_task_state = master_th->th.th_task_state;
2644 if (ompt_enabled.enabled) {
2645 __kmp_join_ompt(gtid, master_th, parent_team, &ompt_parallel_data,
2646 OMPT_INVOKER(fork_context) | ompt_parallel_team, codeptr);
2654 master_th->th.th_info.ds.ds_tid = team->t.t_master_tid;
2655 master_th->th.th_local.this_construct = team->t.t_master_this_cons;
2657 master_th->th.th_dispatch = &parent_team->t.t_dispatch[team->t.t_master_tid];
2662 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
2664 if (!master_th->th.th_teams_microtask ||
2665 team->t.t_level > master_th->th.th_teams_level) {
2667 KMP_ATOMIC_DEC(&root->r.r_in_parallel);
2669 KMP_DEBUG_ASSERT(root->r.r_in_parallel >= 0);
2672 if (ompt_enabled.enabled) {
2673 ompt_task_info_t *task_info = __ompt_get_task_info_object(0);
2674 if (ompt_enabled.ompt_callback_implicit_task) {
2675 int flags = (team_microtask == (
void *)__kmp_teams_master)
2677 : ompt_task_implicit;
2678 int ompt_team_size = (flags == ompt_task_initial) ? 0 : team->t.t_nproc;
2679 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
2680 ompt_scope_end, NULL, &(task_info->task_data), ompt_team_size,
2681 OMPT_CUR_TASK_INFO(master_th)->thread_num, flags);
2683 task_info->frame.exit_frame = ompt_data_none;
2684 task_info->task_data = ompt_data_none;
2688 KF_TRACE(10, (
"__kmp_join_call1: T#%d, this_thread=%p team=%p\n", 0,
2690 __kmp_pop_current_task_from_thread(master_th);
2692 master_th->th.th_def_allocator = team->t.t_def_allocator;
2695 if (ompd_state & OMPD_ENABLE_BP)
2696 ompd_bp_parallel_end();
2698 updateHWFPControl(team);
2700 if (root->r.r_active != master_active)
2701 root->r.r_active = master_active;
2703 __kmp_free_team(root, team, master_th);
2710 master_th->th.th_team = parent_team;
2711 master_th->th.th_team_nproc = parent_team->t.t_nproc;
2712 master_th->th.th_team_master = parent_team->t.t_threads[0];
2713 master_th->th.th_team_serialized = parent_team->t.t_serialized;
2716 if (parent_team->t.t_serialized &&
2717 parent_team != master_th->th.th_serial_team &&
2718 parent_team != root->r.r_root_team) {
2719 __kmp_free_team(root, master_th->th.th_serial_team, NULL);
2720 master_th->th.th_serial_team = parent_team;
2723 if (__kmp_tasking_mode != tskm_immediate_exec) {
2725 KMP_DEBUG_ASSERT(team->t.t_primary_task_state == 0 ||
2726 team->t.t_primary_task_state == 1);
2727 master_th->th.th_task_state = (kmp_uint8)team->t.t_primary_task_state;
2730 master_th->th.th_task_team =
2731 parent_team->t.t_task_team[master_th->th.th_task_state];
2733 (
"__kmp_join_call: Primary T#%d restoring task_team %p, team %p\n",
2734 __kmp_gtid_from_thread(master_th), master_th->th.th_task_team,
2741 master_th->th.th_current_task->td_flags.executing = 1;
2743 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
2745#if KMP_AFFINITY_SUPPORTED
2746 if (master_th->th.th_team->t.t_level == 0 && __kmp_affinity.flags.reset) {
2747 __kmp_reset_root_init_mask(gtid);
2752 OMPT_INVOKER(fork_context) |
2753 ((team_microtask == (
void *)__kmp_teams_master) ? ompt_parallel_league
2754 : ompt_parallel_team);
2755 if (ompt_enabled.enabled) {
2756 __kmp_join_ompt(gtid, master_th, parent_team, parallel_data, flags,
2762 KA_TRACE(20, (
"__kmp_join_call: exit T#%d\n", gtid));
2767void __kmp_save_internal_controls(kmp_info_t *thread) {
2769 if (thread->th.th_team != thread->th.th_serial_team) {
2772 if (thread->th.th_team->t.t_serialized > 1) {
2775 if (thread->th.th_team->t.t_control_stack_top == NULL) {
2778 if (thread->th.th_team->t.t_control_stack_top->serial_nesting_level !=
2779 thread->th.th_team->t.t_serialized) {
2784 kmp_internal_control_t *control =
2785 (kmp_internal_control_t *)__kmp_allocate(
2786 sizeof(kmp_internal_control_t));
2788 copy_icvs(control, &thread->th.th_current_task->td_icvs);
2790 control->serial_nesting_level = thread->th.th_team->t.t_serialized;
2792 control->next = thread->th.th_team->t.t_control_stack_top;
2793 thread->th.th_team->t.t_control_stack_top = control;
2799void __kmp_set_num_threads(
int new_nth,
int gtid) {
2803 KF_TRACE(10, (
"__kmp_set_num_threads: new __kmp_nth = %d\n", new_nth));
2804 KMP_DEBUG_ASSERT(__kmp_init_serial);
2808 else if (new_nth > __kmp_max_nth)
2809 new_nth = __kmp_max_nth;
2812 thread = __kmp_threads[gtid];
2813 if (thread->th.th_current_task->td_icvs.nproc == new_nth)
2816 __kmp_save_internal_controls(thread);
2818 set__nproc(thread, new_nth);
2823 root = thread->th.th_root;
2824 if (__kmp_init_parallel && (!root->r.r_active) &&
2825 (root->r.r_hot_team->t.t_nproc > new_nth) && __kmp_hot_teams_max_level &&
2826 !__kmp_hot_teams_mode) {
2827 kmp_team_t *hot_team = root->r.r_hot_team;
2830 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
2832 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
2833 __kmp_resize_dist_barrier(hot_team, hot_team->t.t_nproc, new_nth);
2836 for (f = new_nth; f < hot_team->t.t_nproc; f++) {
2837 KMP_DEBUG_ASSERT(hot_team->t.t_threads[f] != NULL);
2838 if (__kmp_tasking_mode != tskm_immediate_exec) {
2841 hot_team->t.t_threads[f]->th.th_task_team = NULL;
2843 __kmp_free_thread(hot_team->t.t_threads[f]);
2844 hot_team->t.t_threads[f] = NULL;
2846 hot_team->t.t_nproc = new_nth;
2847 if (thread->th.th_hot_teams) {
2848 KMP_DEBUG_ASSERT(hot_team == thread->th.th_hot_teams[0].hot_team);
2849 thread->th.th_hot_teams[0].hot_team_nth = new_nth;
2852 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
2853 hot_team->t.b->update_num_threads(new_nth);
2854 __kmp_add_threads_to_team(hot_team, new_nth);
2857 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
2860 for (f = 0; f < new_nth; f++) {
2861 KMP_DEBUG_ASSERT(hot_team->t.t_threads[f] != NULL);
2862 hot_team->t.t_threads[f]->th.th_team_nproc = new_nth;
2865 hot_team->t.t_size_changed = -1;
2870void __kmp_set_max_active_levels(
int gtid,
int max_active_levels) {
2873 KF_TRACE(10, (
"__kmp_set_max_active_levels: new max_active_levels for thread "
2875 gtid, max_active_levels));
2876 KMP_DEBUG_ASSERT(__kmp_init_serial);
2879 if (max_active_levels < 0) {
2880 KMP_WARNING(ActiveLevelsNegative, max_active_levels);
2885 KF_TRACE(10, (
"__kmp_set_max_active_levels: the call is ignored: new "
2886 "max_active_levels for thread %d = (%d)\n",
2887 gtid, max_active_levels));
2890 if (max_active_levels <= KMP_MAX_ACTIVE_LEVELS_LIMIT) {
2895 KMP_WARNING(ActiveLevelsExceedLimit, max_active_levels,
2896 KMP_MAX_ACTIVE_LEVELS_LIMIT);
2897 max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
2903 KF_TRACE(10, (
"__kmp_set_max_active_levels: after validation: new "
2904 "max_active_levels for thread %d = (%d)\n",
2905 gtid, max_active_levels));
2907 thread = __kmp_threads[gtid];
2909 __kmp_save_internal_controls(thread);
2911 set__max_active_levels(thread, max_active_levels);
2915int __kmp_get_max_active_levels(
int gtid) {
2918 KF_TRACE(10, (
"__kmp_get_max_active_levels: thread %d\n", gtid));
2919 KMP_DEBUG_ASSERT(__kmp_init_serial);
2921 thread = __kmp_threads[gtid];
2922 KMP_DEBUG_ASSERT(thread->th.th_current_task);
2923 KF_TRACE(10, (
"__kmp_get_max_active_levels: thread %d, curtask=%p, "
2924 "curtask_maxaclevel=%d\n",
2925 gtid, thread->th.th_current_task,
2926 thread->th.th_current_task->td_icvs.max_active_levels));
2927 return thread->th.th_current_task->td_icvs.max_active_levels;
2931void __kmp_set_num_teams(
int num_teams) {
2933 __kmp_nteams = num_teams;
2935int __kmp_get_max_teams(
void) {
return __kmp_nteams; }
2937void __kmp_set_teams_thread_limit(
int limit) {
2939 __kmp_teams_thread_limit = limit;
2941int __kmp_get_teams_thread_limit(
void) {
return __kmp_teams_thread_limit; }
2943KMP_BUILD_ASSERT(
sizeof(kmp_sched_t) ==
sizeof(
int));
2944KMP_BUILD_ASSERT(
sizeof(
enum sched_type) ==
sizeof(
int));
2947void __kmp_set_schedule(
int gtid, kmp_sched_t kind,
int chunk) {
2949 kmp_sched_t orig_kind;
2952 KF_TRACE(10, (
"__kmp_set_schedule: new schedule for thread %d = (%d, %d)\n",
2953 gtid, (
int)kind, chunk));
2954 KMP_DEBUG_ASSERT(__kmp_init_serial);
2961 kind = __kmp_sched_without_mods(kind);
2963 if (kind <= kmp_sched_lower || kind >= kmp_sched_upper ||
2964 (kind <= kmp_sched_lower_ext && kind >= kmp_sched_upper_std)) {
2966 __kmp_msg(kmp_ms_warning, KMP_MSG(ScheduleKindOutOfRange, kind),
2967 KMP_HNT(DefaultScheduleKindUsed,
"static, no chunk"),
2969 kind = kmp_sched_default;
2973 thread = __kmp_threads[gtid];
2975 __kmp_save_internal_controls(thread);
2977 if (kind < kmp_sched_upper_std) {
2978 if (kind == kmp_sched_static && chunk < KMP_DEFAULT_CHUNK) {
2981 thread->th.th_current_task->td_icvs.sched.r_sched_type =
kmp_sch_static;
2983 thread->th.th_current_task->td_icvs.sched.r_sched_type =
2984 __kmp_sch_map[kind - kmp_sched_lower - 1];
2989 thread->th.th_current_task->td_icvs.sched.r_sched_type =
2990 __kmp_sch_map[kind - kmp_sched_lower_ext + kmp_sched_upper_std -
2991 kmp_sched_lower - 2];
2993 __kmp_sched_apply_mods_intkind(
2994 orig_kind, &(thread->th.th_current_task->td_icvs.sched.r_sched_type));
2995 if (kind == kmp_sched_auto || chunk < 1) {
2997 thread->th.th_current_task->td_icvs.sched.chunk = KMP_DEFAULT_CHUNK;
2999 thread->th.th_current_task->td_icvs.sched.chunk = chunk;
3004void __kmp_get_schedule(
int gtid, kmp_sched_t *kind,
int *chunk) {
3008 KF_TRACE(10, (
"__kmp_get_schedule: thread %d\n", gtid));
3009 KMP_DEBUG_ASSERT(__kmp_init_serial);
3011 thread = __kmp_threads[gtid];
3013 th_type = thread->th.th_current_task->td_icvs.sched.r_sched_type;
3014 switch (SCHEDULE_WITHOUT_MODIFIERS(th_type)) {
3016 case kmp_sch_static_greedy:
3017 case kmp_sch_static_balanced:
3018 *kind = kmp_sched_static;
3019 __kmp_sched_apply_mods_stdkind(kind, th_type);
3022 case kmp_sch_static_chunked:
3023 *kind = kmp_sched_static;
3025 case kmp_sch_dynamic_chunked:
3026 *kind = kmp_sched_dynamic;
3029 case kmp_sch_guided_iterative_chunked:
3030 case kmp_sch_guided_analytical_chunked:
3031 *kind = kmp_sched_guided;
3034 *kind = kmp_sched_auto;
3036 case kmp_sch_trapezoidal:
3037 *kind = kmp_sched_trapezoidal;
3039#if KMP_STATIC_STEAL_ENABLED
3040 case kmp_sch_static_steal:
3041 *kind = kmp_sched_static_steal;
3045 KMP_FATAL(UnknownSchedulingType, th_type);
3048 __kmp_sched_apply_mods_stdkind(kind, th_type);
3049 *chunk = thread->th.th_current_task->td_icvs.sched.chunk;
3052int __kmp_get_ancestor_thread_num(
int gtid,
int level) {
3058 KF_TRACE(10, (
"__kmp_get_ancestor_thread_num: thread %d %d\n", gtid, level));
3059 KMP_DEBUG_ASSERT(__kmp_init_serial);
3066 thr = __kmp_threads[gtid];
3067 team = thr->th.th_team;
3068 ii = team->t.t_level;
3072 if (thr->th.th_teams_microtask) {
3074 int tlevel = thr->th.th_teams_level;
3077 KMP_DEBUG_ASSERT(ii >= tlevel);
3089 return __kmp_tid_from_gtid(gtid);
3091 dd = team->t.t_serialized;
3093 while (ii > level) {
3094 for (dd = team->t.t_serialized; (dd > 0) && (ii > level); dd--, ii--) {
3096 if ((team->t.t_serialized) && (!dd)) {
3097 team = team->t.t_parent;
3101 team = team->t.t_parent;
3102 dd = team->t.t_serialized;
3107 return (dd > 1) ? (0) : (team->t.t_master_tid);
3110int __kmp_get_team_size(
int gtid,
int level) {
3116 KF_TRACE(10, (
"__kmp_get_team_size: thread %d %d\n", gtid, level));
3117 KMP_DEBUG_ASSERT(__kmp_init_serial);
3124 thr = __kmp_threads[gtid];
3125 team = thr->th.th_team;
3126 ii = team->t.t_level;
3130 if (thr->th.th_teams_microtask) {
3132 int tlevel = thr->th.th_teams_level;
3135 KMP_DEBUG_ASSERT(ii >= tlevel);
3146 while (ii > level) {
3147 for (dd = team->t.t_serialized; (dd > 0) && (ii > level); dd--, ii--) {
3149 if (team->t.t_serialized && (!dd)) {
3150 team = team->t.t_parent;
3154 team = team->t.t_parent;
3159 return team->t.t_nproc;
3162kmp_r_sched_t __kmp_get_schedule_global() {
3167 kmp_r_sched_t r_sched;
3173 enum sched_type s = SCHEDULE_WITHOUT_MODIFIERS(__kmp_sched);
3174 enum sched_type sched_modifiers = SCHEDULE_GET_MODIFIERS(__kmp_sched);
3177 r_sched.r_sched_type = __kmp_static;
3180 r_sched.r_sched_type = __kmp_guided;
3182 r_sched.r_sched_type = __kmp_sched;
3184 SCHEDULE_SET_MODIFIERS(r_sched.r_sched_type, sched_modifiers);
3186 if (__kmp_chunk < KMP_DEFAULT_CHUNK) {
3188 r_sched.chunk = KMP_DEFAULT_CHUNK;
3190 r_sched.chunk = __kmp_chunk;
3198static void __kmp_alloc_argv_entries(
int argc, kmp_team_t *team,
int realloc) {
3200 KMP_DEBUG_ASSERT(team);
3201 if (!realloc || argc > team->t.t_max_argc) {
3203 KA_TRACE(100, (
"__kmp_alloc_argv_entries: team %d: needed entries=%d, "
3204 "current entries=%d\n",
3205 team->t.t_id, argc, (realloc) ? team->t.t_max_argc : 0));
3207 if (realloc && team->t.t_argv != &team->t.t_inline_argv[0])
3208 __kmp_free((
void *)team->t.t_argv);
3210 if (argc <= KMP_INLINE_ARGV_ENTRIES) {
3212 team->t.t_max_argc = KMP_INLINE_ARGV_ENTRIES;
3213 KA_TRACE(100, (
"__kmp_alloc_argv_entries: team %d: inline allocate %d "
3215 team->t.t_id, team->t.t_max_argc));
3216 team->t.t_argv = &team->t.t_inline_argv[0];
3217 if (__kmp_storage_map) {
3218 __kmp_print_storage_map_gtid(
3219 -1, &team->t.t_inline_argv[0],
3220 &team->t.t_inline_argv[KMP_INLINE_ARGV_ENTRIES],
3221 (
sizeof(
void *) * KMP_INLINE_ARGV_ENTRIES),
"team_%d.t_inline_argv",
3226 team->t.t_max_argc = (argc <= (KMP_MIN_MALLOC_ARGV_ENTRIES >> 1))
3227 ? KMP_MIN_MALLOC_ARGV_ENTRIES
3229 KA_TRACE(100, (
"__kmp_alloc_argv_entries: team %d: dynamic allocate %d "
3231 team->t.t_id, team->t.t_max_argc));
3233 (
void **)__kmp_page_allocate(
sizeof(
void *) * team->t.t_max_argc);
3234 if (__kmp_storage_map) {
3235 __kmp_print_storage_map_gtid(-1, &team->t.t_argv[0],
3236 &team->t.t_argv[team->t.t_max_argc],
3237 sizeof(
void *) * team->t.t_max_argc,
3238 "team_%d.t_argv", team->t.t_id);
3244static void __kmp_allocate_team_arrays(kmp_team_t *team,
int max_nth) {
3246 int num_disp_buff = max_nth > 1 ? __kmp_dispatch_num_buffers : 2;
3248 (kmp_info_t **)__kmp_allocate(
sizeof(kmp_info_t *) * max_nth);
3249 team->t.t_disp_buffer = (dispatch_shared_info_t *)__kmp_allocate(
3250 sizeof(dispatch_shared_info_t) * num_disp_buff);
3251 team->t.t_dispatch =
3252 (kmp_disp_t *)__kmp_allocate(
sizeof(kmp_disp_t) * max_nth);
3253 team->t.t_implicit_task_taskdata =
3254 (kmp_taskdata_t *)__kmp_allocate(
sizeof(kmp_taskdata_t) * max_nth);
3255 team->t.t_max_nproc = max_nth;
3258 for (i = 0; i < num_disp_buff; ++i) {
3259 team->t.t_disp_buffer[i].buffer_index = i;
3260 team->t.t_disp_buffer[i].doacross_buf_idx = i;
3264static void __kmp_free_team_arrays(kmp_team_t *team) {
3267 for (i = 0; i < team->t.t_max_nproc; ++i) {
3268 if (team->t.t_dispatch[i].th_disp_buffer != NULL) {
3269 __kmp_free(team->t.t_dispatch[i].th_disp_buffer);
3270 team->t.t_dispatch[i].th_disp_buffer = NULL;
3273#if KMP_USE_HIER_SCHED
3274 __kmp_dispatch_free_hierarchies(team);
3276 __kmp_free(team->t.t_threads);
3277 __kmp_free(team->t.t_disp_buffer);
3278 __kmp_free(team->t.t_dispatch);
3279 __kmp_free(team->t.t_implicit_task_taskdata);
3280 team->t.t_threads = NULL;
3281 team->t.t_disp_buffer = NULL;
3282 team->t.t_dispatch = NULL;
3283 team->t.t_implicit_task_taskdata = 0;
3286static void __kmp_reallocate_team_arrays(kmp_team_t *team,
int max_nth) {
3287 kmp_info_t **oldThreads = team->t.t_threads;
3289 __kmp_free(team->t.t_disp_buffer);
3290 __kmp_free(team->t.t_dispatch);
3291 __kmp_free(team->t.t_implicit_task_taskdata);
3292 __kmp_allocate_team_arrays(team, max_nth);
3294 KMP_MEMCPY(team->t.t_threads, oldThreads,
3295 team->t.t_nproc *
sizeof(kmp_info_t *));
3297 __kmp_free(oldThreads);
3300static kmp_internal_control_t __kmp_get_global_icvs(
void) {
3302 kmp_r_sched_t r_sched =
3303 __kmp_get_schedule_global();
3305 KMP_DEBUG_ASSERT(__kmp_nested_proc_bind.used > 0);
3307 kmp_internal_control_t g_icvs = {
3309 (kmp_int8)__kmp_global.g.g_dynamic,
3311 (kmp_int8)__kmp_env_blocktime,
3313 __kmp_dflt_blocktime,
3318 __kmp_dflt_team_nth,
3324 __kmp_dflt_max_active_levels,
3328 __kmp_nested_proc_bind.bind_types[0],
3329 __kmp_default_device,
3336static kmp_internal_control_t __kmp_get_x_global_icvs(
const kmp_team_t *team) {
3338 kmp_internal_control_t gx_icvs;
3339 gx_icvs.serial_nesting_level =
3341 copy_icvs(&gx_icvs, &team->t.t_threads[0]->th.th_current_task->td_icvs);
3342 gx_icvs.next = NULL;
3347static void __kmp_initialize_root(kmp_root_t *root) {
3349 kmp_team_t *root_team;
3350 kmp_team_t *hot_team;
3351 int hot_team_max_nth;
3352 kmp_r_sched_t r_sched =
3353 __kmp_get_schedule_global();
3354 kmp_internal_control_t r_icvs = __kmp_get_global_icvs();
3355 KMP_DEBUG_ASSERT(root);
3356 KMP_ASSERT(!root->r.r_begin);
3359 __kmp_init_lock(&root->r.r_begin_lock);
3360 root->r.r_begin = FALSE;
3361 root->r.r_active = FALSE;
3362 root->r.r_in_parallel = 0;
3363 root->r.r_blocktime = __kmp_dflt_blocktime;
3364#if KMP_AFFINITY_SUPPORTED
3365 root->r.r_affinity_assigned = FALSE;
3370 KF_TRACE(10, (
"__kmp_initialize_root: before root_team\n"));
3372 root_team = __kmp_allocate_team(root,
3378 __kmp_nested_proc_bind.bind_types[0], &r_icvs,
3385 TCW_SYNC_PTR(root_team->t.t_pkfn, (microtask_t)(~0));
3388 KF_TRACE(10, (
"__kmp_initialize_root: after root_team = %p\n", root_team));
3390 root->r.r_root_team = root_team;
3391 root_team->t.t_control_stack_top = NULL;
3394 root_team->t.t_threads[0] = NULL;
3395 root_team->t.t_nproc = 1;
3396 root_team->t.t_serialized = 1;
3398 root_team->t.t_sched.sched = r_sched.sched;
3399 root_team->t.t_nested_nth = &__kmp_nested_nth;
3402 (
"__kmp_initialize_root: init root team %d arrived: join=%u, plain=%u\n",
3403 root_team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE));
3407 KF_TRACE(10, (
"__kmp_initialize_root: before hot_team\n"));
3409 hot_team = __kmp_allocate_team(root,
3411 __kmp_dflt_team_nth_ub * 2,
3415 __kmp_nested_proc_bind.bind_types[0], &r_icvs,
3419 KF_TRACE(10, (
"__kmp_initialize_root: after hot_team = %p\n", hot_team));
3421 root->r.r_hot_team = hot_team;
3422 root_team->t.t_control_stack_top = NULL;
3425 hot_team->t.t_parent = root_team;
3428 hot_team_max_nth = hot_team->t.t_max_nproc;
3429 for (f = 0; f < hot_team_max_nth; ++f) {
3430 hot_team->t.t_threads[f] = NULL;
3432 hot_team->t.t_nproc = 1;
3434 hot_team->t.t_sched.sched = r_sched.sched;
3435 hot_team->t.t_size_changed = 0;
3436 hot_team->t.t_nested_nth = &__kmp_nested_nth;
3441typedef struct kmp_team_list_item {
3442 kmp_team_p
const *entry;
3443 struct kmp_team_list_item *next;
3444} kmp_team_list_item_t;
3445typedef kmp_team_list_item_t *kmp_team_list_t;
3447static void __kmp_print_structure_team_accum(
3448 kmp_team_list_t list,
3449 kmp_team_p
const *team
3459 KMP_DEBUG_ASSERT(list != NULL);
3464 __kmp_print_structure_team_accum(list, team->t.t_parent);
3465 __kmp_print_structure_team_accum(list, team->t.t_next_pool);
3469 while (l->next != NULL && l->entry != team) {
3472 if (l->next != NULL) {
3478 while (l->next != NULL && l->entry->t.t_id <= team->t.t_id) {
3484 kmp_team_list_item_t *item = (kmp_team_list_item_t *)KMP_INTERNAL_MALLOC(
3485 sizeof(kmp_team_list_item_t));
3492static void __kmp_print_structure_team(
char const *title, kmp_team_p
const *team
3495 __kmp_printf(
"%s", title);
3497 __kmp_printf(
"%2x %p\n", team->t.t_id, team);
3499 __kmp_printf(
" - (nil)\n");
3503static void __kmp_print_structure_thread(
char const *title,
3504 kmp_info_p
const *thread) {
3505 __kmp_printf(
"%s", title);
3506 if (thread != NULL) {
3507 __kmp_printf(
"%2d %p\n", thread->th.th_info.ds.ds_gtid, thread);
3509 __kmp_printf(
" - (nil)\n");
3513void __kmp_print_structure(
void) {
3515 kmp_team_list_t list;
3519 (kmp_team_list_item_t *)KMP_INTERNAL_MALLOC(
sizeof(kmp_team_list_item_t));
3523 __kmp_printf(
"\n------------------------------\nGlobal Thread "
3524 "Table\n------------------------------\n");
3527 for (gtid = 0; gtid < __kmp_threads_capacity; ++gtid) {
3528 __kmp_printf(
"%2d", gtid);
3529 if (__kmp_threads != NULL) {
3530 __kmp_printf(
" %p", __kmp_threads[gtid]);
3532 if (__kmp_root != NULL) {
3533 __kmp_printf(
" %p", __kmp_root[gtid]);
3540 __kmp_printf(
"\n------------------------------\nThreads\n--------------------"
3542 if (__kmp_threads != NULL) {
3544 for (gtid = 0; gtid < __kmp_threads_capacity; ++gtid) {
3545 kmp_info_t
const *thread = __kmp_threads[gtid];
3546 if (thread != NULL) {
3547 __kmp_printf(
"GTID %2d %p:\n", gtid, thread);
3548 __kmp_printf(
" Our Root: %p\n", thread->th.th_root);
3549 __kmp_print_structure_team(
" Our Team: ", thread->th.th_team);
3550 __kmp_print_structure_team(
" Serial Team: ",
3551 thread->th.th_serial_team);
3552 __kmp_printf(
" Threads: %2d\n", thread->th.th_team_nproc);
3553 __kmp_print_structure_thread(
" Primary: ",
3554 thread->th.th_team_master);
3555 __kmp_printf(
" Serialized?: %2d\n", thread->th.th_team_serialized);
3556 __kmp_printf(
" Set NProc: %2d\n", thread->th.th_set_nproc);
3557 __kmp_printf(
" Set Proc Bind: %2d\n", thread->th.th_set_proc_bind);
3558 __kmp_print_structure_thread(
" Next in pool: ",
3559 thread->th.th_next_pool);
3561 __kmp_print_structure_team_accum(list, thread->th.th_team);
3562 __kmp_print_structure_team_accum(list, thread->th.th_serial_team);
3566 __kmp_printf(
"Threads array is not allocated.\n");
3570 __kmp_printf(
"\n------------------------------\nUbers\n----------------------"
3572 if (__kmp_root != NULL) {
3574 for (gtid = 0; gtid < __kmp_threads_capacity; ++gtid) {
3575 kmp_root_t
const *root = __kmp_root[gtid];
3577 __kmp_printf(
"GTID %2d %p:\n", gtid, root);
3578 __kmp_print_structure_team(
" Root Team: ", root->r.r_root_team);
3579 __kmp_print_structure_team(
" Hot Team: ", root->r.r_hot_team);
3580 __kmp_print_structure_thread(
" Uber Thread: ",
3581 root->r.r_uber_thread);
3582 __kmp_printf(
" Active?: %2d\n", root->r.r_active);
3583 __kmp_printf(
" In Parallel: %2d\n",
3584 KMP_ATOMIC_LD_RLX(&root->r.r_in_parallel));
3586 __kmp_print_structure_team_accum(list, root->r.r_root_team);
3587 __kmp_print_structure_team_accum(list, root->r.r_hot_team);
3591 __kmp_printf(
"Ubers array is not allocated.\n");
3594 __kmp_printf(
"\n------------------------------\nTeams\n----------------------"
3596 while (list->next != NULL) {
3597 kmp_team_p
const *team = list->entry;
3599 __kmp_printf(
"Team %2x %p:\n", team->t.t_id, team);
3600 __kmp_print_structure_team(
" Parent Team: ", team->t.t_parent);
3601 __kmp_printf(
" Primary TID: %2d\n", team->t.t_master_tid);
3602 __kmp_printf(
" Max threads: %2d\n", team->t.t_max_nproc);
3603 __kmp_printf(
" Levels of serial: %2d\n", team->t.t_serialized);
3604 __kmp_printf(
" Number threads: %2d\n", team->t.t_nproc);
3605 for (i = 0; i < team->t.t_nproc; ++i) {
3606 __kmp_printf(
" Thread %2d: ", i);
3607 __kmp_print_structure_thread(
"", team->t.t_threads[i]);
3609 __kmp_print_structure_team(
" Next in pool: ", team->t.t_next_pool);
3615 __kmp_printf(
"\n------------------------------\nPools\n----------------------"
3617 __kmp_print_structure_thread(
"Thread pool: ",
3618 CCAST(kmp_info_t *, __kmp_thread_pool));
3619 __kmp_print_structure_team(
"Team pool: ",
3620 CCAST(kmp_team_t *, __kmp_team_pool));
3624 while (list != NULL) {
3625 kmp_team_list_item_t *item = list;
3627 KMP_INTERNAL_FREE(item);
3636static const unsigned __kmp_primes[] = {
3637 0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5, 0xba5703f5, 0xb495a877,
3638 0xe1626741, 0x79695e6b, 0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231,
3639 0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b, 0xbe4d6fe9, 0x5f15e201,
3640 0x99afc3fd, 0xf3f16801, 0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
3641 0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed, 0x085a3d61, 0x46eb5ea7,
3642 0x3d9910ed, 0x2e687b5b, 0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9,
3643 0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7, 0x54581edb, 0xf2480f45,
3644 0x0bb9288f, 0xef1affc7, 0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
3645 0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b, 0xfc411073, 0xc3749363,
3646 0xb892d829, 0x3549366b, 0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3,
3647 0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f};
3651unsigned short __kmp_get_random(kmp_info_t *thread) {
3652 unsigned x = thread->th.th_x;
3653 unsigned short r = (
unsigned short)(x >> 16);
3655 thread->th.th_x = x * thread->th.th_a + 1;
3657 KA_TRACE(30, (
"__kmp_get_random: THREAD: %d, RETURN: %u\n",
3658 thread->th.th_info.ds.ds_tid, r));
3664void __kmp_init_random(kmp_info_t *thread) {
3665 unsigned seed = thread->th.th_info.ds.ds_tid;
3668 __kmp_primes[seed % (
sizeof(__kmp_primes) /
sizeof(__kmp_primes[0]))];
3669 thread->th.th_x = (seed + 1) * thread->th.th_a + 1;
3671 (
"__kmp_init_random: THREAD: %u; A: %u\n", seed, thread->th.th_a));
3677static int __kmp_reclaim_dead_roots(
void) {
3680 for (i = 0; i < __kmp_threads_capacity; ++i) {
3681 if (KMP_UBER_GTID(i) &&
3682 !__kmp_still_running((kmp_info_t *)TCR_SYNC_PTR(__kmp_threads[i])) &&
3685 r += __kmp_unregister_root_other_thread(i);
3710static int __kmp_expand_threads(
int nNeed) {
3712 int minimumRequiredCapacity;
3714 kmp_info_t **newThreads;
3715 kmp_root_t **newRoot;
3721#if KMP_OS_WINDOWS && !KMP_DYNAMIC_LIB
3724 added = __kmp_reclaim_dead_roots();
3753 KMP_DEBUG_ASSERT(__kmp_sys_max_nth >= __kmp_threads_capacity);
3756 if (__kmp_sys_max_nth - __kmp_threads_capacity < nNeed) {
3760 minimumRequiredCapacity = __kmp_threads_capacity + nNeed;
3762 newCapacity = __kmp_threads_capacity;
3764 newCapacity = newCapacity <= (__kmp_sys_max_nth >> 1) ? (newCapacity << 1)
3765 : __kmp_sys_max_nth;
3766 }
while (newCapacity < minimumRequiredCapacity);
3767 newThreads = (kmp_info_t **)__kmp_allocate(
3768 (
sizeof(kmp_info_t *) +
sizeof(kmp_root_t *)) * newCapacity + CACHE_LINE);
3770 (kmp_root_t **)((
char *)newThreads +
sizeof(kmp_info_t *) * newCapacity);
3771 KMP_MEMCPY(newThreads, __kmp_threads,
3772 __kmp_threads_capacity *
sizeof(kmp_info_t *));
3773 KMP_MEMCPY(newRoot, __kmp_root,
3774 __kmp_threads_capacity *
sizeof(kmp_root_t *));
3777 kmp_old_threads_list_t *node =
3778 (kmp_old_threads_list_t *)__kmp_allocate(
sizeof(kmp_old_threads_list_t));
3779 node->threads = __kmp_threads;
3780 node->next = __kmp_old_threads_list;
3781 __kmp_old_threads_list = node;
3783 *(kmp_info_t * *
volatile *)&__kmp_threads = newThreads;
3784 *(kmp_root_t * *
volatile *)&__kmp_root = newRoot;
3785 added += newCapacity - __kmp_threads_capacity;
3786 *(
volatile int *)&__kmp_threads_capacity = newCapacity;
3788 if (newCapacity > __kmp_tp_capacity) {
3789 __kmp_acquire_bootstrap_lock(&__kmp_tp_cached_lock);
3790 if (__kmp_tp_cached && newCapacity > __kmp_tp_capacity) {
3791 __kmp_threadprivate_resize_cache(newCapacity);
3793 *(
volatile int *)&__kmp_tp_capacity = newCapacity;
3795 __kmp_release_bootstrap_lock(&__kmp_tp_cached_lock);
3804int __kmp_register_root(
int initial_thread) {
3805 kmp_info_t *root_thread;
3809 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
3810 KA_TRACE(20, (
"__kmp_register_root: entered\n"));
3827 capacity = __kmp_threads_capacity;
3828 if (!initial_thread && TCR_PTR(__kmp_threads[0]) == NULL) {
3835 if (__kmp_enable_hidden_helper && !TCR_4(__kmp_init_hidden_helper_threads)) {
3836 capacity -= __kmp_hidden_helper_threads_num;
3840 if (__kmp_all_nth >= capacity && !__kmp_expand_threads(1)) {
3841 if (__kmp_tp_cached) {
3842 __kmp_fatal(KMP_MSG(CantRegisterNewThread),
3843 KMP_HNT(Set_ALL_THREADPRIVATE, __kmp_tp_capacity),
3844 KMP_HNT(PossibleSystemLimitOnThreads), __kmp_msg_null);
3846 __kmp_fatal(KMP_MSG(CantRegisterNewThread), KMP_HNT(SystemLimitOnThreads),
3856 if (TCR_4(__kmp_init_hidden_helper_threads)) {
3859 for (gtid = 1; TCR_PTR(__kmp_threads[gtid]) != NULL &&
3860 gtid <= __kmp_hidden_helper_threads_num;
3863 KMP_ASSERT(gtid <= __kmp_hidden_helper_threads_num);
3864 KA_TRACE(1, (
"__kmp_register_root: found slot in threads array for "
3865 "hidden helper thread: T#%d\n",
3871 if (initial_thread && TCR_PTR(__kmp_threads[0]) == NULL) {
3874 for (gtid = __kmp_hidden_helper_threads_num + 1;
3875 TCR_PTR(__kmp_threads[gtid]) != NULL; gtid++)
3879 1, (
"__kmp_register_root: found slot in threads array: T#%d\n", gtid));
3880 KMP_ASSERT(gtid < __kmp_threads_capacity);
3885 TCW_4(__kmp_nth, __kmp_nth + 1);
3889 if (__kmp_adjust_gtid_mode) {
3890 if (__kmp_all_nth >= __kmp_tls_gtid_min) {
3891 if (TCR_4(__kmp_gtid_mode) != 2) {
3892 TCW_4(__kmp_gtid_mode, 2);
3895 if (TCR_4(__kmp_gtid_mode) != 1) {
3896 TCW_4(__kmp_gtid_mode, 1);
3901#ifdef KMP_ADJUST_BLOCKTIME
3904 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
3905 if (__kmp_nth > __kmp_avail_proc) {
3906 __kmp_zero_bt = TRUE;
3912 if (!(root = __kmp_root[gtid])) {
3913 root = __kmp_root[gtid] = (kmp_root_t *)__kmp_allocate(
sizeof(kmp_root_t));
3914 KMP_DEBUG_ASSERT(!root->r.r_root_team);
3917#if KMP_STATS_ENABLED
3919 __kmp_stats_thread_ptr = __kmp_stats_list->push_back(gtid);
3920 __kmp_stats_thread_ptr->startLife();
3921 KMP_SET_THREAD_STATE(SERIAL_REGION);
3924 __kmp_initialize_root(root);
3927 if (root->r.r_uber_thread) {
3928 root_thread = root->r.r_uber_thread;
3930 root_thread = (kmp_info_t *)__kmp_allocate(
sizeof(kmp_info_t));
3931 if (__kmp_storage_map) {
3932 __kmp_print_thread_storage_map(root_thread, gtid);
3934 root_thread->th.th_info.ds.ds_gtid = gtid;
3936 root_thread->th.ompt_thread_info.thread_data = ompt_data_none;
3938 root_thread->th.th_root = root;
3939 if (__kmp_env_consistency_check) {
3940 root_thread->th.th_cons = __kmp_allocate_cons_stack(gtid);
3943 __kmp_initialize_fast_memory(root_thread);
3947 KMP_DEBUG_ASSERT(root_thread->th.th_local.bget_data == NULL);
3948 __kmp_initialize_bget(root_thread);
3950 __kmp_init_random(root_thread);
3954 if (!root_thread->th.th_serial_team) {
3955 kmp_internal_control_t r_icvs = __kmp_get_global_icvs();
3956 KF_TRACE(10, (
"__kmp_register_root: before serial_team\n"));
3957 root_thread->th.th_serial_team =
3958 __kmp_allocate_team(root, 1, 1,
3962 proc_bind_default, &r_icvs, 0, NULL);
3964 KMP_ASSERT(root_thread->th.th_serial_team);
3965 KF_TRACE(10, (
"__kmp_register_root: after serial_team = %p\n",
3966 root_thread->th.th_serial_team));
3969 TCW_SYNC_PTR(__kmp_threads[gtid], root_thread);
3971 root->r.r_root_team->t.t_threads[0] = root_thread;
3972 root->r.r_hot_team->t.t_threads[0] = root_thread;
3973 root_thread->th.th_serial_team->t.t_threads[0] = root_thread;
3975 root_thread->th.th_serial_team->t.t_serialized = 0;
3976 root->r.r_uber_thread = root_thread;
3979 __kmp_initialize_info(root_thread, root->r.r_root_team, 0, gtid);
3980 TCW_4(__kmp_init_gtid, TRUE);
3983 __kmp_gtid_set_specific(gtid);
3986 __kmp_itt_thread_name(gtid);
3989#ifdef KMP_TDATA_GTID
3992 __kmp_create_worker(gtid, root_thread, __kmp_stksize);
3993 KMP_DEBUG_ASSERT(__kmp_gtid_get_specific() == gtid);
3995 KA_TRACE(20, (
"__kmp_register_root: T#%d init T#%d(%d:%d) arrived: join=%u, "
3997 gtid, __kmp_gtid_from_tid(0, root->r.r_hot_team),
3998 root->r.r_hot_team->t.t_id, 0, KMP_INIT_BARRIER_STATE,
3999 KMP_INIT_BARRIER_STATE));
4002 for (b = 0; b < bs_last_barrier; ++b) {
4003 root_thread->th.th_bar[b].bb.b_arrived = KMP_INIT_BARRIER_STATE;
4005 root_thread->th.th_bar[b].bb.b_worker_arrived = 0;
4009 KMP_DEBUG_ASSERT(root->r.r_hot_team->t.t_bar[bs_forkjoin_barrier].b_arrived ==
4010 KMP_INIT_BARRIER_STATE);
4012#if KMP_AFFINITY_SUPPORTED
4013 root_thread->th.th_current_place = KMP_PLACE_UNDEFINED;
4014 root_thread->th.th_new_place = KMP_PLACE_UNDEFINED;
4015 root_thread->th.th_first_place = KMP_PLACE_UNDEFINED;
4016 root_thread->th.th_last_place = KMP_PLACE_UNDEFINED;
4018 root_thread->th.th_def_allocator = __kmp_def_allocator;
4019 root_thread->th.th_prev_level = 0;
4020 root_thread->th.th_prev_num_threads = 1;
4022 kmp_cg_root_t *tmp = (kmp_cg_root_t *)__kmp_allocate(
sizeof(kmp_cg_root_t));
4023 tmp->cg_root = root_thread;
4024 tmp->cg_thread_limit = __kmp_cg_max_nth;
4025 tmp->cg_nthreads = 1;
4026 KA_TRACE(100, (
"__kmp_register_root: Thread %p created node %p with"
4027 " cg_nthreads init to 1\n",
4030 root_thread->th.th_cg_roots = tmp;
4032 __kmp_root_counter++;
4035 if (ompt_enabled.enabled) {
4037 kmp_info_t *root_thread = ompt_get_thread();
4039 ompt_set_thread_state(root_thread, ompt_state_overhead);
4041 if (ompt_enabled.ompt_callback_thread_begin) {
4042 ompt_callbacks.ompt_callback(ompt_callback_thread_begin)(
4043 ompt_thread_initial, __ompt_get_thread_data_internal());
4045 ompt_data_t *task_data;
4046 ompt_data_t *parallel_data;
4047 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, ¶llel_data,
4049 if (ompt_enabled.ompt_callback_implicit_task) {
4050 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
4051 ompt_scope_begin, parallel_data, task_data, 1, 1, ompt_task_initial);
4054 ompt_set_thread_state(root_thread, ompt_state_work_serial);
4058 if (ompd_state & OMPD_ENABLE_BP)
4059 ompd_bp_thread_begin();
4063 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
4068static int __kmp_free_hot_teams(kmp_root_t *root, kmp_info_t *thr,
int level,
4069 const int max_level) {
4071 kmp_hot_team_ptr_t *hot_teams = thr->th.th_hot_teams;
4072 if (!hot_teams || !hot_teams[level].hot_team) {
4075 KMP_DEBUG_ASSERT(level < max_level);
4076 kmp_team_t *team = hot_teams[level].hot_team;
4077 nth = hot_teams[level].hot_team_nth;
4079 if (level < max_level - 1) {
4080 for (i = 0; i < nth; ++i) {
4081 kmp_info_t *th = team->t.t_threads[i];
4082 n += __kmp_free_hot_teams(root, th, level + 1, max_level);
4083 if (i > 0 && th->th.th_hot_teams) {
4084 __kmp_free(th->th.th_hot_teams);
4085 th->th.th_hot_teams = NULL;
4089 __kmp_free_team(root, team, NULL);
4095static int __kmp_reset_root(
int gtid, kmp_root_t *root) {
4096 kmp_team_t *root_team = root->r.r_root_team;
4097 kmp_team_t *hot_team = root->r.r_hot_team;
4098 int n = hot_team->t.t_nproc;
4101 KMP_DEBUG_ASSERT(!root->r.r_active);
4103 root->r.r_root_team = NULL;
4104 root->r.r_hot_team = NULL;
4107 __kmp_free_team(root, root_team, NULL);
4108 if (__kmp_hot_teams_max_level >
4110 for (i = 0; i < hot_team->t.t_nproc; ++i) {
4111 kmp_info_t *th = hot_team->t.t_threads[i];
4112 if (__kmp_hot_teams_max_level > 1) {
4113 n += __kmp_free_hot_teams(root, th, 1, __kmp_hot_teams_max_level);
4115 if (th->th.th_hot_teams) {
4116 __kmp_free(th->th.th_hot_teams);
4117 th->th.th_hot_teams = NULL;
4121 __kmp_free_team(root, hot_team, NULL);
4126 if (__kmp_tasking_mode != tskm_immediate_exec) {
4127 __kmp_wait_to_unref_task_teams();
4133 10, (
"__kmp_reset_root: free handle, th = %p, handle = %" KMP_UINTPTR_SPEC
4135 (LPVOID) & (root->r.r_uber_thread->th),
4136 root->r.r_uber_thread->th.th_info.ds.ds_thread));
4137 __kmp_free_handle(root->r.r_uber_thread->th.th_info.ds.ds_thread);
4141 if (ompd_state & OMPD_ENABLE_BP)
4142 ompd_bp_thread_end();
4146 ompt_data_t *task_data;
4147 ompt_data_t *parallel_data;
4148 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, ¶llel_data,
4150 if (ompt_enabled.ompt_callback_implicit_task) {
4151 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
4152 ompt_scope_end, parallel_data, task_data, 0, 1, ompt_task_initial);
4154 if (ompt_enabled.ompt_callback_thread_end) {
4155 ompt_callbacks.ompt_callback(ompt_callback_thread_end)(
4156 &(root->r.r_uber_thread->th.ompt_thread_info.thread_data));
4162 i = root->r.r_uber_thread->th.th_cg_roots->cg_nthreads--;
4163 KA_TRACE(100, (
"__kmp_reset_root: Thread %p decrement cg_nthreads on node %p"
4165 root->r.r_uber_thread, root->r.r_uber_thread->th.th_cg_roots,
4166 root->r.r_uber_thread->th.th_cg_roots->cg_nthreads));
4169 KMP_DEBUG_ASSERT(root->r.r_uber_thread ==
4170 root->r.r_uber_thread->th.th_cg_roots->cg_root);
4171 KMP_DEBUG_ASSERT(root->r.r_uber_thread->th.th_cg_roots->up == NULL);
4172 __kmp_free(root->r.r_uber_thread->th.th_cg_roots);
4173 root->r.r_uber_thread->th.th_cg_roots = NULL;
4175 __kmp_reap_thread(root->r.r_uber_thread, 1);
4179 root->r.r_uber_thread = NULL;
4181 root->r.r_begin = FALSE;
4186void __kmp_unregister_root_current_thread(
int gtid) {
4187 KA_TRACE(1, (
"__kmp_unregister_root_current_thread: enter T#%d\n", gtid));
4191 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
4192 if (TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial) {
4193 KC_TRACE(10, (
"__kmp_unregister_root_current_thread: already finished, "
4196 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
4199 kmp_root_t *root = __kmp_root[gtid];
4201 KMP_DEBUG_ASSERT(__kmp_threads && __kmp_threads[gtid]);
4202 KMP_ASSERT(KMP_UBER_GTID(gtid));
4203 KMP_ASSERT(root == __kmp_threads[gtid]->th.th_root);
4204 KMP_ASSERT(root->r.r_active == FALSE);
4208 kmp_info_t *thread = __kmp_threads[gtid];
4209 kmp_team_t *team = thread->th.th_team;
4210 kmp_task_team_t *task_team = thread->th.th_task_team;
4213 if (task_team != NULL && (task_team->tt.tt_found_proxy_tasks ||
4214 task_team->tt.tt_hidden_helper_task_encountered)) {
4217 thread->th.ompt_thread_info.state = ompt_state_undefined;
4219 __kmp_task_team_wait(thread, team USE_ITT_BUILD_ARG(NULL));
4222 __kmp_reset_root(gtid, root);
4226 (
"__kmp_unregister_root_current_thread: T#%d unregistered\n", gtid));
4228 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
4235static int __kmp_unregister_root_other_thread(
int gtid) {
4236 kmp_root_t *root = __kmp_root[gtid];
4239 KA_TRACE(1, (
"__kmp_unregister_root_other_thread: enter T#%d\n", gtid));
4240 KMP_DEBUG_ASSERT(__kmp_threads && __kmp_threads[gtid]);
4241 KMP_ASSERT(KMP_UBER_GTID(gtid));
4242 KMP_ASSERT(root == __kmp_threads[gtid]->th.th_root);
4243 KMP_ASSERT(root->r.r_active == FALSE);
4245 r = __kmp_reset_root(gtid, root);
4247 (
"__kmp_unregister_root_other_thread: T#%d unregistered\n", gtid));
4253void __kmp_task_info() {
4255 kmp_int32 gtid = __kmp_entry_gtid();
4256 kmp_int32 tid = __kmp_tid_from_gtid(gtid);
4257 kmp_info_t *this_thr = __kmp_threads[gtid];
4258 kmp_team_t *steam = this_thr->th.th_serial_team;
4259 kmp_team_t *team = this_thr->th.th_team;
4262 "__kmp_task_info: gtid=%d tid=%d t_thread=%p team=%p steam=%p curtask=%p "
4264 gtid, tid, this_thr, team, steam, this_thr->th.th_current_task,
4265 team->t.t_implicit_task_taskdata[tid].td_parent);
4272static void __kmp_initialize_info(kmp_info_t *this_thr, kmp_team_t *team,
4273 int tid,
int gtid) {
4277 KMP_DEBUG_ASSERT(this_thr != NULL);
4278 KMP_DEBUG_ASSERT(this_thr->th.th_serial_team);
4279 KMP_DEBUG_ASSERT(team);
4280 KMP_DEBUG_ASSERT(team->t.t_threads);
4281 KMP_DEBUG_ASSERT(team->t.t_dispatch);
4282 kmp_info_t *master = team->t.t_threads[0];
4283 KMP_DEBUG_ASSERT(master);
4284 KMP_DEBUG_ASSERT(master->th.th_root);
4288 TCW_SYNC_PTR(this_thr->th.th_team, team);
4290 this_thr->th.th_info.ds.ds_tid = tid;
4291 this_thr->th.th_set_nproc = 0;
4292 if (__kmp_tasking_mode != tskm_immediate_exec)
4295 this_thr->th.th_reap_state = KMP_NOT_SAFE_TO_REAP;
4297 this_thr->th.th_reap_state = KMP_SAFE_TO_REAP;
4298 this_thr->th.th_set_proc_bind = proc_bind_default;
4300#if KMP_AFFINITY_SUPPORTED
4301 this_thr->th.th_new_place = this_thr->th.th_current_place;
4303 this_thr->th.th_root = master->th.th_root;
4306 this_thr->th.th_team_nproc = team->t.t_nproc;
4307 this_thr->th.th_team_master = master;
4308 this_thr->th.th_team_serialized = team->t.t_serialized;
4310 KMP_DEBUG_ASSERT(team->t.t_implicit_task_taskdata);
4312 KF_TRACE(10, (
"__kmp_initialize_info1: T#%d:%d this_thread=%p curtask=%p\n",
4313 tid, gtid, this_thr, this_thr->th.th_current_task));
4315 __kmp_init_implicit_task(this_thr->th.th_team_master->th.th_ident, this_thr,
4318 KF_TRACE(10, (
"__kmp_initialize_info2: T#%d:%d this_thread=%p curtask=%p\n",
4319 tid, gtid, this_thr, this_thr->th.th_current_task));
4324 this_thr->th.th_dispatch = &team->t.t_dispatch[tid];
4326 this_thr->th.th_local.this_construct = 0;
4328 if (!this_thr->th.th_pri_common) {
4329 this_thr->th.th_pri_common =
4330 (
struct common_table *)__kmp_allocate(
sizeof(
struct common_table));
4331 if (__kmp_storage_map) {
4332 __kmp_print_storage_map_gtid(
4333 gtid, this_thr->th.th_pri_common, this_thr->th.th_pri_common + 1,
4334 sizeof(
struct common_table),
"th_%d.th_pri_common\n", gtid);
4336 this_thr->th.th_pri_head = NULL;
4339 if (this_thr != master &&
4340 this_thr->th.th_cg_roots != master->th.th_cg_roots) {
4342 KMP_DEBUG_ASSERT(master->th.th_cg_roots);
4343 kmp_cg_root_t *tmp = this_thr->th.th_cg_roots;
4346 int i = tmp->cg_nthreads--;
4347 KA_TRACE(100, (
"__kmp_initialize_info: Thread %p decrement cg_nthreads"
4348 " on node %p of thread %p to %d\n",
4349 this_thr, tmp, tmp->cg_root, tmp->cg_nthreads));
4354 this_thr->th.th_cg_roots = master->th.th_cg_roots;
4356 this_thr->th.th_cg_roots->cg_nthreads++;
4357 KA_TRACE(100, (
"__kmp_initialize_info: Thread %p increment cg_nthreads on"
4358 " node %p of thread %p to %d\n",
4359 this_thr, this_thr->th.th_cg_roots,
4360 this_thr->th.th_cg_roots->cg_root,
4361 this_thr->th.th_cg_roots->cg_nthreads));
4362 this_thr->th.th_current_task->td_icvs.thread_limit =
4363 this_thr->th.th_cg_roots->cg_thread_limit;
4368 volatile kmp_disp_t *dispatch = this_thr->th.th_dispatch;
4371 sizeof(dispatch_private_info_t) *
4372 (team->t.t_max_nproc == 1 ? 1 : __kmp_dispatch_num_buffers);
4373 KD_TRACE(10, (
"__kmp_initialize_info: T#%d max_nproc: %d\n", gtid,
4374 team->t.t_max_nproc));
4375 KMP_ASSERT(dispatch);
4376 KMP_DEBUG_ASSERT(team->t.t_dispatch);
4377 KMP_DEBUG_ASSERT(dispatch == &team->t.t_dispatch[tid]);
4379 dispatch->th_disp_index = 0;
4380 dispatch->th_doacross_buf_idx = 0;
4381 if (!dispatch->th_disp_buffer) {
4382 dispatch->th_disp_buffer =
4383 (dispatch_private_info_t *)__kmp_allocate(disp_size);
4385 if (__kmp_storage_map) {
4386 __kmp_print_storage_map_gtid(
4387 gtid, &dispatch->th_disp_buffer[0],
4388 &dispatch->th_disp_buffer[team->t.t_max_nproc == 1
4390 : __kmp_dispatch_num_buffers],
4392 "th_%d.th_dispatch.th_disp_buffer "
4393 "(team_%d.t_dispatch[%d].th_disp_buffer)",
4394 gtid, team->t.t_id, gtid);
4397 memset(&dispatch->th_disp_buffer[0],
'\0', disp_size);
4400 dispatch->th_dispatch_pr_current = 0;
4401 dispatch->th_dispatch_sh_current = 0;
4403 dispatch->th_deo_fcn = 0;
4404 dispatch->th_dxo_fcn = 0;
4407 this_thr->th.th_next_pool = NULL;
4409 KMP_DEBUG_ASSERT(!this_thr->th.th_spin_here);
4410 KMP_DEBUG_ASSERT(this_thr->th.th_next_waiting == 0);
4420kmp_info_t *__kmp_allocate_thread(kmp_root_t *root, kmp_team_t *team,
4422 kmp_team_t *serial_team;
4423 kmp_info_t *new_thr;
4426 KA_TRACE(20, (
"__kmp_allocate_thread: T#%d\n", __kmp_get_gtid()));
4427 KMP_DEBUG_ASSERT(root && team);
4433 if (__kmp_thread_pool && !KMP_HIDDEN_HELPER_TEAM(team)) {
4434 new_thr = CCAST(kmp_info_t *, __kmp_thread_pool);
4435 __kmp_thread_pool = (
volatile kmp_info_t *)new_thr->th.th_next_pool;
4436 if (new_thr == __kmp_thread_pool_insert_pt) {
4437 __kmp_thread_pool_insert_pt = NULL;
4439 TCW_4(new_thr->th.th_in_pool, FALSE);
4440 __kmp_suspend_initialize_thread(new_thr);
4441 __kmp_lock_suspend_mx(new_thr);
4442 if (new_thr->th.th_active_in_pool == TRUE) {
4443 KMP_DEBUG_ASSERT(new_thr->th.th_active == TRUE);
4444 KMP_ATOMIC_DEC(&__kmp_thread_pool_active_nth);
4445 new_thr->th.th_active_in_pool = FALSE;
4447 __kmp_unlock_suspend_mx(new_thr);
4449 KA_TRACE(20, (
"__kmp_allocate_thread: T#%d using thread T#%d\n",
4450 __kmp_get_gtid(), new_thr->th.th_info.ds.ds_gtid));
4451 KMP_ASSERT(!new_thr->th.th_team);
4452 KMP_DEBUG_ASSERT(__kmp_nth < __kmp_threads_capacity);
4455 __kmp_initialize_info(new_thr, team, new_tid,
4456 new_thr->th.th_info.ds.ds_gtid);
4457 KMP_DEBUG_ASSERT(new_thr->th.th_serial_team);
4459 TCW_4(__kmp_nth, __kmp_nth + 1);
4461 new_thr->th.th_task_state = 0;
4463 if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
4465 KMP_DEBUG_ASSERT(new_thr->th.th_used_in_team.load() == 0);
4469#ifdef KMP_ADJUST_BLOCKTIME
4472 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
4473 if (__kmp_nth > __kmp_avail_proc) {
4474 __kmp_zero_bt = TRUE;
4483 kmp_balign_t *balign = new_thr->th.th_bar;
4484 for (b = 0; b < bs_last_barrier; ++b)
4485 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
4488 KF_TRACE(10, (
"__kmp_allocate_thread: T#%d using thread %p T#%d\n",
4489 __kmp_get_gtid(), new_thr, new_thr->th.th_info.ds.ds_gtid));
4496 KMP_ASSERT(KMP_HIDDEN_HELPER_TEAM(team) || __kmp_nth == __kmp_all_nth);
4497 KMP_ASSERT(__kmp_all_nth < __kmp_threads_capacity);
4502 if (!TCR_4(__kmp_init_monitor)) {
4503 __kmp_acquire_bootstrap_lock(&__kmp_monitor_lock);
4504 if (!TCR_4(__kmp_init_monitor)) {
4505 KF_TRACE(10, (
"before __kmp_create_monitor\n"));
4506 TCW_4(__kmp_init_monitor, 1);
4507 __kmp_create_monitor(&__kmp_monitor);
4508 KF_TRACE(10, (
"after __kmp_create_monitor\n"));
4519 while (TCR_4(__kmp_init_monitor) < 2) {
4522 KF_TRACE(10, (
"after monitor thread has started\n"));
4525 __kmp_release_bootstrap_lock(&__kmp_monitor_lock);
4532 int new_start_gtid = TCR_4(__kmp_init_hidden_helper_threads)
4534 : __kmp_hidden_helper_threads_num + 1;
4536 for (new_gtid = new_start_gtid; TCR_PTR(__kmp_threads[new_gtid]) != NULL;
4538 KMP_DEBUG_ASSERT(new_gtid < __kmp_threads_capacity);
4541 if (TCR_4(__kmp_init_hidden_helper_threads)) {
4542 KMP_DEBUG_ASSERT(new_gtid <= __kmp_hidden_helper_threads_num);
4547 new_thr = (kmp_info_t *)__kmp_allocate(
sizeof(kmp_info_t));
4549 new_thr->th.th_nt_strict =
false;
4550 new_thr->th.th_nt_loc = NULL;
4551 new_thr->th.th_nt_sev = severity_fatal;
4552 new_thr->th.th_nt_msg = NULL;
4554 TCW_SYNC_PTR(__kmp_threads[new_gtid], new_thr);
4556#if USE_ITT_BUILD && USE_ITT_NOTIFY && KMP_DEBUG
4559 __itt_suppress_mark_range(
4560 __itt_suppress_range, __itt_suppress_threading_errors,
4561 &new_thr->th.th_sleep_loc,
sizeof(new_thr->th.th_sleep_loc));
4562 __itt_suppress_mark_range(
4563 __itt_suppress_range, __itt_suppress_threading_errors,
4564 &new_thr->th.th_reap_state,
sizeof(new_thr->th.th_reap_state));
4566 __itt_suppress_mark_range(
4567 __itt_suppress_range, __itt_suppress_threading_errors,
4568 &new_thr->th.th_suspend_init,
sizeof(new_thr->th.th_suspend_init));
4570 __itt_suppress_mark_range(__itt_suppress_range,
4571 __itt_suppress_threading_errors,
4572 &new_thr->th.th_suspend_init_count,
4573 sizeof(new_thr->th.th_suspend_init_count));
4576 __itt_suppress_mark_range(__itt_suppress_range,
4577 __itt_suppress_threading_errors,
4578 CCAST(kmp_uint64 *, &new_thr->th.th_bar[0].bb.b_go),
4579 sizeof(new_thr->th.th_bar[0].bb.b_go));
4580 __itt_suppress_mark_range(__itt_suppress_range,
4581 __itt_suppress_threading_errors,
4582 CCAST(kmp_uint64 *, &new_thr->th.th_bar[1].bb.b_go),
4583 sizeof(new_thr->th.th_bar[1].bb.b_go));
4584 __itt_suppress_mark_range(__itt_suppress_range,
4585 __itt_suppress_threading_errors,
4586 CCAST(kmp_uint64 *, &new_thr->th.th_bar[2].bb.b_go),
4587 sizeof(new_thr->th.th_bar[2].bb.b_go));
4589 if (__kmp_storage_map) {
4590 __kmp_print_thread_storage_map(new_thr, new_gtid);
4595 kmp_internal_control_t r_icvs = __kmp_get_x_global_icvs(team);
4596 KF_TRACE(10, (
"__kmp_allocate_thread: before th_serial/serial_team\n"));
4597 new_thr->th.th_serial_team = serial_team =
4598 (kmp_team_t *)__kmp_allocate_team(root, 1, 1,
4602 proc_bind_default, &r_icvs, 0, NULL);
4604 KMP_ASSERT(serial_team);
4605 serial_team->t.t_serialized = 0;
4607 serial_team->t.t_threads[0] = new_thr;
4609 (
"__kmp_allocate_thread: after th_serial/serial_team : new_thr=%p\n",
4613 __kmp_initialize_info(new_thr, team, new_tid, new_gtid);
4616 __kmp_initialize_fast_memory(new_thr);
4620 KMP_DEBUG_ASSERT(new_thr->th.th_local.bget_data == NULL);
4621 __kmp_initialize_bget(new_thr);
4624 __kmp_init_random(new_thr);
4628 (
"__kmp_allocate_thread: T#%d init go fork=%u, plain=%u\n",
4629 __kmp_get_gtid(), KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE));
4632 kmp_balign_t *balign = new_thr->th.th_bar;
4633 for (b = 0; b < bs_last_barrier; ++b) {
4634 balign[b].bb.b_go = KMP_INIT_BARRIER_STATE;
4635 balign[b].bb.team = NULL;
4636 balign[b].bb.wait_flag = KMP_BARRIER_NOT_WAITING;
4637 balign[b].bb.use_oncore_barrier = 0;
4640 TCW_PTR(new_thr->th.th_sleep_loc, NULL);
4641 new_thr->th.th_sleep_loc_type = flag_unset;
4643 new_thr->th.th_spin_here = FALSE;
4644 new_thr->th.th_next_waiting = 0;
4646 new_thr->th.th_blocking =
false;
4649#if KMP_AFFINITY_SUPPORTED
4650 new_thr->th.th_current_place = KMP_PLACE_UNDEFINED;
4651 new_thr->th.th_new_place = KMP_PLACE_UNDEFINED;
4652 new_thr->th.th_first_place = KMP_PLACE_UNDEFINED;
4653 new_thr->th.th_last_place = KMP_PLACE_UNDEFINED;
4655 new_thr->th.th_def_allocator = __kmp_def_allocator;
4656 new_thr->th.th_prev_level = 0;
4657 new_thr->th.th_prev_num_threads = 1;
4659 TCW_4(new_thr->th.th_in_pool, FALSE);
4660 new_thr->th.th_active_in_pool = FALSE;
4661 TCW_4(new_thr->th.th_active, TRUE);
4663 new_thr->th.th_set_nested_nth = NULL;
4664 new_thr->th.th_set_nested_nth_sz = 0;
4672 if (__kmp_adjust_gtid_mode) {
4673 if (__kmp_all_nth >= __kmp_tls_gtid_min) {
4674 if (TCR_4(__kmp_gtid_mode) != 2) {
4675 TCW_4(__kmp_gtid_mode, 2);
4678 if (TCR_4(__kmp_gtid_mode) != 1) {
4679 TCW_4(__kmp_gtid_mode, 1);
4684#ifdef KMP_ADJUST_BLOCKTIME
4687 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
4688 if (__kmp_nth > __kmp_avail_proc) {
4689 __kmp_zero_bt = TRUE;
4694#if KMP_AFFINITY_SUPPORTED
4696 __kmp_affinity_set_init_mask(new_gtid, FALSE);
4701 10, (
"__kmp_allocate_thread: before __kmp_create_worker: %p\n", new_thr));
4702 __kmp_create_worker(new_gtid, new_thr, __kmp_stksize);
4704 (
"__kmp_allocate_thread: after __kmp_create_worker: %p\n", new_thr));
4706 KA_TRACE(20, (
"__kmp_allocate_thread: T#%d forked T#%d\n", __kmp_get_gtid(),
4717static void __kmp_reinitialize_team(kmp_team_t *team,
4718 kmp_internal_control_t *new_icvs,
4720 KF_TRACE(10, (
"__kmp_reinitialize_team: enter this_thread=%p team=%p\n",
4721 team->t.t_threads[0], team));
4722 KMP_DEBUG_ASSERT(team && new_icvs);
4723 KMP_DEBUG_ASSERT((!TCR_4(__kmp_init_parallel)) || new_icvs->nproc);
4724 KMP_CHECK_UPDATE(team->t.t_ident, loc);
4726 KMP_CHECK_UPDATE(team->t.t_id, KMP_GEN_TEAM_ID());
4728 __kmp_init_implicit_task(loc, team->t.t_threads[0], team, 0, FALSE);
4729 copy_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs);
4731 KF_TRACE(10, (
"__kmp_reinitialize_team: exit this_thread=%p team=%p\n",
4732 team->t.t_threads[0], team));
4738static void __kmp_initialize_team(kmp_team_t *team,
int new_nproc,
4739 kmp_internal_control_t *new_icvs,
4741 KF_TRACE(10, (
"__kmp_initialize_team: enter: team=%p\n", team));
4744 KMP_DEBUG_ASSERT(team);
4745 KMP_DEBUG_ASSERT(new_nproc <= team->t.t_max_nproc);
4746 KMP_DEBUG_ASSERT(team->t.t_threads);
4749 team->t.t_master_tid = 0;
4751 team->t.t_serialized = new_nproc > 1 ? 0 : 1;
4752 team->t.t_nproc = new_nproc;
4755 team->t.t_next_pool = NULL;
4759 TCW_SYNC_PTR(team->t.t_pkfn, NULL);
4760 team->t.t_invoke = NULL;
4763 team->t.t_sched.sched = new_icvs->sched.sched;
4765#if KMP_ARCH_X86 || KMP_ARCH_X86_64
4766 team->t.t_fp_control_saved = FALSE;
4767 team->t.t_x87_fpu_control_word = 0;
4768 team->t.t_mxcsr = 0;
4771 team->t.t_construct = 0;
4773 team->t.t_ordered.dt.t_value = 0;
4774 team->t.t_master_active = FALSE;
4777 team->t.t_copypriv_data = NULL;
4780 team->t.t_copyin_counter = 0;
4783 team->t.t_control_stack_top = NULL;
4785 __kmp_reinitialize_team(team, new_icvs, loc);
4788 KF_TRACE(10, (
"__kmp_initialize_team: exit: team=%p\n", team));
4791#if KMP_AFFINITY_SUPPORTED
4792static inline void __kmp_set_thread_place(kmp_team_t *team, kmp_info_t *th,
4793 int first,
int last,
int newp) {
4794 th->th.th_first_place = first;
4795 th->th.th_last_place = last;
4796 th->th.th_new_place = newp;
4797 if (newp != th->th.th_current_place) {
4798 if (__kmp_display_affinity && team->t.t_display_affinity != 1)
4799 team->t.t_display_affinity = 1;
4801 th->th.th_topology_ids = __kmp_affinity.ids[th->th.th_new_place];
4802 th->th.th_topology_attrs = __kmp_affinity.attrs[th->th.th_new_place];
4810static void __kmp_partition_places(kmp_team_t *team,
int update_master_only) {
4812 if (KMP_HIDDEN_HELPER_TEAM(team))
4815 kmp_info_t *master_th = team->t.t_threads[0];
4816 KMP_DEBUG_ASSERT(master_th != NULL);
4817 kmp_proc_bind_t proc_bind = team->t.t_proc_bind;
4818 int first_place = master_th->th.th_first_place;
4819 int last_place = master_th->th.th_last_place;
4820 int masters_place = master_th->th.th_current_place;
4821 int num_masks = __kmp_affinity.num_masks;
4822 team->t.t_first_place = first_place;
4823 team->t.t_last_place = last_place;
4825 KA_TRACE(20, (
"__kmp_partition_places: enter: proc_bind = %d T#%d(%d:0) "
4826 "bound to place %d partition = [%d,%d]\n",
4827 proc_bind, __kmp_gtid_from_thread(team->t.t_threads[0]),
4828 team->t.t_id, masters_place, first_place, last_place));
4830 switch (proc_bind) {
4832 case proc_bind_default:
4835 KMP_DEBUG_ASSERT(team->t.t_nproc == 1);
4838 case proc_bind_primary: {
4840 int n_th = team->t.t_nproc;
4841 for (f = 1; f < n_th; f++) {
4842 kmp_info_t *th = team->t.t_threads[f];
4843 KMP_DEBUG_ASSERT(th != NULL);
4844 __kmp_set_thread_place(team, th, first_place, last_place, masters_place);
4846 KA_TRACE(100, (
"__kmp_partition_places: primary: T#%d(%d:%d) place %d "
4847 "partition = [%d,%d]\n",
4848 __kmp_gtid_from_thread(team->t.t_threads[f]), team->t.t_id,
4849 f, masters_place, first_place, last_place));
4853 case proc_bind_close: {
4855 int n_th = team->t.t_nproc;
4857 if (first_place <= last_place) {
4858 n_places = last_place - first_place + 1;
4860 n_places = num_masks - first_place + last_place + 1;
4862 if (n_th <= n_places) {
4863 int place = masters_place;
4864 for (f = 1; f < n_th; f++) {
4865 kmp_info_t *th = team->t.t_threads[f];
4866 KMP_DEBUG_ASSERT(th != NULL);
4868 if (place == last_place) {
4869 place = first_place;
4870 }
else if (place == (num_masks - 1)) {
4875 __kmp_set_thread_place(team, th, first_place, last_place, place);
4877 KA_TRACE(100, (
"__kmp_partition_places: close: T#%d(%d:%d) place %d "
4878 "partition = [%d,%d]\n",
4879 __kmp_gtid_from_thread(team->t.t_threads[f]),
4880 team->t.t_id, f, place, first_place, last_place));
4883 int S, rem, gap, s_count;
4884 S = n_th / n_places;
4886 rem = n_th - (S * n_places);
4887 gap = rem > 0 ? n_places / rem : n_places;
4888 int place = masters_place;
4890 for (f = 0; f < n_th; f++) {
4891 kmp_info_t *th = team->t.t_threads[f];
4892 KMP_DEBUG_ASSERT(th != NULL);
4894 __kmp_set_thread_place(team, th, first_place, last_place, place);
4897 if ((s_count == S) && rem && (gap_ct == gap)) {
4899 }
else if ((s_count == S + 1) && rem && (gap_ct == gap)) {
4901 if (place == last_place) {
4902 place = first_place;
4903 }
else if (place == (num_masks - 1)) {
4911 }
else if (s_count == S) {
4912 if (place == last_place) {
4913 place = first_place;
4914 }
else if (place == (num_masks - 1)) {
4924 (
"__kmp_partition_places: close: T#%d(%d:%d) place %d "
4925 "partition = [%d,%d]\n",
4926 __kmp_gtid_from_thread(team->t.t_threads[f]), team->t.t_id, f,
4927 th->th.th_new_place, first_place, last_place));
4929 KMP_DEBUG_ASSERT(place == masters_place);
4933 case proc_bind_spread: {
4935 int n_th = team->t.t_nproc;
4938 if (first_place <= last_place) {
4939 n_places = last_place - first_place + 1;
4941 n_places = num_masks - first_place + last_place + 1;
4943 if (n_th <= n_places) {
4946 if (n_places != num_masks) {
4947 int S = n_places / n_th;
4948 int s_count, rem, gap, gap_ct;
4950 place = masters_place;
4951 rem = n_places - n_th * S;
4952 gap = rem ? n_th / rem : 1;
4955 if (update_master_only == 1)
4957 for (f = 0; f < thidx; f++) {
4958 kmp_info_t *th = team->t.t_threads[f];
4959 KMP_DEBUG_ASSERT(th != NULL);
4961 int fplace = place, nplace = place;
4963 while (s_count < S) {
4964 if (place == last_place) {
4965 place = first_place;
4966 }
else if (place == (num_masks - 1)) {
4973 if (rem && (gap_ct == gap)) {
4974 if (place == last_place) {
4975 place = first_place;
4976 }
else if (place == (num_masks - 1)) {
4984 __kmp_set_thread_place(team, th, fplace, place, nplace);
4987 if (place == last_place) {
4988 place = first_place;
4989 }
else if (place == (num_masks - 1)) {
4996 (
"__kmp_partition_places: spread: T#%d(%d:%d) place %d "
4997 "partition = [%d,%d], num_masks: %u\n",
4998 __kmp_gtid_from_thread(team->t.t_threads[f]), team->t.t_id,
4999 f, th->th.th_new_place, th->th.th_first_place,
5000 th->th.th_last_place, num_masks));
5006 double current =
static_cast<double>(masters_place);
5008 (
static_cast<double>(n_places + 1) /
static_cast<double>(n_th));
5013 if (update_master_only == 1)
5015 for (f = 0; f < thidx; f++) {
5016 first =
static_cast<int>(current);
5017 last =
static_cast<int>(current + spacing) - 1;
5018 KMP_DEBUG_ASSERT(last >= first);
5019 if (first >= n_places) {
5020 if (masters_place) {
5023 if (first == (masters_place + 1)) {
5024 KMP_DEBUG_ASSERT(f == n_th);
5027 if (last == masters_place) {
5028 KMP_DEBUG_ASSERT(f == (n_th - 1));
5032 KMP_DEBUG_ASSERT(f == n_th);
5037 if (last >= n_places) {
5038 last = (n_places - 1);
5043 KMP_DEBUG_ASSERT(0 <= first);
5044 KMP_DEBUG_ASSERT(n_places > first);
5045 KMP_DEBUG_ASSERT(0 <= last);
5046 KMP_DEBUG_ASSERT(n_places > last);
5047 KMP_DEBUG_ASSERT(last_place >= first_place);
5048 th = team->t.t_threads[f];
5049 KMP_DEBUG_ASSERT(th);
5050 __kmp_set_thread_place(team, th, first, last, place);
5052 (
"__kmp_partition_places: spread: T#%d(%d:%d) place %d "
5053 "partition = [%d,%d], spacing = %.4f\n",
5054 __kmp_gtid_from_thread(team->t.t_threads[f]),
5055 team->t.t_id, f, th->th.th_new_place,
5056 th->th.th_first_place, th->th.th_last_place, spacing));
5060 KMP_DEBUG_ASSERT(update_master_only || place == masters_place);
5062 int S, rem, gap, s_count;
5063 S = n_th / n_places;
5065 rem = n_th - (S * n_places);
5066 gap = rem > 0 ? n_places / rem : n_places;
5067 int place = masters_place;
5070 if (update_master_only == 1)
5072 for (f = 0; f < thidx; f++) {
5073 kmp_info_t *th = team->t.t_threads[f];
5074 KMP_DEBUG_ASSERT(th != NULL);
5076 __kmp_set_thread_place(team, th, place, place, place);
5079 if ((s_count == S) && rem && (gap_ct == gap)) {
5081 }
else if ((s_count == S + 1) && rem && (gap_ct == gap)) {
5083 if (place == last_place) {
5084 place = first_place;
5085 }
else if (place == (num_masks - 1)) {
5093 }
else if (s_count == S) {
5094 if (place == last_place) {
5095 place = first_place;
5096 }
else if (place == (num_masks - 1)) {
5105 KA_TRACE(100, (
"__kmp_partition_places: spread: T#%d(%d:%d) place %d "
5106 "partition = [%d,%d]\n",
5107 __kmp_gtid_from_thread(team->t.t_threads[f]),
5108 team->t.t_id, f, th->th.th_new_place,
5109 th->th.th_first_place, th->th.th_last_place));
5111 KMP_DEBUG_ASSERT(update_master_only || place == masters_place);
5119 KA_TRACE(20, (
"__kmp_partition_places: exit T#%d\n", team->t.t_id));
5126kmp_team_t *__kmp_allocate_team(kmp_root_t *root,
int new_nproc,
int max_nproc,
5128 ompt_data_t ompt_parallel_data,
5130 kmp_proc_bind_t new_proc_bind,
5131 kmp_internal_control_t *new_icvs,
int argc,
5132 kmp_info_t *master) {
5133 KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(KMP_allocate_team);
5136 int use_hot_team = !root->r.r_active;
5138 int do_place_partition = 1;
5140 KA_TRACE(20, (
"__kmp_allocate_team: called\n"));
5141 KMP_DEBUG_ASSERT(new_nproc >= 1 && argc >= 0);
5142 KMP_DEBUG_ASSERT(max_nproc >= new_nproc);
5145 kmp_hot_team_ptr_t *hot_teams;
5147 team = master->th.th_team;
5148 level = team->t.t_active_level;
5149 if (master->th.th_teams_microtask) {
5150 if (master->th.th_teams_size.nteams > 1 &&
5153 (microtask_t)__kmp_teams_master ||
5154 master->th.th_teams_level <
5161 if ((master->th.th_teams_size.nteams == 1 &&
5162 master->th.th_teams_level >= team->t.t_level) ||
5163 (team->t.t_pkfn == (microtask_t)__kmp_teams_master))
5164 do_place_partition = 0;
5166 hot_teams = master->th.th_hot_teams;
5167 if (level < __kmp_hot_teams_max_level && hot_teams &&
5168 hot_teams[level].hot_team) {
5176 KMP_DEBUG_ASSERT(new_nproc == 1);
5179 if (use_hot_team && new_nproc > 1) {
5180 KMP_DEBUG_ASSERT(new_nproc <= max_nproc);
5181 team = hot_teams[level].hot_team;
5183 if (__kmp_tasking_mode != tskm_immediate_exec) {
5184 KA_TRACE(20, (
"__kmp_allocate_team: hot team task_team[0] = %p "
5185 "task_team[1] = %p before reinit\n",
5186 team->t.t_task_team[0], team->t.t_task_team[1]));
5190 if (team->t.t_nproc != new_nproc &&
5191 __kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5193 int old_nthr = team->t.t_nproc;
5194 __kmp_resize_dist_barrier(team, old_nthr, new_nproc);
5199 if (do_place_partition == 0)
5200 team->t.t_proc_bind = proc_bind_default;
5204 if (team->t.t_nproc == new_nproc) {
5205 KA_TRACE(20, (
"__kmp_allocate_team: reusing hot team\n"));
5208 if (team->t.t_size_changed == -1) {
5209 team->t.t_size_changed = 1;
5211 KMP_CHECK_UPDATE(team->t.t_size_changed, 0);
5215 kmp_r_sched_t new_sched = new_icvs->sched;
5217 KMP_CHECK_UPDATE(team->t.t_sched.sched, new_sched.sched);
5219 __kmp_reinitialize_team(team, new_icvs,
5220 root->r.r_uber_thread->th.th_ident);
5222 KF_TRACE(10, (
"__kmp_allocate_team2: T#%d, this_thread=%p team=%p\n", 0,
5223 team->t.t_threads[0], team));
5224 __kmp_push_current_task_to_thread(team->t.t_threads[0], team, 0);
5226#if KMP_AFFINITY_SUPPORTED
5227 if ((team->t.t_size_changed == 0) &&
5228 (team->t.t_proc_bind == new_proc_bind)) {
5229 if (new_proc_bind == proc_bind_spread) {
5230 if (do_place_partition) {
5232 __kmp_partition_places(team, 1);
5235 KA_TRACE(200, (
"__kmp_allocate_team: reusing hot team #%d bindings: "
5236 "proc_bind = %d, partition = [%d,%d]\n",
5237 team->t.t_id, new_proc_bind, team->t.t_first_place,
5238 team->t.t_last_place));
5240 if (do_place_partition) {
5241 KMP_CHECK_UPDATE(team->t.t_proc_bind, new_proc_bind);
5242 __kmp_partition_places(team);
5246 KMP_CHECK_UPDATE(team->t.t_proc_bind, new_proc_bind);
5248 }
else if (team->t.t_nproc > new_nproc) {
5250 (
"__kmp_allocate_team: decreasing hot team thread count to %d\n",
5253 team->t.t_size_changed = 1;
5254 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5257 __kmp_add_threads_to_team(team, new_nproc);
5261 if (__kmp_tasking_mode != tskm_immediate_exec) {
5262 for (f = new_nproc; f < team->t.t_nproc; f++) {
5263 kmp_info_t *th = team->t.t_threads[f];
5264 KMP_DEBUG_ASSERT(th);
5265 th->th.th_task_team = NULL;
5268 if (__kmp_hot_teams_mode == 0) {
5271 KMP_DEBUG_ASSERT(hot_teams[level].hot_team_nth == team->t.t_nproc);
5272 hot_teams[level].hot_team_nth = new_nproc;
5274 for (f = new_nproc; f < team->t.t_nproc; f++) {
5275 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
5276 __kmp_free_thread(team->t.t_threads[f]);
5277 team->t.t_threads[f] = NULL;
5283 for (f = new_nproc; f < team->t.t_nproc; ++f) {
5284 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
5285 kmp_balign_t *balign = team->t.t_threads[f]->th.th_bar;
5286 for (
int b = 0; b < bs_last_barrier; ++b) {
5287 if (balign[b].bb.wait_flag == KMP_BARRIER_PARENT_FLAG) {
5288 balign[b].bb.wait_flag = KMP_BARRIER_SWITCH_TO_OWN_FLAG;
5290 KMP_CHECK_UPDATE(balign[b].bb.leaf_kids, 0);
5294 team->t.t_nproc = new_nproc;
5296 KMP_CHECK_UPDATE(team->t.t_sched.sched, new_icvs->sched.sched);
5297 __kmp_reinitialize_team(team, new_icvs,
5298 root->r.r_uber_thread->th.th_ident);
5301 for (f = 0; f < new_nproc; ++f) {
5302 team->t.t_threads[f]->th.th_team_nproc = new_nproc;
5307 KF_TRACE(10, (
"__kmp_allocate_team: T#%d, this_thread=%p team=%p\n", 0,
5308 team->t.t_threads[0], team));
5310 __kmp_push_current_task_to_thread(team->t.t_threads[0], team, 0);
5313 for (f = 0; f < team->t.t_nproc; f++) {
5314 KMP_DEBUG_ASSERT(team->t.t_threads[f] &&
5315 team->t.t_threads[f]->th.th_team_nproc ==
5320 if (do_place_partition) {
5321 KMP_CHECK_UPDATE(team->t.t_proc_bind, new_proc_bind);
5322#if KMP_AFFINITY_SUPPORTED
5323 __kmp_partition_places(team);
5329 (
"__kmp_allocate_team: increasing hot team thread count to %d\n",
5331 int old_nproc = team->t.t_nproc;
5332 team->t.t_size_changed = 1;
5334 int avail_threads = hot_teams[level].hot_team_nth;
5335 if (new_nproc < avail_threads)
5336 avail_threads = new_nproc;
5337 kmp_info_t **other_threads = team->t.t_threads;
5338 for (f = team->t.t_nproc; f < avail_threads; ++f) {
5342 kmp_balign_t *balign = other_threads[f]->th.th_bar;
5343 for (b = 0; b < bs_last_barrier; ++b) {
5344 balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
5345 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
5347 balign[b].bb.b_worker_arrived = team->t.t_bar[b].b_team_arrived;
5351 if (hot_teams[level].hot_team_nth >= new_nproc) {
5354 KMP_DEBUG_ASSERT(__kmp_hot_teams_mode == 1);
5355 team->t.t_nproc = new_nproc;
5359 team->t.t_nproc = hot_teams[level].hot_team_nth;
5360 hot_teams[level].hot_team_nth = new_nproc;
5361 if (team->t.t_max_nproc < new_nproc) {
5363 __kmp_reallocate_team_arrays(team, new_nproc);
5364 __kmp_reinitialize_team(team, new_icvs, NULL);
5367#if (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY) && \
5368 KMP_AFFINITY_SUPPORTED
5374 kmp_affinity_raii_t new_temp_affinity{__kmp_affin_fullMask};
5378 for (f = team->t.t_nproc; f < new_nproc; f++) {
5379 kmp_info_t *new_worker = __kmp_allocate_thread(root, team, f);
5380 KMP_DEBUG_ASSERT(new_worker);
5381 team->t.t_threads[f] = new_worker;
5384 (
"__kmp_allocate_team: team %d init T#%d arrived: "
5385 "join=%llu, plain=%llu\n",
5386 team->t.t_id, __kmp_gtid_from_tid(f, team), team->t.t_id, f,
5387 team->t.t_bar[bs_forkjoin_barrier].b_arrived,
5388 team->t.t_bar[bs_plain_barrier].b_arrived));
5392 kmp_balign_t *balign = new_worker->th.th_bar;
5393 for (b = 0; b < bs_last_barrier; ++b) {
5394 balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
5395 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag !=
5396 KMP_BARRIER_PARENT_FLAG);
5398 balign[b].bb.b_worker_arrived = team->t.t_bar[b].b_team_arrived;
5404#if (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY) && \
5405 KMP_AFFINITY_SUPPORTED
5407 new_temp_affinity.restore();
5410 if (__kmp_barrier_release_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5413 __kmp_add_threads_to_team(team, new_nproc);
5417 __kmp_initialize_team(team, new_nproc, new_icvs,
5418 root->r.r_uber_thread->th.th_ident);
5421 KMP_DEBUG_ASSERT(team->t.t_nproc == new_nproc);
5422 for (f = 0; f < team->t.t_nproc; ++f)
5423 __kmp_initialize_info(team->t.t_threads[f], team, f,
5424 __kmp_gtid_from_tid(f, team));
5427 kmp_uint8 old_state = team->t.t_threads[old_nproc - 1]->th.th_task_state;
5428 for (f = old_nproc; f < team->t.t_nproc; ++f)
5429 team->t.t_threads[f]->th.th_task_state = old_state;
5432 for (f = 0; f < team->t.t_nproc; ++f) {
5433 KMP_DEBUG_ASSERT(team->t.t_threads[f] &&
5434 team->t.t_threads[f]->th.th_team_nproc ==
5439 if (do_place_partition) {
5440 KMP_CHECK_UPDATE(team->t.t_proc_bind, new_proc_bind);
5441#if KMP_AFFINITY_SUPPORTED
5442 __kmp_partition_places(team);
5447 if (master->th.th_teams_microtask) {
5448 for (f = 1; f < new_nproc; ++f) {
5450 kmp_info_t *thr = team->t.t_threads[f];
5451 thr->th.th_teams_microtask = master->th.th_teams_microtask;
5452 thr->th.th_teams_level = master->th.th_teams_level;
5453 thr->th.th_teams_size = master->th.th_teams_size;
5459 for (f = 1; f < new_nproc; ++f) {
5460 kmp_info_t *thr = team->t.t_threads[f];
5462 kmp_balign_t *balign = thr->th.th_bar;
5463 for (b = 0; b < bs_last_barrier; ++b) {
5464 balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
5465 KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
5467 balign[b].bb.b_worker_arrived = team->t.t_bar[b].b_team_arrived;
5474 __kmp_alloc_argv_entries(argc, team, TRUE);
5475 KMP_CHECK_UPDATE(team->t.t_argc, argc);
5479 KF_TRACE(10, (
" hot_team = %p\n", team));
5482 if (__kmp_tasking_mode != tskm_immediate_exec) {
5483 KA_TRACE(20, (
"__kmp_allocate_team: hot team task_team[0] = %p "
5484 "task_team[1] = %p after reinit\n",
5485 team->t.t_task_team[0], team->t.t_task_team[1]));
5490 __ompt_team_assign_id(team, ompt_parallel_data);
5500 for (team = CCAST(kmp_team_t *, __kmp_team_pool); (team);) {
5503 if (team->t.t_max_nproc >= max_nproc) {
5505 __kmp_team_pool = team->t.t_next_pool;
5507 if (max_nproc > 1 &&
5508 __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5510 team->t.b = distributedBarrier::allocate(__kmp_dflt_team_nth_ub);
5515 __kmp_initialize_team(team, new_nproc, new_icvs, NULL);
5517 KA_TRACE(20, (
"__kmp_allocate_team: setting task_team[0] %p and "
5518 "task_team[1] %p to NULL\n",
5519 &team->t.t_task_team[0], &team->t.t_task_team[1]));
5520 team->t.t_task_team[0] = NULL;
5521 team->t.t_task_team[1] = NULL;
5524 __kmp_alloc_argv_entries(argc, team, TRUE);
5525 KMP_CHECK_UPDATE(team->t.t_argc, argc);
5528 20, (
"__kmp_allocate_team: team %d init arrived: join=%u, plain=%u\n",
5529 team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE));
5532 for (b = 0; b < bs_last_barrier; ++b) {
5533 team->t.t_bar[b].b_arrived = KMP_INIT_BARRIER_STATE;
5535 team->t.t_bar[b].b_master_arrived = 0;
5536 team->t.t_bar[b].b_team_arrived = 0;
5541 team->t.t_proc_bind = new_proc_bind;
5543 KA_TRACE(20, (
"__kmp_allocate_team: using team from pool %d.\n",
5547 __ompt_team_assign_id(team, ompt_parallel_data);
5550 team->t.t_nested_nth = NULL;
5561 team = __kmp_reap_team(team);
5562 __kmp_team_pool = team;
5567 team = (kmp_team_t *)__kmp_allocate(
sizeof(kmp_team_t));
5570 team->t.t_max_nproc = max_nproc;
5571 if (max_nproc > 1 &&
5572 __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5574 team->t.b = distributedBarrier::allocate(__kmp_dflt_team_nth_ub);
5579 __kmp_allocate_team_arrays(team, max_nproc);
5581 KA_TRACE(20, (
"__kmp_allocate_team: making a new team\n"));
5582 __kmp_initialize_team(team, new_nproc, new_icvs, NULL);
5584 KA_TRACE(20, (
"__kmp_allocate_team: setting task_team[0] %p and task_team[1] "
5586 &team->t.t_task_team[0], &team->t.t_task_team[1]));
5587 team->t.t_task_team[0] = NULL;
5589 team->t.t_task_team[1] = NULL;
5592 if (__kmp_storage_map) {
5593 __kmp_print_team_storage_map(
"team", team, team->t.t_id, new_nproc);
5597 __kmp_alloc_argv_entries(argc, team, FALSE);
5598 team->t.t_argc = argc;
5601 (
"__kmp_allocate_team: team %d init arrived: join=%u, plain=%u\n",
5602 team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE));
5605 for (b = 0; b < bs_last_barrier; ++b) {
5606 team->t.t_bar[b].b_arrived = KMP_INIT_BARRIER_STATE;
5608 team->t.t_bar[b].b_master_arrived = 0;
5609 team->t.t_bar[b].b_team_arrived = 0;
5614 team->t.t_proc_bind = new_proc_bind;
5617 __ompt_team_assign_id(team, ompt_parallel_data);
5618 team->t.ompt_serialized_team_info = NULL;
5623 team->t.t_nested_nth = NULL;
5625 KA_TRACE(20, (
"__kmp_allocate_team: done creating a new team %d.\n",
5636void __kmp_free_team(kmp_root_t *root, kmp_team_t *team, kmp_info_t *master) {
5638 KA_TRACE(20, (
"__kmp_free_team: T#%d freeing team %d\n", __kmp_get_gtid(),
5642 KMP_DEBUG_ASSERT(root);
5643 KMP_DEBUG_ASSERT(team);
5644 KMP_DEBUG_ASSERT(team->t.t_nproc <= team->t.t_max_nproc);
5645 KMP_DEBUG_ASSERT(team->t.t_threads);
5647 int use_hot_team = team == root->r.r_hot_team;
5650 level = team->t.t_active_level - 1;
5651 if (master->th.th_teams_microtask) {
5652 if (master->th.th_teams_size.nteams > 1) {
5656 if (team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
5657 master->th.th_teams_level == team->t.t_level) {
5663 kmp_hot_team_ptr_t *hot_teams = master->th.th_hot_teams;
5665 if (level < __kmp_hot_teams_max_level) {
5666 KMP_DEBUG_ASSERT(team == hot_teams[level].hot_team);
5672 TCW_SYNC_PTR(team->t.t_pkfn,
5675 team->t.t_copyin_counter = 0;
5680 if (!use_hot_team) {
5681 if (__kmp_tasking_mode != tskm_immediate_exec) {
5683 for (f = 1; f < team->t.t_nproc; ++f) {
5684 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
5685 kmp_info_t *th = team->t.t_threads[f];
5686 volatile kmp_uint32 *state = &th->th.th_reap_state;
5687 while (*state != KMP_SAFE_TO_REAP) {
5691 if (!__kmp_is_thread_alive(th, &ecode)) {
5692 *state = KMP_SAFE_TO_REAP;
5697 if (th->th.th_sleep_loc)
5698 __kmp_null_resume_wrapper(th);
5705 for (tt_idx = 0; tt_idx < 2; ++tt_idx) {
5706 kmp_task_team_t *task_team = team->t.t_task_team[tt_idx];
5707 if (task_team != NULL) {
5708 for (f = 0; f < team->t.t_nproc; ++f) {
5709 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
5710 team->t.t_threads[f]->th.th_task_team = NULL;
5714 (
"__kmp_free_team: T#%d deactivating task_team %p on team %d\n",
5715 __kmp_get_gtid(), task_team, team->t.t_id));
5716 __kmp_free_task_team(master, task_team);
5717 team->t.t_task_team[tt_idx] = NULL;
5723 if (team->t.t_nested_nth && team->t.t_nested_nth != &__kmp_nested_nth &&
5724 team->t.t_nested_nth != team->t.t_parent->t.t_nested_nth) {
5725 KMP_INTERNAL_FREE(team->t.t_nested_nth->nth);
5726 KMP_INTERNAL_FREE(team->t.t_nested_nth);
5728 team->t.t_nested_nth = NULL;
5731 team->t.t_parent = NULL;
5732 team->t.t_level = 0;
5733 team->t.t_active_level = 0;
5736 for (f = 1; f < team->t.t_nproc; ++f) {
5737 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
5738 if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5739 (void)KMP_COMPARE_AND_STORE_ACQ32(
5740 &(team->t.t_threads[f]->th.th_used_in_team), 1, 2);
5742 __kmp_free_thread(team->t.t_threads[f]);
5745 if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5748 team->t.b->go_release();
5749 if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
5750 for (f = 1; f < team->t.t_nproc; ++f) {
5751 if (team->t.b->sleep[f].sleep) {
5752 __kmp_atomic_resume_64(
5753 team->t.t_threads[f]->th.th_info.ds.ds_gtid,
5754 (kmp_atomic_flag_64<> *)NULL);
5759 for (
int f = 1; f < team->t.t_nproc; ++f) {
5760 while (team->t.t_threads[f]->th.th_used_in_team.load() != 0)
5766 for (f = 1; f < team->t.t_nproc; ++f) {
5767 team->t.t_threads[f] = NULL;
5770 if (team->t.t_max_nproc > 1 &&
5771 __kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
5772 distributedBarrier::deallocate(team->t.b);
5777 team->t.t_next_pool = CCAST(kmp_team_t *, __kmp_team_pool);
5778 __kmp_team_pool = (
volatile kmp_team_t *)team;
5781 KMP_DEBUG_ASSERT(team->t.t_threads[1] &&
5782 team->t.t_threads[1]->th.th_cg_roots);
5783 if (team->t.t_threads[1]->th.th_cg_roots->cg_root == team->t.t_threads[1]) {
5785 for (f = 1; f < team->t.t_nproc; ++f) {
5786 kmp_info_t *thr = team->t.t_threads[f];
5787 KMP_DEBUG_ASSERT(thr && thr->th.th_cg_roots &&
5788 thr->th.th_cg_roots->cg_root == thr);
5790 kmp_cg_root_t *tmp = thr->th.th_cg_roots;
5791 thr->th.th_cg_roots = tmp->up;
5792 KA_TRACE(100, (
"__kmp_free_team: Thread %p popping node %p and moving"
5793 " up to node %p. cg_nthreads was %d\n",
5794 thr, tmp, thr->th.th_cg_roots, tmp->cg_nthreads));
5795 int i = tmp->cg_nthreads--;
5800 if (thr->th.th_cg_roots)
5801 thr->th.th_current_task->td_icvs.thread_limit =
5802 thr->th.th_cg_roots->cg_thread_limit;
5811kmp_team_t *__kmp_reap_team(kmp_team_t *team) {
5812 kmp_team_t *next_pool = team->t.t_next_pool;
5814 KMP_DEBUG_ASSERT(team);
5815 KMP_DEBUG_ASSERT(team->t.t_dispatch);
5816 KMP_DEBUG_ASSERT(team->t.t_disp_buffer);
5817 KMP_DEBUG_ASSERT(team->t.t_threads);
5818 KMP_DEBUG_ASSERT(team->t.t_argv);
5823 __kmp_free_team_arrays(team);
5824 if (team->t.t_argv != &team->t.t_inline_argv[0])
5825 __kmp_free((
void *)team->t.t_argv);
5857void __kmp_free_thread(kmp_info_t *this_th) {
5861 KA_TRACE(20, (
"__kmp_free_thread: T#%d putting T#%d back on free pool.\n",
5862 __kmp_get_gtid(), this_th->th.th_info.ds.ds_gtid));
5864 KMP_DEBUG_ASSERT(this_th);
5869 kmp_balign_t *balign = this_th->th.th_bar;
5870 for (b = 0; b < bs_last_barrier; ++b) {
5871 if (balign[b].bb.wait_flag == KMP_BARRIER_PARENT_FLAG)
5872 balign[b].bb.wait_flag = KMP_BARRIER_SWITCH_TO_OWN_FLAG;
5873 balign[b].bb.team = NULL;
5874 balign[b].bb.leaf_kids = 0;
5876 this_th->th.th_task_state = 0;
5877 this_th->th.th_reap_state = KMP_SAFE_TO_REAP;
5880 TCW_PTR(this_th->th.th_team, NULL);
5881 TCW_PTR(this_th->th.th_root, NULL);
5882 TCW_PTR(this_th->th.th_dispatch, NULL);
5884 while (this_th->th.th_cg_roots) {
5885 this_th->th.th_cg_roots->cg_nthreads--;
5886 KA_TRACE(100, (
"__kmp_free_thread: Thread %p decrement cg_nthreads on node"
5887 " %p of thread %p to %d\n",
5888 this_th, this_th->th.th_cg_roots,
5889 this_th->th.th_cg_roots->cg_root,
5890 this_th->th.th_cg_roots->cg_nthreads));
5891 kmp_cg_root_t *tmp = this_th->th.th_cg_roots;
5892 if (tmp->cg_root == this_th) {
5893 KMP_DEBUG_ASSERT(tmp->cg_nthreads == 0);
5895 5, (
"__kmp_free_thread: Thread %p freeing node %p\n", this_th, tmp));
5896 this_th->th.th_cg_roots = tmp->up;
5899 if (tmp->cg_nthreads == 0) {
5902 this_th->th.th_cg_roots = NULL;
5912 __kmp_free_implicit_task(this_th);
5913 this_th->th.th_current_task = NULL;
5917 gtid = this_th->th.th_info.ds.ds_gtid;
5918 if (__kmp_thread_pool_insert_pt != NULL) {
5919 KMP_DEBUG_ASSERT(__kmp_thread_pool != NULL);
5920 if (__kmp_thread_pool_insert_pt->th.th_info.ds.ds_gtid > gtid) {
5921 __kmp_thread_pool_insert_pt = NULL;
5930 if (__kmp_thread_pool_insert_pt != NULL) {
5931 scan = &(__kmp_thread_pool_insert_pt->th.th_next_pool);
5933 scan = CCAST(kmp_info_t **, &__kmp_thread_pool);
5935 for (; (*scan != NULL) && ((*scan)->th.th_info.ds.ds_gtid < gtid);
5936 scan = &((*scan)->th.th_next_pool))
5941 TCW_PTR(this_th->th.th_next_pool, *scan);
5942 __kmp_thread_pool_insert_pt = *scan = this_th;
5943 KMP_DEBUG_ASSERT((this_th->th.th_next_pool == NULL) ||
5944 (this_th->th.th_info.ds.ds_gtid <
5945 this_th->th.th_next_pool->th.th_info.ds.ds_gtid));
5946 TCW_4(this_th->th.th_in_pool, TRUE);
5947 __kmp_suspend_initialize_thread(this_th);
5948 __kmp_lock_suspend_mx(this_th);
5949 if (this_th->th.th_active == TRUE) {
5950 KMP_ATOMIC_INC(&__kmp_thread_pool_active_nth);
5951 this_th->th.th_active_in_pool = TRUE;
5955 KMP_DEBUG_ASSERT(this_th->th.th_active_in_pool == FALSE);
5958 __kmp_unlock_suspend_mx(this_th);
5960 TCW_4(__kmp_nth, __kmp_nth - 1);
5962#ifdef KMP_ADJUST_BLOCKTIME
5965 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
5966 KMP_DEBUG_ASSERT(__kmp_avail_proc > 0);
5967 if (__kmp_nth <= __kmp_avail_proc) {
5968 __kmp_zero_bt = FALSE;
5978void *__kmp_launch_thread(kmp_info_t *this_thr) {
5979#if OMP_PROFILING_SUPPORT
5980 ProfileTraceFile = getenv(
"LIBOMPTARGET_PROFILE");
5982 if (ProfileTraceFile)
5983 llvm::timeTraceProfilerInitialize(500 ,
"libomptarget");
5986 int gtid = this_thr->th.th_info.ds.ds_gtid;
5988 kmp_team_t **
volatile pteam;
5991 KA_TRACE(10, (
"__kmp_launch_thread: T#%d start\n", gtid));
5993 if (__kmp_env_consistency_check) {
5994 this_thr->th.th_cons = __kmp_allocate_cons_stack(gtid);
5998 if (ompd_state & OMPD_ENABLE_BP)
5999 ompd_bp_thread_begin();
6003 ompt_data_t *thread_data =
nullptr;
6004 if (ompt_enabled.enabled) {
6005 thread_data = &(this_thr->th.ompt_thread_info.thread_data);
6006 *thread_data = ompt_data_none;
6008 this_thr->th.ompt_thread_info.state = ompt_state_overhead;
6009 this_thr->th.ompt_thread_info.wait_id = 0;
6010 this_thr->th.ompt_thread_info.idle_frame = OMPT_GET_FRAME_ADDRESS(0);
6011 this_thr->th.ompt_thread_info.parallel_flags = 0;
6012 if (ompt_enabled.ompt_callback_thread_begin) {
6013 ompt_callbacks.ompt_callback(ompt_callback_thread_begin)(
6014 ompt_thread_worker, thread_data);
6016 this_thr->th.ompt_thread_info.state = ompt_state_idle;
6021 while (!TCR_4(__kmp_global.g.g_done)) {
6022 KMP_DEBUG_ASSERT(this_thr == __kmp_threads[gtid]);
6026 KA_TRACE(20, (
"__kmp_launch_thread: T#%d waiting for work\n", gtid));
6029 __kmp_fork_barrier(gtid, KMP_GTID_DNE);
6032 if (ompt_enabled.enabled) {
6033 this_thr->th.ompt_thread_info.state = ompt_state_overhead;
6037 pteam = &this_thr->th.th_team;
6040 if (TCR_SYNC_PTR(*pteam) && !TCR_4(__kmp_global.g.g_done)) {
6042 if (TCR_SYNC_PTR((*pteam)->t.t_pkfn) != NULL) {
6045 (
"__kmp_launch_thread: T#%d(%d:%d) invoke microtask = %p\n",
6046 gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid),
6047 (*pteam)->t.t_pkfn));
6049 updateHWFPControl(*pteam);
6052 if (ompt_enabled.enabled) {
6053 this_thr->th.ompt_thread_info.state = ompt_state_work_parallel;
6057 rc = (*pteam)->t.t_invoke(gtid);
6061 KA_TRACE(20, (
"__kmp_launch_thread: T#%d(%d:%d) done microtask = %p\n",
6062 gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid),
6063 (*pteam)->t.t_pkfn));
6066 if (ompt_enabled.enabled) {
6068 __ompt_get_task_info_object(0)->frame.exit_frame = ompt_data_none;
6070 this_thr->th.ompt_thread_info.state = ompt_state_overhead;
6074 __kmp_join_barrier(gtid);
6079 if (ompd_state & OMPD_ENABLE_BP)
6080 ompd_bp_thread_end();
6084 if (ompt_enabled.ompt_callback_thread_end) {
6085 ompt_callbacks.ompt_callback(ompt_callback_thread_end)(thread_data);
6089 this_thr->th.th_task_team = NULL;
6091 __kmp_common_destroy_gtid(gtid);
6093 KA_TRACE(10, (
"__kmp_launch_thread: T#%d done\n", gtid));
6096#if OMP_PROFILING_SUPPORT
6097 llvm::timeTraceProfilerFinishThread();
6104void __kmp_internal_end_dest(
void *specific_gtid) {
6107 __kmp_type_convert((kmp_intptr_t)specific_gtid - 1, >id);
6109 KA_TRACE(30, (
"__kmp_internal_end_dest: T#%d\n", gtid));
6113 __kmp_internal_end_thread(gtid);
6116#if KMP_OS_UNIX && KMP_DYNAMIC_LIB
6118__attribute__((destructor))
void __kmp_internal_end_dtor(
void) {
6119 __kmp_internal_end_atexit();
6126void __kmp_internal_end_atexit(
void) {
6127 KA_TRACE(30, (
"__kmp_internal_end_atexit\n"));
6151 __kmp_internal_end_library(-1);
6153 __kmp_close_console();
6157static void __kmp_reap_thread(kmp_info_t *thread,
int is_root) {
6162 KMP_DEBUG_ASSERT(thread != NULL);
6164 gtid = thread->th.th_info.ds.ds_gtid;
6167 if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
6170 20, (
"__kmp_reap_thread: releasing T#%d from fork barrier for reap\n",
6172 if (__kmp_barrier_gather_pattern[bs_forkjoin_barrier] == bp_dist_bar) {
6174 !KMP_COMPARE_AND_STORE_ACQ32(&(thread->th.th_used_in_team), 0, 3))
6176 __kmp_resume_32(gtid, (kmp_flag_32<false, false> *)NULL);
6180 kmp_flag_64<> flag(&thread->th.th_bar[bs_forkjoin_barrier].bb.b_go,
6182 __kmp_release_64(&flag);
6187 __kmp_reap_worker(thread);
6199 if (thread->th.th_active_in_pool) {
6200 thread->th.th_active_in_pool = FALSE;
6201 KMP_ATOMIC_DEC(&__kmp_thread_pool_active_nth);
6202 KMP_DEBUG_ASSERT(__kmp_thread_pool_active_nth >= 0);
6206 __kmp_free_implicit_task(thread);
6210 __kmp_free_fast_memory(thread);
6213 __kmp_suspend_uninitialize_thread(thread);
6215 KMP_DEBUG_ASSERT(__kmp_threads[gtid] == thread);
6216 TCW_SYNC_PTR(__kmp_threads[gtid], NULL);
6221#ifdef KMP_ADJUST_BLOCKTIME
6224 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
6225 KMP_DEBUG_ASSERT(__kmp_avail_proc > 0);
6226 if (__kmp_nth <= __kmp_avail_proc) {
6227 __kmp_zero_bt = FALSE;
6233 if (__kmp_env_consistency_check) {
6234 if (thread->th.th_cons) {
6235 __kmp_free_cons_stack(thread->th.th_cons);
6236 thread->th.th_cons = NULL;
6240 if (thread->th.th_pri_common != NULL) {
6241 __kmp_free(thread->th.th_pri_common);
6242 thread->th.th_pri_common = NULL;
6246 if (thread->th.th_local.bget_data != NULL) {
6247 __kmp_finalize_bget(thread);
6251#if KMP_AFFINITY_SUPPORTED
6252 if (thread->th.th_affin_mask != NULL) {
6253 KMP_CPU_FREE(thread->th.th_affin_mask);
6254 thread->th.th_affin_mask = NULL;
6258#if KMP_USE_HIER_SCHED
6259 if (thread->th.th_hier_bar_data != NULL) {
6260 __kmp_free(thread->th.th_hier_bar_data);
6261 thread->th.th_hier_bar_data = NULL;
6265 __kmp_reap_team(thread->th.th_serial_team);
6266 thread->th.th_serial_team = NULL;
6273static void __kmp_itthash_clean(kmp_info_t *th) {
6275 if (__kmp_itt_region_domains.count > 0) {
6276 for (
int i = 0; i < KMP_MAX_FRAME_DOMAINS; ++i) {
6277 kmp_itthash_entry_t *bucket = __kmp_itt_region_domains.buckets[i];
6279 kmp_itthash_entry_t *next = bucket->next_in_bucket;
6280 __kmp_thread_free(th, bucket);
6285 if (__kmp_itt_barrier_domains.count > 0) {
6286 for (
int i = 0; i < KMP_MAX_FRAME_DOMAINS; ++i) {
6287 kmp_itthash_entry_t *bucket = __kmp_itt_barrier_domains.buckets[i];
6289 kmp_itthash_entry_t *next = bucket->next_in_bucket;
6290 __kmp_thread_free(th, bucket);
6298static void __kmp_internal_end(
void) {
6302 __kmp_unregister_library();
6309 __kmp_reclaim_dead_roots();
6313 for (i = 0; i < __kmp_threads_capacity; i++)
6315 if (__kmp_root[i]->r.r_active)
6318 TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
6320 if (i < __kmp_threads_capacity) {
6332 __kmp_acquire_bootstrap_lock(&__kmp_monitor_lock);
6333 if (TCR_4(__kmp_init_monitor)) {
6334 __kmp_reap_monitor(&__kmp_monitor);
6335 TCW_4(__kmp_init_monitor, 0);
6337 __kmp_release_bootstrap_lock(&__kmp_monitor_lock);
6338 KA_TRACE(10, (
"__kmp_internal_end: monitor reaped\n"));
6344 for (i = 0; i < __kmp_threads_capacity; i++) {
6345 if (__kmp_root[i]) {
6348 KMP_ASSERT(!__kmp_root[i]->r.r_active);
6357 while (__kmp_thread_pool != NULL) {
6359 kmp_info_t *thread = CCAST(kmp_info_t *, __kmp_thread_pool);
6360 __kmp_thread_pool = thread->th.th_next_pool;
6362 KMP_DEBUG_ASSERT(thread->th.th_reap_state == KMP_SAFE_TO_REAP);
6363 thread->th.th_next_pool = NULL;
6364 thread->th.th_in_pool = FALSE;
6365 __kmp_reap_thread(thread, 0);
6367 __kmp_thread_pool_insert_pt = NULL;
6370 while (__kmp_team_pool != NULL) {
6372 kmp_team_t *team = CCAST(kmp_team_t *, __kmp_team_pool);
6373 __kmp_team_pool = team->t.t_next_pool;
6375 team->t.t_next_pool = NULL;
6376 __kmp_reap_team(team);
6379 __kmp_reap_task_teams();
6386 for (i = 0; i < __kmp_threads_capacity; i++) {
6387 kmp_info_t *thr = __kmp_threads[i];
6388 while (thr && KMP_ATOMIC_LD_ACQ(&thr->th.th_blocking))
6393 for (i = 0; i < __kmp_threads_capacity; ++i) {
6400 TCW_SYNC_4(__kmp_init_common, FALSE);
6402 KA_TRACE(10, (
"__kmp_internal_end: all workers reaped\n"));
6410 __kmp_acquire_bootstrap_lock(&__kmp_monitor_lock);
6411 if (TCR_4(__kmp_init_monitor)) {
6412 __kmp_reap_monitor(&__kmp_monitor);
6413 TCW_4(__kmp_init_monitor, 0);
6415 __kmp_release_bootstrap_lock(&__kmp_monitor_lock);
6416 KA_TRACE(10, (
"__kmp_internal_end: monitor reaped\n"));
6419 TCW_4(__kmp_init_gtid, FALSE);
6428void __kmp_internal_end_library(
int gtid_req) {
6435 if (__kmp_global.g.g_abort) {
6436 KA_TRACE(11, (
"__kmp_internal_end_library: abort, exiting\n"));
6440 if (TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial) {
6441 KA_TRACE(10, (
"__kmp_internal_end_library: already finished\n"));
6446 if (TCR_4(__kmp_init_hidden_helper) &&
6447 !TCR_4(__kmp_hidden_helper_team_done)) {
6448 TCW_SYNC_4(__kmp_hidden_helper_team_done, TRUE);
6450 __kmp_hidden_helper_main_thread_release();
6452 __kmp_hidden_helper_threads_deinitz_wait();
6458 int gtid = (gtid_req >= 0) ? gtid_req : __kmp_gtid_get_specific();
6460 10, (
"__kmp_internal_end_library: enter T#%d (%d)\n", gtid, gtid_req));
6461 if (gtid == KMP_GTID_SHUTDOWN) {
6462 KA_TRACE(10, (
"__kmp_internal_end_library: !__kmp_init_runtime, system "
6463 "already shutdown\n"));
6465 }
else if (gtid == KMP_GTID_MONITOR) {
6466 KA_TRACE(10, (
"__kmp_internal_end_library: monitor thread, gtid not "
6467 "registered, or system shutdown\n"));
6469 }
else if (gtid == KMP_GTID_DNE) {
6470 KA_TRACE(10, (
"__kmp_internal_end_library: gtid not registered or system "
6473 }
else if (KMP_UBER_GTID(gtid)) {
6475 if (__kmp_root[gtid]->r.r_active) {
6476 __kmp_global.g.g_abort = -1;
6477 TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
6478 __kmp_unregister_library();
6480 (
"__kmp_internal_end_library: root still active, abort T#%d\n",
6484 __kmp_itthash_clean(__kmp_threads[gtid]);
6487 (
"__kmp_internal_end_library: unregistering sibling T#%d\n", gtid));
6488 __kmp_unregister_root_current_thread(gtid);
6495#ifdef DUMP_DEBUG_ON_EXIT
6496 if (__kmp_debug_buf)
6497 __kmp_dump_debug_buffer();
6502 __kmp_unregister_library();
6507 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
6510 if (__kmp_global.g.g_abort) {
6511 KA_TRACE(10, (
"__kmp_internal_end_library: abort, exiting\n"));
6513 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6516 if (TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial) {
6517 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6526 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
6529 __kmp_internal_end();
6531 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
6532 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6534 KA_TRACE(10, (
"__kmp_internal_end_library: exit\n"));
6536#ifdef DUMP_DEBUG_ON_EXIT
6537 if (__kmp_debug_buf)
6538 __kmp_dump_debug_buffer();
6542 __kmp_close_console();
6545 __kmp_fini_allocator();
6549void __kmp_internal_end_thread(
int gtid_req) {
6558 if (__kmp_global.g.g_abort) {
6559 KA_TRACE(11, (
"__kmp_internal_end_thread: abort, exiting\n"));
6563 if (TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial) {
6564 KA_TRACE(10, (
"__kmp_internal_end_thread: already finished\n"));
6569 if (TCR_4(__kmp_init_hidden_helper) &&
6570 !TCR_4(__kmp_hidden_helper_team_done)) {
6571 TCW_SYNC_4(__kmp_hidden_helper_team_done, TRUE);
6573 __kmp_hidden_helper_main_thread_release();
6575 __kmp_hidden_helper_threads_deinitz_wait();
6582 int gtid = (gtid_req >= 0) ? gtid_req : __kmp_gtid_get_specific();
6584 (
"__kmp_internal_end_thread: enter T#%d (%d)\n", gtid, gtid_req));
6585 if (gtid == KMP_GTID_SHUTDOWN) {
6586 KA_TRACE(10, (
"__kmp_internal_end_thread: !__kmp_init_runtime, system "
6587 "already shutdown\n"));
6589 }
else if (gtid == KMP_GTID_MONITOR) {
6590 KA_TRACE(10, (
"__kmp_internal_end_thread: monitor thread, gtid not "
6591 "registered, or system shutdown\n"));
6593 }
else if (gtid == KMP_GTID_DNE) {
6594 KA_TRACE(10, (
"__kmp_internal_end_thread: gtid not registered or system "
6598 }
else if (KMP_UBER_GTID(gtid)) {
6600 if (__kmp_root[gtid]->r.r_active) {
6601 __kmp_global.g.g_abort = -1;
6602 TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
6604 (
"__kmp_internal_end_thread: root still active, abort T#%d\n",
6608 KA_TRACE(10, (
"__kmp_internal_end_thread: unregistering sibling T#%d\n",
6610 __kmp_unregister_root_current_thread(gtid);
6614 KA_TRACE(10, (
"__kmp_internal_end_thread: worker thread T#%d\n", gtid));
6617 __kmp_threads[gtid]->th.th_task_team = NULL;
6621 (
"__kmp_internal_end_thread: worker thread done, exiting T#%d\n",
6627 if (__kmp_pause_status != kmp_hard_paused)
6631 KA_TRACE(10, (
"__kmp_internal_end_thread: exiting T#%d\n", gtid_req));
6636 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
6639 if (__kmp_global.g.g_abort) {
6640 KA_TRACE(10, (
"__kmp_internal_end_thread: abort, exiting\n"));
6642 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6645 if (TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial) {
6646 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6657 __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
6659 for (i = 0; i < __kmp_threads_capacity; ++i) {
6660 if (KMP_UBER_GTID(i)) {
6663 (
"__kmp_internal_end_thread: remaining sibling task: gtid==%d\n", i));
6664 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
6665 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6672 __kmp_internal_end();
6674 __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
6675 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
6677 KA_TRACE(10, (
"__kmp_internal_end_thread: exit T#%d\n", gtid_req));
6679#ifdef DUMP_DEBUG_ON_EXIT
6680 if (__kmp_debug_buf)
6681 __kmp_dump_debug_buffer();
6688static long __kmp_registration_flag = 0;
6690static char *__kmp_registration_str = NULL;
6693static inline char *__kmp_reg_status_name() {
6699#if KMP_OS_UNIX && !KMP_OS_DARWIN && KMP_DYNAMIC_LIB
6700 return __kmp_str_format(
"__KMP_REGISTERED_LIB_%d_%d", (
int)getpid(),
6703 return __kmp_str_format(
"__KMP_REGISTERED_LIB_%d", (
int)getpid());
6707#if defined(KMP_USE_SHM)
6708bool __kmp_shm_available =
false;
6709bool __kmp_tmp_available =
false;
6711char *temp_reg_status_file_name =
nullptr;
6714void __kmp_register_library_startup(
void) {
6716 char *name = __kmp_reg_status_name();
6722#if KMP_ARCH_X86 || KMP_ARCH_X86_64
6723 __kmp_initialize_system_tick();
6725 __kmp_read_system_time(&time.dtime);
6726 __kmp_registration_flag = 0xCAFE0000L | (time.ltime & 0x0000FFFFL);
6727 __kmp_registration_str =
6728 __kmp_str_format(
"%p-%lx-%s", &__kmp_registration_flag,
6729 __kmp_registration_flag, KMP_LIBRARY_FILE);
6731 KA_TRACE(50, (
"__kmp_register_library_startup: %s=\"%s\"\n", name,
6732 __kmp_registration_str));
6738#if defined(KMP_USE_SHM)
6739 char *shm_name =
nullptr;
6740 char *data1 =
nullptr;
6741 __kmp_shm_available = __kmp_detect_shm();
6742 if (__kmp_shm_available) {
6744 shm_name = __kmp_str_format(
"/%s", name);
6745 int shm_preexist = 0;
6746 fd1 = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0600);
6747 if ((fd1 == -1) && (errno == EEXIST)) {
6750 fd1 = shm_open(shm_name, O_RDWR, 0600);
6752 KMP_WARNING(FunctionError,
"Can't open SHM");
6753 __kmp_shm_available =
false;
6758 if (__kmp_shm_available && shm_preexist == 0) {
6759 if (ftruncate(fd1, SHM_SIZE) == -1) {
6760 KMP_WARNING(FunctionError,
"Can't set size of SHM");
6761 __kmp_shm_available =
false;
6764 if (__kmp_shm_available) {
6765 data1 = (
char *)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
6767 if (data1 == MAP_FAILED) {
6768 KMP_WARNING(FunctionError,
"Can't map SHM");
6769 __kmp_shm_available =
false;
6772 if (__kmp_shm_available) {
6773 if (shm_preexist == 0) {
6774 KMP_STRCPY_S(data1, SHM_SIZE, __kmp_registration_str);
6777 value = __kmp_str_format(
"%s", data1);
6778 munmap(data1, SHM_SIZE);
6783 if (!__kmp_shm_available)
6784 __kmp_tmp_available = __kmp_detect_tmp();
6785 if (!__kmp_shm_available && __kmp_tmp_available) {
6792 temp_reg_status_file_name = __kmp_str_format(
"/tmp/%s", name);
6793 int tmp_preexist = 0;
6794 fd1 = open(temp_reg_status_file_name, O_CREAT | O_EXCL | O_RDWR, 0600);
6795 if ((fd1 == -1) && (errno == EEXIST)) {
6798 fd1 = open(temp_reg_status_file_name, O_RDWR, 0600);
6800 KMP_WARNING(FunctionError,
"Can't open TEMP");
6801 __kmp_tmp_available =
false;
6806 if (__kmp_tmp_available && tmp_preexist == 0) {
6808 if (ftruncate(fd1, SHM_SIZE) == -1) {
6809 KMP_WARNING(FunctionError,
"Can't set size of /tmp file");
6810 __kmp_tmp_available =
false;
6813 if (__kmp_tmp_available) {
6814 data1 = (
char *)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
6816 if (data1 == MAP_FAILED) {
6817 KMP_WARNING(FunctionError,
"Can't map /tmp");
6818 __kmp_tmp_available =
false;
6821 if (__kmp_tmp_available) {
6822 if (tmp_preexist == 0) {
6823 KMP_STRCPY_S(data1, SHM_SIZE, __kmp_registration_str);
6826 value = __kmp_str_format(
"%s", data1);
6827 munmap(data1, SHM_SIZE);
6832 if (!__kmp_shm_available && !__kmp_tmp_available) {
6835 __kmp_env_set(name, __kmp_registration_str, 0);
6837 value = __kmp_env_get(name);
6841 __kmp_env_set(name, __kmp_registration_str, 0);
6843 value = __kmp_env_get(name);
6846 if (value != NULL && strcmp(value, __kmp_registration_str) == 0) {
6853 char *flag_addr_str = NULL;
6854 char *flag_val_str = NULL;
6855 char const *file_name = NULL;
6856 __kmp_str_split(tail,
'-', &flag_addr_str, &tail);
6857 __kmp_str_split(tail,
'-', &flag_val_str, &tail);
6860 unsigned long *flag_addr = 0;
6861 unsigned long flag_val = 0;
6862 KMP_SSCANF(flag_addr_str,
"%p", RCAST(
void **, &flag_addr));
6863 KMP_SSCANF(flag_val_str,
"%lx", &flag_val);
6864 if (flag_addr != 0 && flag_val != 0 && strcmp(file_name,
"") != 0) {
6868 if (__kmp_is_address_mapped(flag_addr) && *flag_addr == flag_val) {
6882 file_name =
"unknown library";
6887 char *duplicate_ok = __kmp_env_get(
"KMP_DUPLICATE_LIB_OK");
6888 if (!__kmp_str_match_true(duplicate_ok)) {
6890 __kmp_fatal(KMP_MSG(DuplicateLibrary, KMP_LIBRARY_FILE, file_name),
6891 KMP_HNT(DuplicateLibrary), __kmp_msg_null);
6893 KMP_INTERNAL_FREE(duplicate_ok);
6894 __kmp_duplicate_library_ok = 1;
6899#if defined(KMP_USE_SHM)
6900 if (__kmp_shm_available) {
6901 shm_unlink(shm_name);
6902 }
else if (__kmp_tmp_available) {
6903 unlink(temp_reg_status_file_name);
6906 __kmp_env_unset(name);
6910 __kmp_env_unset(name);
6914 KMP_DEBUG_ASSERT(0);
6918 KMP_INTERNAL_FREE((
void *)value);
6919#if defined(KMP_USE_SHM)
6921 KMP_INTERNAL_FREE((
void *)shm_name);
6924 KMP_INTERNAL_FREE((
void *)name);
6928void __kmp_unregister_library(
void) {
6934 if (__kmp_registration_flag == 0)
6937 char *name = __kmp_reg_status_name();
6940#if defined(KMP_USE_SHM)
6941 char *shm_name =
nullptr;
6943 if (__kmp_shm_available) {
6944 shm_name = __kmp_str_format(
"/%s", name);
6945 fd1 = shm_open(shm_name, O_RDONLY, 0600);
6947 char *data1 = (
char *)mmap(0, SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0);
6948 if (data1 != MAP_FAILED) {
6949 value = __kmp_str_format(
"%s", data1);
6950 munmap(data1, SHM_SIZE);
6954 }
else if (__kmp_tmp_available) {
6955 fd1 = open(temp_reg_status_file_name, O_RDONLY);
6957 char *data1 = (
char *)mmap(0, SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0);
6958 if (data1 != MAP_FAILED) {
6959 value = __kmp_str_format(
"%s", data1);
6960 munmap(data1, SHM_SIZE);
6965 value = __kmp_env_get(name);
6968 value = __kmp_env_get(name);
6971 KMP_DEBUG_ASSERT(__kmp_registration_flag != 0);
6972 KMP_DEBUG_ASSERT(__kmp_registration_str != NULL);
6973 if (value != NULL && strcmp(value, __kmp_registration_str) == 0) {
6975#if defined(KMP_USE_SHM)
6976 if (__kmp_shm_available) {
6977 shm_unlink(shm_name);
6978 }
else if (__kmp_tmp_available) {
6979 unlink(temp_reg_status_file_name);
6981 __kmp_env_unset(name);
6984 __kmp_env_unset(name);
6988#if defined(KMP_USE_SHM)
6990 KMP_INTERNAL_FREE(shm_name);
6991 if (temp_reg_status_file_name)
6992 KMP_INTERNAL_FREE(temp_reg_status_file_name);
6995 KMP_INTERNAL_FREE(__kmp_registration_str);
6996 KMP_INTERNAL_FREE(value);
6997 KMP_INTERNAL_FREE(name);
6999 __kmp_registration_flag = 0;
7000 __kmp_registration_str = NULL;
7007#if KMP_MIC_SUPPORTED
7009static void __kmp_check_mic_type() {
7010 kmp_cpuid_t cpuid_state = {0};
7011 kmp_cpuid_t *cs_p = &cpuid_state;
7012 __kmp_x86_cpuid(1, 0, cs_p);
7014 if ((cs_p->eax & 0xff0) == 0xB10) {
7015 __kmp_mic_type = mic2;
7016 }
else if ((cs_p->eax & 0xf0ff0) == 0x50670) {
7017 __kmp_mic_type = mic3;
7019 __kmp_mic_type = non_mic;
7026static void __kmp_user_level_mwait_init() {
7027 struct kmp_cpuid buf;
7028 __kmp_x86_cpuid(7, 0, &buf);
7029 __kmp_waitpkg_enabled = ((buf.ecx >> 5) & 1);
7030 __kmp_umwait_enabled = __kmp_waitpkg_enabled && __kmp_user_level_mwait;
7031 __kmp_tpause_enabled = __kmp_waitpkg_enabled && (__kmp_tpause_state > 0);
7032 KF_TRACE(30, (
"__kmp_user_level_mwait_init: __kmp_umwait_enabled = %d\n",
7033 __kmp_umwait_enabled));
7036#ifndef AT_INTELPHIUSERMWAIT
7039#define AT_INTELPHIUSERMWAIT 10000
7044unsigned long getauxval(
unsigned long) KMP_WEAK_ATTRIBUTE_EXTERNAL;
7045unsigned long getauxval(
unsigned long) {
return 0; }
7047static void __kmp_user_level_mwait_init() {
7052 if (__kmp_mic_type == mic3) {
7053 unsigned long res = getauxval(AT_INTELPHIUSERMWAIT);
7054 if ((res & 0x1) || __kmp_user_level_mwait) {
7055 __kmp_mwait_enabled = TRUE;
7056 if (__kmp_user_level_mwait) {
7057 KMP_INFORM(EnvMwaitWarn);
7060 __kmp_mwait_enabled = FALSE;
7063 KF_TRACE(30, (
"__kmp_user_level_mwait_init: __kmp_mic_type = %d, "
7064 "__kmp_mwait_enabled = %d\n",
7065 __kmp_mic_type, __kmp_mwait_enabled));
7069static void __kmp_do_serial_initialize(
void) {
7073 KA_TRACE(10, (
"__kmp_do_serial_initialize: enter\n"));
7075 KMP_DEBUG_ASSERT(
sizeof(kmp_int32) == 4);
7076 KMP_DEBUG_ASSERT(
sizeof(kmp_uint32) == 4);
7077 KMP_DEBUG_ASSERT(
sizeof(kmp_int64) == 8);
7078 KMP_DEBUG_ASSERT(
sizeof(kmp_uint64) == 8);
7079 KMP_DEBUG_ASSERT(
sizeof(kmp_intptr_t) ==
sizeof(
void *));
7089 __kmp_validate_locks();
7091#if ENABLE_LIBOMPTARGET
7093 __kmp_init_omptarget();
7097 __kmp_init_allocator();
7103 if (__kmp_need_register_serial)
7104 __kmp_register_library_startup();
7107 if (TCR_4(__kmp_global.g.g_done)) {
7108 KA_TRACE(10, (
"__kmp_do_serial_initialize: reinitialization of library\n"));
7111 __kmp_global.g.g_abort = 0;
7112 TCW_SYNC_4(__kmp_global.g.g_done, FALSE);
7115#if KMP_USE_ADAPTIVE_LOCKS
7116#if KMP_DEBUG_ADAPTIVE_LOCKS
7117 __kmp_init_speculative_stats();
7120#if KMP_STATS_ENABLED
7123 __kmp_init_lock(&__kmp_global_lock);
7124 __kmp_init_atomic_lock(&__kmp_atomic_lock);
7125 __kmp_init_atomic_lock(&__kmp_atomic_lock_1i);
7126 __kmp_init_atomic_lock(&__kmp_atomic_lock_2i);
7127 __kmp_init_atomic_lock(&__kmp_atomic_lock_4i);
7128 __kmp_init_atomic_lock(&__kmp_atomic_lock_4r);
7129 __kmp_init_atomic_lock(&__kmp_atomic_lock_8i);
7130 __kmp_init_atomic_lock(&__kmp_atomic_lock_8r);
7131 __kmp_init_atomic_lock(&__kmp_atomic_lock_8c);
7132 __kmp_init_atomic_lock(&__kmp_atomic_lock_10r);
7133 __kmp_init_atomic_lock(&__kmp_atomic_lock_16r);
7134 __kmp_init_atomic_lock(&__kmp_atomic_lock_16c);
7135 __kmp_init_atomic_lock(&__kmp_atomic_lock_20c);
7136 __kmp_init_atomic_lock(&__kmp_atomic_lock_32c);
7137 __kmp_init_bootstrap_lock(&__kmp_forkjoin_lock);
7138 __kmp_init_bootstrap_lock(&__kmp_exit_lock);
7140 __kmp_init_bootstrap_lock(&__kmp_monitor_lock);
7142 __kmp_init_bootstrap_lock(&__kmp_tp_cached_lock);
7146 __kmp_runtime_initialize();
7148#if KMP_MIC_SUPPORTED
7149 __kmp_check_mic_type();
7151#if ENABLE_LIBOMPTARGET
7152 __kmp_target_init();
7159 __kmp_abort_delay = 0;
7163 __kmp_dflt_team_nth_ub = __kmp_xproc;
7164 if (__kmp_dflt_team_nth_ub < KMP_MIN_NTH) {
7165 __kmp_dflt_team_nth_ub = KMP_MIN_NTH;
7167 if (__kmp_dflt_team_nth_ub > __kmp_sys_max_nth) {
7168 __kmp_dflt_team_nth_ub = __kmp_sys_max_nth;
7170 __kmp_max_nth = __kmp_sys_max_nth;
7171 __kmp_cg_max_nth = __kmp_sys_max_nth;
7172 __kmp_teams_max_nth = __kmp_xproc;
7173 if (__kmp_teams_max_nth > __kmp_sys_max_nth) {
7174 __kmp_teams_max_nth = __kmp_sys_max_nth;
7179 __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
7181 __kmp_monitor_wakeups =
7182 KMP_WAKEUPS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups);
7183 __kmp_bt_intervals =
7184 KMP_INTERVALS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups);
7187 __kmp_library = library_throughput;
7189 __kmp_static = kmp_sch_static_balanced;
7196#if KMP_FAST_REDUCTION_BARRIER
7197#define kmp_reduction_barrier_gather_bb ((int)1)
7198#define kmp_reduction_barrier_release_bb ((int)1)
7199#define kmp_reduction_barrier_gather_pat __kmp_barrier_gather_pat_dflt
7200#define kmp_reduction_barrier_release_pat __kmp_barrier_release_pat_dflt
7202 for (i = bs_plain_barrier; i < bs_last_barrier; i++) {
7203 __kmp_barrier_gather_branch_bits[i] = __kmp_barrier_gather_bb_dflt;
7204 __kmp_barrier_release_branch_bits[i] = __kmp_barrier_release_bb_dflt;
7205 __kmp_barrier_gather_pattern[i] = __kmp_barrier_gather_pat_dflt;
7206 __kmp_barrier_release_pattern[i] = __kmp_barrier_release_pat_dflt;
7207#if KMP_FAST_REDUCTION_BARRIER
7208 if (i == bs_reduction_barrier) {
7210 __kmp_barrier_gather_branch_bits[i] = kmp_reduction_barrier_gather_bb;
7211 __kmp_barrier_release_branch_bits[i] = kmp_reduction_barrier_release_bb;
7212 __kmp_barrier_gather_pattern[i] = kmp_reduction_barrier_gather_pat;
7213 __kmp_barrier_release_pattern[i] = kmp_reduction_barrier_release_pat;
7217#if KMP_FAST_REDUCTION_BARRIER
7218#undef kmp_reduction_barrier_release_pat
7219#undef kmp_reduction_barrier_gather_pat
7220#undef kmp_reduction_barrier_release_bb
7221#undef kmp_reduction_barrier_gather_bb
7223#if KMP_MIC_SUPPORTED
7224 if (__kmp_mic_type == mic2) {
7226 __kmp_barrier_gather_branch_bits[bs_plain_barrier] = 3;
7227 __kmp_barrier_release_branch_bits[bs_forkjoin_barrier] =
7229 __kmp_barrier_gather_pattern[bs_forkjoin_barrier] = bp_hierarchical_bar;
7230 __kmp_barrier_release_pattern[bs_forkjoin_barrier] = bp_hierarchical_bar;
7232#if KMP_FAST_REDUCTION_BARRIER
7233 if (__kmp_mic_type == mic2) {
7234 __kmp_barrier_gather_pattern[bs_reduction_barrier] = bp_hierarchical_bar;
7235 __kmp_barrier_release_pattern[bs_reduction_barrier] = bp_hierarchical_bar;
7242 __kmp_env_checks = TRUE;
7244 __kmp_env_checks = FALSE;
7248 __kmp_foreign_tp = TRUE;
7250 __kmp_global.g.g_dynamic = FALSE;
7251 __kmp_global.g.g_dynamic_mode = dynamic_default;
7253 __kmp_init_nesting_mode();
7255 __kmp_env_initialize(NULL);
7257#if KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT
7258 __kmp_user_level_mwait_init();
7262 char const *val = __kmp_env_get(
"KMP_DUMP_CATALOG");
7263 if (__kmp_str_match_true(val)) {
7264 kmp_str_buf_t buffer;
7265 __kmp_str_buf_init(&buffer);
7266 __kmp_i18n_dump_catalog(&buffer);
7267 __kmp_printf(
"%s", buffer.str);
7268 __kmp_str_buf_free(&buffer);
7270 __kmp_env_free(&val);
7273 __kmp_threads_capacity =
7274 __kmp_initial_threads_capacity(__kmp_dflt_team_nth_ub);
7276 __kmp_tp_capacity = __kmp_default_tp_capacity(
7277 __kmp_dflt_team_nth_ub, __kmp_max_nth, __kmp_allThreadsSpecified);
7282 KMP_DEBUG_ASSERT(__kmp_thread_pool == NULL);
7283 KMP_DEBUG_ASSERT(__kmp_thread_pool_insert_pt == NULL);
7284 KMP_DEBUG_ASSERT(__kmp_team_pool == NULL);
7285 __kmp_thread_pool = NULL;
7286 __kmp_thread_pool_insert_pt = NULL;
7287 __kmp_team_pool = NULL;
7294 (
sizeof(kmp_info_t *) +
sizeof(kmp_root_t *)) * __kmp_threads_capacity +
7296 __kmp_threads = (kmp_info_t **)__kmp_allocate(size);
7297 __kmp_root = (kmp_root_t **)((
char *)__kmp_threads +
7298 sizeof(kmp_info_t *) * __kmp_threads_capacity);
7301 KMP_DEBUG_ASSERT(__kmp_all_nth ==
7303 KMP_DEBUG_ASSERT(__kmp_nth == 0);
7308 gtid = __kmp_register_root(TRUE);
7309 KA_TRACE(10, (
"__kmp_do_serial_initialize T#%d\n", gtid));
7310 KMP_ASSERT(KMP_UBER_GTID(gtid));
7311 KMP_ASSERT(KMP_INITIAL_GTID(gtid));
7315 __kmp_common_initialize();
7319 __kmp_register_atfork();
7322#if !KMP_DYNAMIC_LIB || \
7323 ((KMP_COMPILER_ICC || KMP_COMPILER_ICX) && KMP_OS_DARWIN)
7328 int rc = atexit(__kmp_internal_end_atexit);
7330 __kmp_fatal(KMP_MSG(FunctionError,
"atexit()"), KMP_ERR(rc),
7336#if KMP_HANDLE_SIGNALS
7342 __kmp_install_signals(FALSE);
7345 __kmp_install_signals(TRUE);
7350 __kmp_init_counter++;
7352 __kmp_init_serial = TRUE;
7354 if (__kmp_version) {
7355 __kmp_print_version_1();
7358 if (__kmp_settings) {
7362 if (__kmp_display_env || __kmp_display_env_verbose) {
7363 __kmp_env_print_2();
7372 KA_TRACE(10, (
"__kmp_do_serial_initialize: exit\n"));
7375void __kmp_serial_initialize(
void) {
7376 if (__kmp_init_serial) {
7379 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
7380 if (__kmp_init_serial) {
7381 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7384 __kmp_do_serial_initialize();
7385 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7388static void __kmp_do_middle_initialize(
void) {
7390 int prev_dflt_team_nth;
7392 if (!__kmp_init_serial) {
7393 __kmp_do_serial_initialize();
7396 KA_TRACE(10, (
"__kmp_middle_initialize: enter\n"));
7398 if (UNLIKELY(!__kmp_need_register_serial)) {
7401 __kmp_register_library_startup();
7406 prev_dflt_team_nth = __kmp_dflt_team_nth;
7408#if KMP_AFFINITY_SUPPORTED
7411 __kmp_affinity_initialize(__kmp_affinity);
7415 KMP_ASSERT(__kmp_xproc > 0);
7416 if (__kmp_avail_proc == 0) {
7417 __kmp_avail_proc = __kmp_xproc;
7423 while ((j < __kmp_nested_nth.used) && !__kmp_nested_nth.nth[j]) {
7424 __kmp_nested_nth.nth[j] = __kmp_dflt_team_nth = __kmp_dflt_team_nth_ub =
7429 if (__kmp_dflt_team_nth == 0) {
7430#ifdef KMP_DFLT_NTH_CORES
7432 __kmp_dflt_team_nth = __kmp_ncores;
7433 KA_TRACE(20, (
"__kmp_middle_initialize: setting __kmp_dflt_team_nth = "
7434 "__kmp_ncores (%d)\n",
7435 __kmp_dflt_team_nth));
7438 __kmp_dflt_team_nth = __kmp_avail_proc;
7439 KA_TRACE(20, (
"__kmp_middle_initialize: setting __kmp_dflt_team_nth = "
7440 "__kmp_avail_proc(%d)\n",
7441 __kmp_dflt_team_nth));
7445 if (__kmp_dflt_team_nth < KMP_MIN_NTH) {
7446 __kmp_dflt_team_nth = KMP_MIN_NTH;
7448 if (__kmp_dflt_team_nth > __kmp_sys_max_nth) {
7449 __kmp_dflt_team_nth = __kmp_sys_max_nth;
7452 if (__kmp_nesting_mode > 0)
7453 __kmp_set_nesting_mode_threads();
7457 KMP_DEBUG_ASSERT(__kmp_dflt_team_nth <= __kmp_dflt_team_nth_ub);
7459 if (__kmp_dflt_team_nth != prev_dflt_team_nth) {
7464 for (i = 0; i < __kmp_threads_capacity; i++) {
7465 kmp_info_t *thread = __kmp_threads[i];
7468 if (thread->th.th_current_task->td_icvs.nproc != 0)
7471 set__nproc(__kmp_threads[i], __kmp_dflt_team_nth);
7476 (
"__kmp_middle_initialize: final value for __kmp_dflt_team_nth = %d\n",
7477 __kmp_dflt_team_nth));
7479#ifdef KMP_ADJUST_BLOCKTIME
7481 if (!__kmp_env_blocktime && (__kmp_avail_proc > 0)) {
7482 KMP_DEBUG_ASSERT(__kmp_avail_proc > 0);
7483 if (__kmp_nth > __kmp_avail_proc) {
7484 __kmp_zero_bt = TRUE;
7490 TCW_SYNC_4(__kmp_init_middle, TRUE);
7492 KA_TRACE(10, (
"__kmp_do_middle_initialize: exit\n"));
7495void __kmp_middle_initialize(
void) {
7496 if (__kmp_init_middle) {
7499 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
7500 if (__kmp_init_middle) {
7501 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7504 __kmp_do_middle_initialize();
7505 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7508void __kmp_parallel_initialize(
void) {
7509 int gtid = __kmp_entry_gtid();
7512 if (TCR_4(__kmp_init_parallel))
7514 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
7515 if (TCR_4(__kmp_init_parallel)) {
7516 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7521 if (TCR_4(__kmp_global.g.g_done)) {
7524 (
"__kmp_parallel_initialize: attempt to init while shutting down\n"));
7525 __kmp_infinite_loop();
7531 if (!__kmp_init_middle) {
7532 __kmp_do_middle_initialize();
7534 __kmp_assign_root_init_mask();
7535 __kmp_resume_if_hard_paused();
7538 KA_TRACE(10, (
"__kmp_parallel_initialize: enter\n"));
7539 KMP_ASSERT(KMP_UBER_GTID(gtid));
7541#if KMP_ARCH_X86 || KMP_ARCH_X86_64
7544 __kmp_store_x87_fpu_control_word(&__kmp_init_x87_fpu_control_word);
7545 __kmp_store_mxcsr(&__kmp_init_mxcsr);
7546 __kmp_init_mxcsr &= KMP_X86_MXCSR_MASK;
7550#if KMP_HANDLE_SIGNALS
7552 __kmp_install_signals(TRUE);
7556 __kmp_suspend_initialize();
7558#if defined(USE_LOAD_BALANCE)
7559 if (__kmp_global.g.g_dynamic_mode == dynamic_default) {
7560 __kmp_global.g.g_dynamic_mode = dynamic_load_balance;
7563 if (__kmp_global.g.g_dynamic_mode == dynamic_default) {
7564 __kmp_global.g.g_dynamic_mode = dynamic_thread_limit;
7568 if (__kmp_version) {
7569 __kmp_print_version_2();
7573 TCW_SYNC_4(__kmp_init_parallel, TRUE);
7576 KA_TRACE(10, (
"__kmp_parallel_initialize: exit\n"));
7578 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7581void __kmp_hidden_helper_initialize() {
7582 if (TCR_4(__kmp_init_hidden_helper))
7586 if (!TCR_4(__kmp_init_parallel))
7587 __kmp_parallel_initialize();
7591 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
7592 if (TCR_4(__kmp_init_hidden_helper)) {
7593 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7597#if KMP_AFFINITY_SUPPORTED
7601 if (!__kmp_hh_affinity.flags.initialized)
7602 __kmp_affinity_initialize(__kmp_hh_affinity);
7606 KMP_ATOMIC_ST_REL(&__kmp_unexecuted_hidden_helper_tasks, 0);
7610 TCW_SYNC_4(__kmp_init_hidden_helper_threads, TRUE);
7613 __kmp_do_initialize_hidden_helper_threads();
7616 __kmp_hidden_helper_threads_initz_wait();
7619 TCW_SYNC_4(__kmp_init_hidden_helper, TRUE);
7621 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
7626void __kmp_run_before_invoked_task(
int gtid,
int tid, kmp_info_t *this_thr,
7628 kmp_disp_t *dispatch;
7633 this_thr->th.th_local.this_construct = 0;
7635 KMP_CACHE_PREFETCH(&this_thr->th.th_bar[bs_forkjoin_barrier].bb.b_arrived);
7637 dispatch = (kmp_disp_t *)TCR_PTR(this_thr->th.th_dispatch);
7638 KMP_DEBUG_ASSERT(dispatch);
7639 KMP_DEBUG_ASSERT(team->t.t_dispatch);
7643 dispatch->th_disp_index = 0;
7644 dispatch->th_doacross_buf_idx = 0;
7645 if (__kmp_env_consistency_check)
7646 __kmp_push_parallel(gtid, team->t.t_ident);
7651void __kmp_run_after_invoked_task(
int gtid,
int tid, kmp_info_t *this_thr,
7653 if (__kmp_env_consistency_check)
7654 __kmp_pop_parallel(gtid, team->t.t_ident);
7656 __kmp_finish_implicit_task(this_thr);
7659int __kmp_invoke_task_func(
int gtid) {
7661 int tid = __kmp_tid_from_gtid(gtid);
7662 kmp_info_t *this_thr = __kmp_threads[gtid];
7663 kmp_team_t *team = this_thr->th.th_team;
7665 __kmp_run_before_invoked_task(gtid, tid, this_thr, team);
7667 if (__itt_stack_caller_create_ptr) {
7669 if (team->t.t_stack_id != NULL) {
7670 __kmp_itt_stack_callee_enter((__itt_caller)team->t.t_stack_id);
7672 KMP_DEBUG_ASSERT(team->t.t_parent->t.t_stack_id != NULL);
7673 __kmp_itt_stack_callee_enter(
7674 (__itt_caller)team->t.t_parent->t.t_stack_id);
7678#if INCLUDE_SSC_MARKS
7679 SSC_MARK_INVOKING();
7684 void **exit_frame_p;
7685 ompt_data_t *my_task_data;
7686 ompt_data_t *my_parallel_data;
7689 if (ompt_enabled.enabled) {
7690 exit_frame_p = &(team->t.t_implicit_task_taskdata[tid]
7691 .ompt_task_info.frame.exit_frame.ptr);
7693 exit_frame_p = &dummy;
7697 &(team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_data);
7698 my_parallel_data = &(team->t.ompt_team_info.parallel_data);
7699 if (ompt_enabled.ompt_callback_implicit_task) {
7700 ompt_team_size = team->t.t_nproc;
7701 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
7702 ompt_scope_begin, my_parallel_data, my_task_data, ompt_team_size,
7703 __kmp_tid_from_gtid(gtid), ompt_task_implicit);
7704 OMPT_CUR_TASK_INFO(this_thr)->thread_num = __kmp_tid_from_gtid(gtid);
7708#if KMP_STATS_ENABLED
7710 if (previous_state == stats_state_e::TEAMS_REGION) {
7711 KMP_PUSH_PARTITIONED_TIMER(OMP_teams);
7713 KMP_PUSH_PARTITIONED_TIMER(OMP_parallel);
7715 KMP_SET_THREAD_STATE(IMPLICIT_TASK);
7718 rc = __kmp_invoke_microtask((microtask_t)TCR_SYNC_PTR(team->t.t_pkfn), gtid,
7719 tid, (
int)team->t.t_argc, (
void **)team->t.t_argv
7726 *exit_frame_p = NULL;
7727 this_thr->th.ompt_thread_info.parallel_flags = ompt_parallel_team;
7730#if KMP_STATS_ENABLED
7731 if (previous_state == stats_state_e::TEAMS_REGION) {
7732 KMP_SET_THREAD_STATE(previous_state);
7734 KMP_POP_PARTITIONED_TIMER();
7738 if (__itt_stack_caller_create_ptr) {
7740 if (team->t.t_stack_id != NULL) {
7741 __kmp_itt_stack_callee_leave((__itt_caller)team->t.t_stack_id);
7743 KMP_DEBUG_ASSERT(team->t.t_parent->t.t_stack_id != NULL);
7744 __kmp_itt_stack_callee_leave(
7745 (__itt_caller)team->t.t_parent->t.t_stack_id);
7749 __kmp_run_after_invoked_task(gtid, tid, this_thr, team);
7754void __kmp_teams_master(
int gtid) {
7756 kmp_info_t *thr = __kmp_threads[gtid];
7757 kmp_team_t *team = thr->th.th_team;
7758 ident_t *loc = team->t.t_ident;
7759 thr->th.th_set_nproc = thr->th.th_teams_size.nth;
7760 KMP_DEBUG_ASSERT(thr->th.th_teams_microtask);
7761 KMP_DEBUG_ASSERT(thr->th.th_set_nproc);
7762 KA_TRACE(20, (
"__kmp_teams_master: T#%d, Tid %d, microtask %p\n", gtid,
7763 __kmp_tid_from_gtid(gtid), thr->th.th_teams_microtask));
7766 kmp_cg_root_t *tmp = (kmp_cg_root_t *)__kmp_allocate(
sizeof(kmp_cg_root_t));
7769 tmp->cg_thread_limit = thr->th.th_current_task->td_icvs.thread_limit;
7770 tmp->cg_nthreads = 1;
7771 KA_TRACE(100, (
"__kmp_teams_master: Thread %p created node %p and init"
7772 " cg_nthreads to 1\n",
7774 tmp->up = thr->th.th_cg_roots;
7775 thr->th.th_cg_roots = tmp;
7779#if INCLUDE_SSC_MARKS
7782 __kmp_fork_call(loc, gtid, fork_context_intel, team->t.t_argc,
7783 (microtask_t)thr->th.th_teams_microtask,
7784 VOLATILE_CAST(launch_t) __kmp_invoke_task_func, NULL);
7785#if INCLUDE_SSC_MARKS
7789 if (thr->th.th_team_nproc < thr->th.th_teams_size.nth)
7790 thr->th.th_teams_size.nth = thr->th.th_team_nproc;
7793 __kmp_join_call(loc, gtid
7802int __kmp_invoke_teams_master(
int gtid) {
7803 kmp_info_t *this_thr = __kmp_threads[gtid];
7804 kmp_team_t *team = this_thr->th.th_team;
7806 if (!__kmp_threads[gtid]->th.th_team->t.t_serialized)
7807 KMP_DEBUG_ASSERT((
void *)__kmp_threads[gtid]->th.th_team->t.t_pkfn ==
7808 (
void *)__kmp_teams_master);
7810 __kmp_run_before_invoked_task(gtid, 0, this_thr, team);
7812 int tid = __kmp_tid_from_gtid(gtid);
7813 ompt_data_t *task_data =
7814 &team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_data;
7815 ompt_data_t *parallel_data = &team->t.ompt_team_info.parallel_data;
7816 if (ompt_enabled.ompt_callback_implicit_task) {
7817 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
7818 ompt_scope_begin, parallel_data, task_data, team->t.t_nproc, tid,
7820 OMPT_CUR_TASK_INFO(this_thr)->thread_num = tid;
7823 __kmp_teams_master(gtid);
7825 this_thr->th.ompt_thread_info.parallel_flags = ompt_parallel_league;
7827 __kmp_run_after_invoked_task(gtid, 0, this_thr, team);
7835void __kmp_push_num_threads(
ident_t *
id,
int gtid,
int num_threads) {
7836 kmp_info_t *thr = __kmp_threads[gtid];
7838 if (num_threads > 0)
7839 thr->th.th_set_nproc = num_threads;
7842void __kmp_push_num_threads_list(
ident_t *
id,
int gtid, kmp_uint32 list_length,
7843 int *num_threads_list) {
7844 kmp_info_t *thr = __kmp_threads[gtid];
7846 KMP_DEBUG_ASSERT(list_length > 1);
7848 if (num_threads_list[0] > 0)
7849 thr->th.th_set_nproc = num_threads_list[0];
7850 thr->th.th_set_nested_nth =
7851 (
int *)KMP_INTERNAL_MALLOC(list_length *
sizeof(
int));
7852 for (kmp_uint32 i = 0; i < list_length; ++i)
7853 thr->th.th_set_nested_nth[i] = num_threads_list[i];
7854 thr->th.th_set_nested_nth_sz = list_length;
7857void __kmp_set_strict_num_threads(
ident_t *loc,
int gtid,
int sev,
7859 kmp_info_t *thr = __kmp_threads[gtid];
7860 thr->th.th_nt_strict =
true;
7861 thr->th.th_nt_loc = loc;
7863 if (sev == severity_warning)
7864 thr->th.th_nt_sev = sev;
7866 thr->th.th_nt_sev = severity_fatal;
7869 thr->th.th_nt_msg = msg;
7871 thr->th.th_nt_msg =
"Cannot form team with number of threads specified by "
7872 "strict num_threads clause.";
7875static void __kmp_push_thread_limit(kmp_info_t *thr,
int num_teams,
7877 KMP_DEBUG_ASSERT(thr);
7879 if (!TCR_4(__kmp_init_middle))
7880 __kmp_middle_initialize();
7881 __kmp_assign_root_init_mask();
7882 KMP_DEBUG_ASSERT(__kmp_avail_proc);
7883 KMP_DEBUG_ASSERT(__kmp_dflt_team_nth);
7885 if (num_threads == 0) {
7886 if (__kmp_teams_thread_limit > 0) {
7887 num_threads = __kmp_teams_thread_limit;
7889 num_threads = __kmp_avail_proc / num_teams;
7894 if (num_threads > __kmp_dflt_team_nth) {
7895 num_threads = __kmp_dflt_team_nth;
7897 if (num_threads > thr->th.th_current_task->td_icvs.thread_limit) {
7898 num_threads = thr->th.th_current_task->td_icvs.thread_limit;
7900 if (num_teams * num_threads > __kmp_teams_max_nth) {
7901 num_threads = __kmp_teams_max_nth / num_teams;
7903 if (num_threads == 0) {
7907 if (num_threads < 0) {
7908 __kmp_msg(kmp_ms_warning, KMP_MSG(CantFormThrTeam, num_threads, 1),
7914 thr->th.th_current_task->td_icvs.thread_limit = num_threads;
7916 if (num_threads > __kmp_dflt_team_nth) {
7917 num_threads = __kmp_dflt_team_nth;
7919 if (num_teams * num_threads > __kmp_teams_max_nth) {
7920 int new_threads = __kmp_teams_max_nth / num_teams;
7921 if (new_threads == 0) {
7924 if (new_threads != num_threads) {
7925 if (!__kmp_reserve_warn) {
7926 __kmp_reserve_warn = 1;
7927 __kmp_msg(kmp_ms_warning,
7928 KMP_MSG(CantFormThrTeam, num_threads, new_threads),
7929 KMP_HNT(Unset_ALL_THREADS), __kmp_msg_null);
7932 num_threads = new_threads;
7935 thr->th.th_teams_size.nth = num_threads;
7940void __kmp_push_num_teams(
ident_t *
id,
int gtid,
int num_teams,
7942 kmp_info_t *thr = __kmp_threads[gtid];
7943 if (num_teams < 0) {
7946 __kmp_msg(kmp_ms_warning, KMP_MSG(NumTeamsNotPositive, num_teams, 1),
7950 if (num_teams == 0) {
7951 if (__kmp_nteams > 0) {
7952 num_teams = __kmp_nteams;
7957 if (num_teams > __kmp_teams_max_nth) {
7958 if (!__kmp_reserve_warn) {
7959 __kmp_reserve_warn = 1;
7960 __kmp_msg(kmp_ms_warning,
7961 KMP_MSG(CantFormThrTeam, num_teams, __kmp_teams_max_nth),
7962 KMP_HNT(Unset_ALL_THREADS), __kmp_msg_null);
7964 num_teams = __kmp_teams_max_nth;
7968 thr->th.th_set_nproc = thr->th.th_teams_size.nteams = num_teams;
7970 __kmp_push_thread_limit(thr, num_teams, num_threads);
7975void __kmp_push_num_teams_51(
ident_t *
id,
int gtid,
int num_teams_lb,
7976 int num_teams_ub,
int num_threads) {
7977 kmp_info_t *thr = __kmp_threads[gtid];
7978 KMP_DEBUG_ASSERT(num_teams_lb >= 0 && num_teams_ub >= 0);
7979 KMP_DEBUG_ASSERT(num_teams_ub >= num_teams_lb);
7980 KMP_DEBUG_ASSERT(num_threads >= 0);
7982 if (num_teams_lb > num_teams_ub) {
7983 __kmp_fatal(KMP_MSG(FailedToCreateTeam, num_teams_lb, num_teams_ub),
7984 KMP_HNT(SetNewBound, __kmp_teams_max_nth), __kmp_msg_null);
7989 if (num_teams_lb == 0 && num_teams_ub > 0)
7990 num_teams_lb = num_teams_ub;
7992 if (num_teams_lb == 0 && num_teams_ub == 0) {
7993 num_teams = (__kmp_nteams > 0) ? __kmp_nteams : num_teams;
7994 if (num_teams > __kmp_teams_max_nth) {
7995 if (!__kmp_reserve_warn) {
7996 __kmp_reserve_warn = 1;
7997 __kmp_msg(kmp_ms_warning,
7998 KMP_MSG(CantFormThrTeam, num_teams, __kmp_teams_max_nth),
7999 KMP_HNT(Unset_ALL_THREADS), __kmp_msg_null);
8001 num_teams = __kmp_teams_max_nth;
8003 }
else if (num_teams_lb == num_teams_ub) {
8004 num_teams = num_teams_ub;
8006 if (num_threads <= 0) {
8007 if (num_teams_ub > __kmp_teams_max_nth) {
8008 num_teams = num_teams_lb;
8010 num_teams = num_teams_ub;
8013 num_teams = (num_threads > __kmp_teams_max_nth)
8015 : __kmp_teams_max_nth / num_threads;
8016 if (num_teams < num_teams_lb) {
8017 num_teams = num_teams_lb;
8018 }
else if (num_teams > num_teams_ub) {
8019 num_teams = num_teams_ub;
8025 thr->th.th_set_nproc = thr->th.th_teams_size.nteams = num_teams;
8027 __kmp_push_thread_limit(thr, num_teams, num_threads);
8031void __kmp_push_proc_bind(
ident_t *
id,
int gtid, kmp_proc_bind_t proc_bind) {
8032 kmp_info_t *thr = __kmp_threads[gtid];
8033 thr->th.th_set_proc_bind = proc_bind;
8038void __kmp_internal_fork(
ident_t *
id,
int gtid, kmp_team_t *team) {
8039 kmp_info_t *this_thr = __kmp_threads[gtid];
8045 KMP_DEBUG_ASSERT(team);
8046 KMP_DEBUG_ASSERT(this_thr->th.th_team == team);
8047 KMP_ASSERT(KMP_MASTER_GTID(gtid));
8050 team->t.t_construct = 0;
8051 team->t.t_ordered.dt.t_value =
8055 KMP_DEBUG_ASSERT(team->t.t_disp_buffer);
8056 if (team->t.t_max_nproc > 1) {
8058 for (i = 0; i < __kmp_dispatch_num_buffers; ++i) {
8059 team->t.t_disp_buffer[i].buffer_index = i;
8060 team->t.t_disp_buffer[i].doacross_buf_idx = i;
8063 team->t.t_disp_buffer[0].buffer_index = 0;
8064 team->t.t_disp_buffer[0].doacross_buf_idx = 0;
8068 KMP_ASSERT(this_thr->th.th_team == team);
8071 for (f = 0; f < team->t.t_nproc; f++) {
8072 KMP_DEBUG_ASSERT(team->t.t_threads[f] &&
8073 team->t.t_threads[f]->th.th_team_nproc == team->t.t_nproc);
8078 __kmp_fork_barrier(gtid, 0);
8081void __kmp_internal_join(
ident_t *
id,
int gtid, kmp_team_t *team) {
8082 kmp_info_t *this_thr = __kmp_threads[gtid];
8084 KMP_DEBUG_ASSERT(team);
8085 KMP_DEBUG_ASSERT(this_thr->th.th_team == team);
8086 KMP_ASSERT(KMP_MASTER_GTID(gtid));
8092 if (__kmp_threads[gtid] &&
8093 __kmp_threads[gtid]->th.th_team_nproc != team->t.t_nproc) {
8094 __kmp_printf(
"GTID: %d, __kmp_threads[%d]=%p\n", gtid, gtid,
8095 __kmp_threads[gtid]);
8096 __kmp_printf(
"__kmp_threads[%d]->th.th_team_nproc=%d, TEAM: %p, "
8097 "team->t.t_nproc=%d\n",
8098 gtid, __kmp_threads[gtid]->th.th_team_nproc, team,
8100 __kmp_print_structure();
8102 KMP_DEBUG_ASSERT(__kmp_threads[gtid] &&
8103 __kmp_threads[gtid]->th.th_team_nproc == team->t.t_nproc);
8106 __kmp_join_barrier(gtid);
8108 ompt_state_t ompt_state = this_thr->th.ompt_thread_info.state;
8109 if (ompt_enabled.enabled &&
8110 (ompt_state == ompt_state_wait_barrier_teams ||
8111 ompt_state == ompt_state_wait_barrier_implicit_parallel)) {
8112 int ds_tid = this_thr->th.th_info.ds.ds_tid;
8113 ompt_data_t *task_data = OMPT_CUR_TASK_DATA(this_thr);
8114 this_thr->th.ompt_thread_info.state = ompt_state_overhead;
8116 void *codeptr = NULL;
8117 if (KMP_MASTER_TID(ds_tid) &&
8118 (ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait) ||
8119 ompt_callbacks.ompt_callback(ompt_callback_sync_region)))
8120 codeptr = OMPT_CUR_TEAM_INFO(this_thr)->master_return_address;
8122 ompt_sync_region_t sync_kind = ompt_sync_region_barrier_implicit_parallel;
8123 if (this_thr->th.ompt_thread_info.parallel_flags & ompt_parallel_league)
8124 sync_kind = ompt_sync_region_barrier_teams;
8125 if (ompt_enabled.ompt_callback_sync_region_wait) {
8126 ompt_callbacks.ompt_callback(ompt_callback_sync_region_wait)(
8127 sync_kind, ompt_scope_end, NULL, task_data, codeptr);
8129 if (ompt_enabled.ompt_callback_sync_region) {
8130 ompt_callbacks.ompt_callback(ompt_callback_sync_region)(
8131 sync_kind, ompt_scope_end, NULL, task_data, codeptr);
8134 if (!KMP_MASTER_TID(ds_tid) && ompt_enabled.ompt_callback_implicit_task) {
8135 ompt_callbacks.ompt_callback(ompt_callback_implicit_task)(
8136 ompt_scope_end, NULL, task_data, 0, ds_tid,
8137 ompt_task_implicit);
8143 KMP_ASSERT(this_thr->th.th_team == team);
8148#ifdef USE_LOAD_BALANCE
8152static int __kmp_active_hot_team_nproc(kmp_root_t *root) {
8155 kmp_team_t *hot_team;
8157 if (root->r.r_active) {
8160 hot_team = root->r.r_hot_team;
8161 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
8162 return hot_team->t.t_nproc - 1;
8167 for (i = 1; i < hot_team->t.t_nproc; i++) {
8168 if (hot_team->t.t_threads[i]->th.th_active) {
8177static int __kmp_load_balance_nproc(kmp_root_t *root,
int set_nproc) {
8180 int hot_team_active;
8181 int team_curr_active;
8184 KB_TRACE(20, (
"__kmp_load_balance_nproc: called root:%p set_nproc:%d\n", root,
8186 KMP_DEBUG_ASSERT(root);
8187 KMP_DEBUG_ASSERT(root->r.r_root_team->t.t_threads[0]
8188 ->th.th_current_task->td_icvs.dynamic == TRUE);
8189 KMP_DEBUG_ASSERT(set_nproc > 1);
8191 if (set_nproc == 1) {
8192 KB_TRACE(20, (
"__kmp_load_balance_nproc: serial execution.\n"));
8201 pool_active = __kmp_thread_pool_active_nth;
8202 hot_team_active = __kmp_active_hot_team_nproc(root);
8203 team_curr_active = pool_active + hot_team_active + 1;
8206 system_active = __kmp_get_load_balance(__kmp_avail_proc + team_curr_active);
8207 KB_TRACE(30, (
"__kmp_load_balance_nproc: system active = %d pool active = %d "
8208 "hot team active = %d\n",
8209 system_active, pool_active, hot_team_active));
8211 if (system_active < 0) {
8215 __kmp_global.g.g_dynamic_mode = dynamic_thread_limit;
8216 KMP_WARNING(CantLoadBalUsing,
"KMP_DYNAMIC_MODE=thread limit");
8219 retval = __kmp_avail_proc - __kmp_nth +
8220 (root->r.r_active ? 1 : root->r.r_hot_team->t.t_nproc);
8221 if (retval > set_nproc) {
8224 if (retval < KMP_MIN_NTH) {
8225 retval = KMP_MIN_NTH;
8228 KB_TRACE(20, (
"__kmp_load_balance_nproc: thread limit exit. retval:%d\n",
8236 if (system_active < team_curr_active) {
8237 system_active = team_curr_active;
8239 retval = __kmp_avail_proc - system_active + team_curr_active;
8240 if (retval > set_nproc) {
8243 if (retval < KMP_MIN_NTH) {
8244 retval = KMP_MIN_NTH;
8247 KB_TRACE(20, (
"__kmp_load_balance_nproc: exit. retval:%d\n", retval));
8256void __kmp_cleanup(
void) {
8259 KA_TRACE(10, (
"__kmp_cleanup: enter\n"));
8261 if (TCR_4(__kmp_init_parallel)) {
8262#if KMP_HANDLE_SIGNALS
8263 __kmp_remove_signals();
8265 TCW_4(__kmp_init_parallel, FALSE);
8268 if (TCR_4(__kmp_init_middle)) {
8269#if KMP_AFFINITY_SUPPORTED
8270 __kmp_affinity_uninitialize();
8272 __kmp_cleanup_hierarchy();
8273 TCW_4(__kmp_init_middle, FALSE);
8276 KA_TRACE(10, (
"__kmp_cleanup: go serial cleanup\n"));
8278 if (__kmp_init_serial) {
8279 __kmp_runtime_destroy();
8280 __kmp_init_serial = FALSE;
8283 __kmp_cleanup_threadprivate_caches();
8285 for (f = 0; f < __kmp_threads_capacity; f++) {
8286 if (__kmp_root[f] != NULL) {
8287 __kmp_free(__kmp_root[f]);
8288 __kmp_root[f] = NULL;
8291 __kmp_free(__kmp_threads);
8294 __kmp_threads = NULL;
8296 __kmp_threads_capacity = 0;
8299 kmp_old_threads_list_t *ptr = __kmp_old_threads_list;
8301 kmp_old_threads_list_t *next = ptr->next;
8302 __kmp_free(ptr->threads);
8306 __kmp_old_threads_list = NULL;
8308#if KMP_USE_DYNAMIC_LOCK
8309 __kmp_cleanup_indirect_user_locks();
8311 __kmp_cleanup_user_locks();
8314 if (ompd_env_block) {
8315 __kmp_free(ompd_env_block);
8316 ompd_env_block = NULL;
8317 ompd_env_block_size = 0;
8321#if KMP_AFFINITY_SUPPORTED
8322 KMP_INTERNAL_FREE(CCAST(
char *, __kmp_cpuinfo_file));
8323 __kmp_cpuinfo_file = NULL;
8326#if KMP_USE_ADAPTIVE_LOCKS
8327#if KMP_DEBUG_ADAPTIVE_LOCKS
8328 __kmp_print_speculative_stats();
8331 KMP_INTERNAL_FREE(__kmp_nested_nth.nth);
8332 __kmp_nested_nth.nth = NULL;
8333 __kmp_nested_nth.size = 0;
8334 __kmp_nested_nth.used = 0;
8336 KMP_INTERNAL_FREE(__kmp_nested_proc_bind.bind_types);
8337 __kmp_nested_proc_bind.bind_types = NULL;
8338 __kmp_nested_proc_bind.size = 0;
8339 __kmp_nested_proc_bind.used = 0;
8340 __kmp_dflt_team_nth = 0;
8341 __kmp_dflt_team_nth_ub = 0;
8342 if (__kmp_affinity_format) {
8343 KMP_INTERNAL_FREE(__kmp_affinity_format);
8344 __kmp_affinity_format = NULL;
8347 __kmp_i18n_catclose();
8349 if (__kmp_nesting_nth_level)
8350 KMP_INTERNAL_FREE(__kmp_nesting_nth_level);
8352#if KMP_USE_HIER_SCHED
8353 __kmp_hier_scheds.deallocate();
8356#if KMP_STATS_ENABLED
8360 __kmpc_destroy_allocator(KMP_GTID_SHUTDOWN, __kmp_def_allocator);
8361 __kmp_def_allocator = omp_default_mem_alloc;
8363 KA_TRACE(10, (
"__kmp_cleanup: exit\n"));
8368int __kmp_ignore_mppbeg(
void) {
8371 if ((env = getenv(
"KMP_IGNORE_MPPBEG")) != NULL) {
8372 if (__kmp_str_match_false(env))
8379int __kmp_ignore_mppend(
void) {
8382 if ((env = getenv(
"KMP_IGNORE_MPPEND")) != NULL) {
8383 if (__kmp_str_match_false(env))
8390void __kmp_internal_begin(
void) {
8396 gtid = __kmp_entry_gtid();
8397 root = __kmp_threads[gtid]->th.th_root;
8398 KMP_ASSERT(KMP_UBER_GTID(gtid));
8400 if (root->r.r_begin)
8402 __kmp_acquire_lock(&root->r.r_begin_lock, gtid);
8403 if (root->r.r_begin) {
8404 __kmp_release_lock(&root->r.r_begin_lock, gtid);
8408 root->r.r_begin = TRUE;
8410 __kmp_release_lock(&root->r.r_begin_lock, gtid);
8415void __kmp_user_set_library(
enum library_type arg) {
8422 gtid = __kmp_entry_gtid();
8423 thread = __kmp_threads[gtid];
8425 root = thread->th.th_root;
8427 KA_TRACE(20, (
"__kmp_user_set_library: enter T#%d, arg: %d, %d\n", gtid, arg,
8429 if (root->r.r_in_parallel) {
8431 KMP_WARNING(SetLibraryIncorrectCall);
8436 case library_serial:
8437 thread->th.th_set_nproc = 0;
8438 set__nproc(thread, 1);
8440 case library_turnaround:
8441 thread->th.th_set_nproc = 0;
8442 set__nproc(thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth
8443 : __kmp_dflt_team_nth_ub);
8445 case library_throughput:
8446 thread->th.th_set_nproc = 0;
8447 set__nproc(thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth
8448 : __kmp_dflt_team_nth_ub);
8451 KMP_FATAL(UnknownLibraryType, arg);
8454 __kmp_aux_set_library(arg);
8457void __kmp_aux_set_stacksize(
size_t arg) {
8458 if (!__kmp_init_serial)
8459 __kmp_serial_initialize();
8462 if (arg & (0x1000 - 1)) {
8463 arg &= ~(0x1000 - 1);
8468 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
8471 if (!TCR_4(__kmp_init_parallel)) {
8474 if (value < __kmp_sys_min_stksize)
8475 value = __kmp_sys_min_stksize;
8476 else if (value > KMP_MAX_STKSIZE)
8477 value = KMP_MAX_STKSIZE;
8479 __kmp_stksize = value;
8481 __kmp_env_stksize = TRUE;
8484 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
8489void __kmp_aux_set_library(
enum library_type arg) {
8490 __kmp_library = arg;
8492 switch (__kmp_library) {
8493 case library_serial: {
8494 KMP_INFORM(LibraryIsSerial);
8496 case library_turnaround:
8497 if (__kmp_use_yield == 1 && !__kmp_use_yield_exp_set)
8498 __kmp_use_yield = 2;
8500 case library_throughput:
8501 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME)
8502 __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
8505 KMP_FATAL(UnknownLibraryType, arg);
8511static kmp_team_t *__kmp_aux_get_team_info(
int &teams_serialized) {
8512 kmp_info_t *thr = __kmp_entry_thread();
8513 teams_serialized = 0;
8514 if (thr->th.th_teams_microtask) {
8515 kmp_team_t *team = thr->th.th_team;
8516 int tlevel = thr->th.th_teams_level;
8517 int ii = team->t.t_level;
8518 teams_serialized = team->t.t_serialized;
8519 int level = tlevel + 1;
8520 KMP_DEBUG_ASSERT(ii >= tlevel);
8521 while (ii > level) {
8522 for (teams_serialized = team->t.t_serialized;
8523 (teams_serialized > 0) && (ii > level); teams_serialized--, ii--) {
8525 if (team->t.t_serialized && (!teams_serialized)) {
8526 team = team->t.t_parent;
8530 team = team->t.t_parent;
8539int __kmp_aux_get_team_num() {
8541 kmp_team_t *team = __kmp_aux_get_team_info(serialized);
8543 if (serialized > 1) {
8546 return team->t.t_master_tid;
8552int __kmp_aux_get_num_teams() {
8554 kmp_team_t *team = __kmp_aux_get_team_info(serialized);
8556 if (serialized > 1) {
8559 return team->t.t_parent->t.t_nproc;
8598typedef struct kmp_affinity_format_field_t {
8600 const char *long_name;
8603} kmp_affinity_format_field_t;
8605static const kmp_affinity_format_field_t __kmp_affinity_format_table[] = {
8606#if KMP_AFFINITY_SUPPORTED
8607 {
'A',
"thread_affinity",
's'},
8609 {
't',
"team_num",
'd'},
8610 {
'T',
"num_teams",
'd'},
8611 {
'L',
"nesting_level",
'd'},
8612 {
'n',
"thread_num",
'd'},
8613 {
'N',
"num_threads",
'd'},
8614 {
'a',
"ancestor_tnum",
'd'},
8616 {
'P',
"process_id",
'd'},
8617 {
'i',
"native_thread_id",
'd'}};
8620static int __kmp_aux_capture_affinity_field(
int gtid,
const kmp_info_t *th,
8622 kmp_str_buf_t *field_buffer) {
8623 int rc, format_index, field_value;
8624 const char *width_left, *width_right;
8625 bool pad_zeros, right_justify, parse_long_name, found_valid_name;
8626 static const int FORMAT_SIZE = 20;
8627 char format[FORMAT_SIZE] = {0};
8628 char absolute_short_name = 0;
8630 KMP_DEBUG_ASSERT(gtid >= 0);
8631 KMP_DEBUG_ASSERT(th);
8632 KMP_DEBUG_ASSERT(**ptr ==
'%');
8633 KMP_DEBUG_ASSERT(field_buffer);
8635 __kmp_str_buf_clear(field_buffer);
8642 __kmp_str_buf_cat(field_buffer,
"%", 1);
8653 right_justify =
false;
8655 right_justify =
true;
8659 width_left = width_right = NULL;
8660 if (**ptr >=
'0' && **ptr <=
'9') {
8668 format[format_index++] =
'%';
8670 format[format_index++] =
'-';
8672 format[format_index++] =
'0';
8673 if (width_left && width_right) {
8677 while (i < 8 && width_left < width_right) {
8678 format[format_index++] = *width_left;
8686 found_valid_name =
false;
8687 parse_long_name = (**ptr ==
'{');
8688 if (parse_long_name)
8690 for (
size_t i = 0; i <
sizeof(__kmp_affinity_format_table) /
8691 sizeof(__kmp_affinity_format_table[0]);
8693 char short_name = __kmp_affinity_format_table[i].short_name;
8694 const char *long_name = __kmp_affinity_format_table[i].long_name;
8695 char field_format = __kmp_affinity_format_table[i].field_format;
8696 if (parse_long_name) {
8697 size_t length = KMP_STRLEN(long_name);
8698 if (strncmp(*ptr, long_name, length) == 0) {
8699 found_valid_name =
true;
8702 }
else if (**ptr == short_name) {
8703 found_valid_name =
true;
8706 if (found_valid_name) {
8707 format[format_index++] = field_format;
8708 format[format_index++] =
'\0';
8709 absolute_short_name = short_name;
8713 if (parse_long_name) {
8715 absolute_short_name = 0;
8723 switch (absolute_short_name) {
8725 rc = __kmp_str_buf_print(field_buffer, format, __kmp_aux_get_team_num());
8728 rc = __kmp_str_buf_print(field_buffer, format, __kmp_aux_get_num_teams());
8731 rc = __kmp_str_buf_print(field_buffer, format, th->th.th_team->t.t_level);
8734 rc = __kmp_str_buf_print(field_buffer, format, __kmp_tid_from_gtid(gtid));
8737 static const int BUFFER_SIZE = 256;
8738 char buf[BUFFER_SIZE];
8739 __kmp_expand_host_name(buf, BUFFER_SIZE);
8740 rc = __kmp_str_buf_print(field_buffer, format, buf);
8743 rc = __kmp_str_buf_print(field_buffer, format, getpid());
8746 rc = __kmp_str_buf_print(field_buffer, format, __kmp_gettid());
8749 rc = __kmp_str_buf_print(field_buffer, format, th->th.th_team->t.t_nproc);
8753 __kmp_get_ancestor_thread_num(gtid, th->th.th_team->t.t_level - 1);
8754 rc = __kmp_str_buf_print(field_buffer, format, field_value);
8756#if KMP_AFFINITY_SUPPORTED
8758 if (th->th.th_affin_mask) {
8760 __kmp_str_buf_init(&buf);
8761 __kmp_affinity_str_buf_mask(&buf, th->th.th_affin_mask);
8762 rc = __kmp_str_buf_print(field_buffer, format, buf.str);
8763 __kmp_str_buf_free(&buf);
8765 rc = __kmp_str_buf_print(field_buffer,
"%s",
"disabled");
8772 rc = __kmp_str_buf_print(field_buffer,
"%s",
"undefined");
8774 if (parse_long_name) {
8783 KMP_ASSERT(format_index <= FORMAT_SIZE);
8793size_t __kmp_aux_capture_affinity(
int gtid,
const char *format,
8794 kmp_str_buf_t *buffer) {
8795 const char *parse_ptr;
8797 const kmp_info_t *th;
8798 kmp_str_buf_t field;
8800 KMP_DEBUG_ASSERT(buffer);
8801 KMP_DEBUG_ASSERT(gtid >= 0);
8803 __kmp_str_buf_init(&field);
8804 __kmp_str_buf_clear(buffer);
8806 th = __kmp_threads[gtid];
8812 if (parse_ptr == NULL || *parse_ptr ==
'\0') {
8813 parse_ptr = __kmp_affinity_format;
8815 KMP_DEBUG_ASSERT(parse_ptr);
8817 while (*parse_ptr !=
'\0') {
8819 if (*parse_ptr ==
'%') {
8821 int rc = __kmp_aux_capture_affinity_field(gtid, th, &parse_ptr, &field);
8822 __kmp_str_buf_catbuf(buffer, &field);
8826 __kmp_str_buf_cat(buffer, parse_ptr, 1);
8831 __kmp_str_buf_free(&field);
8836void __kmp_aux_display_affinity(
int gtid,
const char *format) {
8838 __kmp_str_buf_init(&buf);
8839 __kmp_aux_capture_affinity(gtid, format, &buf);
8840 __kmp_fprintf(kmp_out,
"%s" KMP_END_OF_LINE, buf.str);
8841 __kmp_str_buf_free(&buf);
8845void __kmp_aux_set_blocktime(
int arg, kmp_info_t *thread,
int tid) {
8846 int blocktime = arg;
8852 __kmp_save_internal_controls(thread);
8855 if (blocktime < KMP_MIN_BLOCKTIME)
8856 blocktime = KMP_MIN_BLOCKTIME;
8857 else if (blocktime > KMP_MAX_BLOCKTIME)
8858 blocktime = KMP_MAX_BLOCKTIME;
8860 set__blocktime_team(thread->th.th_team, tid, blocktime);
8861 set__blocktime_team(thread->th.th_serial_team, 0, blocktime);
8865 bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME(blocktime, __kmp_monitor_wakeups);
8867 set__bt_intervals_team(thread->th.th_team, tid, bt_intervals);
8868 set__bt_intervals_team(thread->th.th_serial_team, 0, bt_intervals);
8874 set__bt_set_team(thread->th.th_team, tid, bt_set);
8875 set__bt_set_team(thread->th.th_serial_team, 0, bt_set);
8877 KF_TRACE(10, (
"kmp_set_blocktime: T#%d(%d:%d), blocktime=%d, "
8878 "bt_intervals=%d, monitor_updates=%d\n",
8879 __kmp_gtid_from_tid(tid, thread->th.th_team),
8880 thread->th.th_team->t.t_id, tid, blocktime, bt_intervals,
8881 __kmp_monitor_wakeups));
8883 KF_TRACE(10, (
"kmp_set_blocktime: T#%d(%d:%d), blocktime=%d\n",
8884 __kmp_gtid_from_tid(tid, thread->th.th_team),
8885 thread->th.th_team->t.t_id, tid, blocktime));
8889void __kmp_aux_set_defaults(
char const *str,
size_t len) {
8890 if (!__kmp_init_serial) {
8891 __kmp_serial_initialize();
8893 __kmp_env_initialize(str);
8895 if (__kmp_settings || __kmp_display_env || __kmp_display_env_verbose) {
8903PACKED_REDUCTION_METHOD_T
8904__kmp_determine_reduction_method(
8905 ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars,
size_t reduce_size,
8906 void *reduce_data,
void (*reduce_func)(
void *lhs_data,
void *rhs_data),
8907 kmp_critical_name *lck) {
8918 PACKED_REDUCTION_METHOD_T retval;
8922 KMP_DEBUG_ASSERT(lck);
8924#define FAST_REDUCTION_ATOMIC_METHOD_GENERATED \
8926 ((loc->flags & (KMP_IDENT_ATOMIC_REDUCE)) == (KMP_IDENT_ATOMIC_REDUCE)))
8927#define FAST_REDUCTION_TREE_METHOD_GENERATED ((reduce_data) && (reduce_func))
8929 retval = critical_reduce_block;
8932 team_size = __kmp_get_team_num_threads(global_tid);
8933 if (team_size == 1) {
8935 retval = empty_reduce_block;
8939 int atomic_available = FAST_REDUCTION_ATOMIC_METHOD_GENERATED;
8941#if KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \
8942 KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
8943 KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_WASM32 || KMP_ARCH_WASM64 || \
8946#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
8947 KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HAIKU || \
8948 KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
8950 int teamsize_cutoff = 4;
8952#if KMP_MIC_SUPPORTED
8953 if (__kmp_mic_type != non_mic) {
8954 teamsize_cutoff = 8;
8957 int tree_available = FAST_REDUCTION_TREE_METHOD_GENERATED;
8958 if (tree_available) {
8959 if (team_size <= teamsize_cutoff) {
8960 if (atomic_available) {
8961 retval = atomic_reduce_block;
8964 retval = TREE_REDUCE_BLOCK_WITH_REDUCTION_BARRIER;
8966 }
else if (atomic_available) {
8967 retval = atomic_reduce_block;
8970#error "Unknown or unsupported OS"
8975#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS || \
8976 KMP_ARCH_PPC || KMP_ARCH_AARCH64_32 || KMP_ARCH_SPARC
8978#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
8979 KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HAIKU || KMP_OS_HURD || \
8980 KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
8984 if (atomic_available) {
8985 if (num_vars <= 2) {
8986 retval = atomic_reduce_block;
8992 int tree_available = FAST_REDUCTION_TREE_METHOD_GENERATED;
8993 if (atomic_available && (num_vars <= 3)) {
8994 retval = atomic_reduce_block;
8995 }
else if (tree_available) {
8996 if ((reduce_size > (9 *
sizeof(kmp_real64))) &&
8997 (reduce_size < (2000 *
sizeof(kmp_real64)))) {
8998 retval = TREE_REDUCE_BLOCK_WITH_PLAIN_BARRIER;
9003#error "Unknown or unsupported OS"
9007#error "Unknown or unsupported architecture"
9015 if (__kmp_force_reduction_method != reduction_method_not_defined &&
9018 PACKED_REDUCTION_METHOD_T forced_retval = critical_reduce_block;
9020 int atomic_available, tree_available;
9022 switch ((forced_retval = __kmp_force_reduction_method)) {
9023 case critical_reduce_block:
9027 case atomic_reduce_block:
9028 atomic_available = FAST_REDUCTION_ATOMIC_METHOD_GENERATED;
9029 if (!atomic_available) {
9030 KMP_WARNING(RedMethodNotSupported,
"atomic");
9031 forced_retval = critical_reduce_block;
9035 case tree_reduce_block:
9036 tree_available = FAST_REDUCTION_TREE_METHOD_GENERATED;
9037 if (!tree_available) {
9038 KMP_WARNING(RedMethodNotSupported,
"tree");
9039 forced_retval = critical_reduce_block;
9041#if KMP_FAST_REDUCTION_BARRIER
9042 forced_retval = TREE_REDUCE_BLOCK_WITH_REDUCTION_BARRIER;
9051 retval = forced_retval;
9054 KA_TRACE(10, (
"reduction method selected=%08x\n", retval));
9056#undef FAST_REDUCTION_TREE_METHOD_GENERATED
9057#undef FAST_REDUCTION_ATOMIC_METHOD_GENERATED
9062kmp_int32 __kmp_get_reduce_method(
void) {
9063 return ((__kmp_entry_thread()->th.th_local.packed_reduction_method) >> 8);
9068void __kmp_soft_pause() { __kmp_pause_status = kmp_soft_paused; }
9072void __kmp_hard_pause() {
9073 __kmp_pause_status = kmp_hard_paused;
9074 __kmp_internal_end_thread(-1);
9078void __kmp_resume_if_soft_paused() {
9079 if (__kmp_pause_status == kmp_soft_paused) {
9080 __kmp_pause_status = kmp_not_paused;
9082 for (
int gtid = 1; gtid < __kmp_threads_capacity; ++gtid) {
9083 kmp_info_t *thread = __kmp_threads[gtid];
9085 kmp_flag_64<> fl(&thread->th.th_bar[bs_forkjoin_barrier].bb.b_go,
9087 if (fl.is_sleeping())
9089 else if (__kmp_try_suspend_mx(thread)) {
9090 __kmp_unlock_suspend_mx(thread);
9093 if (fl.is_sleeping()) {
9096 }
else if (__kmp_try_suspend_mx(thread)) {
9097 __kmp_unlock_suspend_mx(thread);
9109int __kmp_pause_resource(kmp_pause_status_t level) {
9110 if (level == kmp_not_paused) {
9111 if (__kmp_pause_status == kmp_not_paused) {
9115 KMP_DEBUG_ASSERT(__kmp_pause_status == kmp_soft_paused ||
9116 __kmp_pause_status == kmp_hard_paused);
9117 __kmp_pause_status = kmp_not_paused;
9120 }
else if (level == kmp_soft_paused) {
9121 if (__kmp_pause_status != kmp_not_paused) {
9128 }
else if (level == kmp_hard_paused || level == kmp_stop_tool_paused) {
9130 if (__kmp_pause_status != kmp_not_paused) {
9143void __kmp_omp_display_env(
int verbose) {
9144 __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
9145 if (__kmp_init_serial == 0)
9146 __kmp_do_serial_initialize();
9147 __kmp_display_env_impl(!verbose, verbose);
9148 __kmp_release_bootstrap_lock(&__kmp_initz_lock);
9152void __kmp_resize_dist_barrier(kmp_team_t *team,
int old_nthreads,
9154 KMP_DEBUG_ASSERT(__kmp_barrier_release_pattern[bs_forkjoin_barrier] ==
9156 kmp_info_t **other_threads = team->t.t_threads;
9160 for (
int f = 1; f < old_nthreads; ++f) {
9161 KMP_DEBUG_ASSERT(other_threads[f] != NULL);
9163 if (team->t.t_threads[f]->th.th_used_in_team.load() == 0) {
9169 if (team->t.t_threads[f]->th.th_used_in_team.load() == 3) {
9170 while (team->t.t_threads[f]->th.th_used_in_team.load() == 3)
9174 KMP_DEBUG_ASSERT(team->t.t_threads[f]->th.th_used_in_team.load() == 1);
9176 team->t.t_threads[f]->th.th_used_in_team.store(2);
9177 KMP_DEBUG_ASSERT(team->t.t_threads[f]->th.th_used_in_team.load() == 2);
9180 team->t.b->go_release();
9186 int count = old_nthreads - 1;
9188 count = old_nthreads - 1;
9189 for (
int f = 1; f < old_nthreads; ++f) {
9190 if (other_threads[f]->th.th_used_in_team.load() != 0) {
9191 if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
9192 kmp_atomic_flag_64<> *flag = (kmp_atomic_flag_64<> *)CCAST(
9193 void *, other_threads[f]->th.th_sleep_loc);
9194 __kmp_atomic_resume_64(other_threads[f]->th.th_info.ds.ds_gtid, flag);
9197 KMP_DEBUG_ASSERT(team->t.t_threads[f]->th.th_used_in_team.load() == 0);
9203 team->t.b->update_num_threads(new_nthreads);
9204 team->t.b->go_reset();
9207void __kmp_add_threads_to_team(kmp_team_t *team,
int new_nthreads) {
9209 KMP_DEBUG_ASSERT(team);
9215 for (
int f = 1; f < new_nthreads; ++f) {
9216 KMP_DEBUG_ASSERT(team->t.t_threads[f]);
9217 (void)KMP_COMPARE_AND_STORE_ACQ32(
9218 &(team->t.t_threads[f]->th.th_used_in_team), 0, 3);
9219 if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
9220 __kmp_resume_32(team->t.t_threads[f]->th.th_info.ds.ds_gtid,
9221 (kmp_flag_32<false, false> *)NULL);
9227 int count = new_nthreads - 1;
9229 count = new_nthreads - 1;
9230 for (
int f = 1; f < new_nthreads; ++f) {
9231 if (team->t.t_threads[f]->th.th_used_in_team.load() == 1) {
9239kmp_info_t **__kmp_hidden_helper_threads;
9240kmp_info_t *__kmp_hidden_helper_main_thread;
9241std::atomic<kmp_int32> __kmp_unexecuted_hidden_helper_tasks;
9243kmp_int32 __kmp_hidden_helper_threads_num = 8;
9244kmp_int32 __kmp_enable_hidden_helper = TRUE;
9246kmp_int32 __kmp_hidden_helper_threads_num = 0;
9247kmp_int32 __kmp_enable_hidden_helper = FALSE;
9251std::atomic<kmp_int32> __kmp_hit_hidden_helper_threads_num;
9253void __kmp_hidden_helper_wrapper_fn(
int *gtid,
int *, ...) {
9258 KMP_ATOMIC_INC(&__kmp_hit_hidden_helper_threads_num);
9259 while (KMP_ATOMIC_LD_ACQ(&__kmp_hit_hidden_helper_threads_num) !=
9260 __kmp_hidden_helper_threads_num)
9266 TCW_4(__kmp_init_hidden_helper_threads, FALSE);
9267 __kmp_hidden_helper_initz_release();
9268 __kmp_hidden_helper_main_thread_wait();
9270 for (
int i = 1; i < __kmp_hit_hidden_helper_threads_num; ++i) {
9271 __kmp_hidden_helper_worker_thread_signal();
9277void __kmp_hidden_helper_threads_initz_routine() {
9279 const int gtid = __kmp_register_root(TRUE);
9280 __kmp_hidden_helper_main_thread = __kmp_threads[gtid];
9281 __kmp_hidden_helper_threads = &__kmp_threads[gtid];
9282 __kmp_hidden_helper_main_thread->th.th_set_nproc =
9283 __kmp_hidden_helper_threads_num;
9285 KMP_ATOMIC_ST_REL(&__kmp_hit_hidden_helper_threads_num, 0);
9290 TCW_SYNC_4(__kmp_init_hidden_helper, FALSE);
9292 __kmp_hidden_helper_threads_deinitz_release();
9312void __kmp_init_nesting_mode() {
9313 int levels = KMP_HW_LAST;
9314 __kmp_nesting_mode_nlevels = levels;
9315 __kmp_nesting_nth_level = (
int *)KMP_INTERNAL_MALLOC(levels *
sizeof(
int));
9316 for (
int i = 0; i < levels; ++i)
9317 __kmp_nesting_nth_level[i] = 0;
9318 if (__kmp_nested_nth.size < levels) {
9319 __kmp_nested_nth.nth =
9320 (
int *)KMP_INTERNAL_REALLOC(__kmp_nested_nth.nth, levels *
sizeof(
int));
9321 __kmp_nested_nth.size = levels;
9326void __kmp_set_nesting_mode_threads() {
9327 kmp_info_t *thread = __kmp_threads[__kmp_entry_gtid()];
9329 if (__kmp_nesting_mode == 1)
9330 __kmp_nesting_mode_nlevels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
9331 else if (__kmp_nesting_mode > 1)
9332 __kmp_nesting_mode_nlevels = __kmp_nesting_mode;
9334 if (__kmp_topology) {
9336 for (loc = 0, hw_level = 0; hw_level < __kmp_topology->get_depth() &&
9337 loc < __kmp_nesting_mode_nlevels;
9338 loc++, hw_level++) {
9339 __kmp_nesting_nth_level[loc] = __kmp_topology->get_ratio(hw_level);
9340 if (__kmp_nesting_nth_level[loc] == 1)
9344 if (__kmp_nesting_mode > 1 && loc > 1) {
9345 int core_level = __kmp_topology->get_level(KMP_HW_CORE);
9346 int num_cores = __kmp_topology->get_count(core_level);
9347 int upper_levels = 1;
9348 for (
int level = 0; level < loc - 1; ++level)
9349 upper_levels *= __kmp_nesting_nth_level[level];
9350 if (upper_levels * __kmp_nesting_nth_level[loc - 1] < num_cores)
9351 __kmp_nesting_nth_level[loc - 1] =
9352 num_cores / __kmp_nesting_nth_level[loc - 2];
9354 __kmp_nesting_mode_nlevels = loc;
9355 __kmp_nested_nth.used = __kmp_nesting_mode_nlevels;
9357 if (__kmp_avail_proc >= 4) {
9358 __kmp_nesting_nth_level[0] = __kmp_avail_proc / 2;
9359 __kmp_nesting_nth_level[1] = 2;
9360 __kmp_nesting_mode_nlevels = 2;
9362 __kmp_nesting_nth_level[0] = __kmp_avail_proc;
9363 __kmp_nesting_mode_nlevels = 1;
9365 __kmp_nested_nth.used = __kmp_nesting_mode_nlevels;
9367 for (
int i = 0; i < __kmp_nesting_mode_nlevels; ++i) {
9368 __kmp_nested_nth.nth[i] = __kmp_nesting_nth_level[i];
9370 set__nproc(thread, __kmp_nesting_nth_level[0]);
9371 if (__kmp_nesting_mode > 1 && __kmp_nesting_mode_nlevels > __kmp_nesting_mode)
9372 __kmp_nesting_mode_nlevels = __kmp_nesting_mode;
9373 if (get__max_active_levels(thread) > 1) {
9375 __kmp_nesting_mode_nlevels = get__max_active_levels(thread);
9377 if (__kmp_nesting_mode == 1)
9378 set__max_active_levels(thread, __kmp_nesting_mode_nlevels);
9381#if ENABLE_LIBOMPTARGET
9382void (*kmp_target_sync_cb)(
ident_t *loc_ref,
int gtid,
void *current_task,
9383 void *event) = NULL;
9384void __kmp_target_init() {
9386 *(
void **)(&kmp_target_sync_cb) = KMP_DLSYM(
"__tgt_target_sync");
9392#if !KMP_STATS_ENABLED
9393void __kmp_reset_stats() {}
9396int __kmp_omp_debug_struct_info = FALSE;
9397int __kmp_debugging = FALSE;
9399#if !USE_ITT_BUILD || !USE_ITT_NOTIFY
9400void __kmp_itt_fini_ittlib() {}
9401void __kmp_itt_init_ittlib() {}
KMP_EXPORT void __kmpc_serialized_parallel(ident_t *, kmp_int32 global_tid)
KMP_EXPORT void __kmpc_fork_call(ident_t *, kmp_int32 nargs, kmpc_micro microtask,...)
KMP_EXPORT void __kmpc_end_serialized_parallel(ident_t *, kmp_int32 global_tid)
#define KMP_INIT_PARTITIONED_TIMERS(name)
Initializes the partitioned timers to begin with name.
#define KMP_COUNT_VALUE(name, value)
Adds value to specified timer (name).
stats_state_e
the states which a thread can be in
KMP_EXPORT kmp_int32 __kmpc_master(ident_t *, kmp_int32 global_tid)