24#if !KMP_OS_DRAGONFLY && !KMP_OS_FREEBSD && !KMP_OS_NETBSD && !KMP_OS_OPENBSD
31#include <sys/resource.h>
34#include <libperfstat.h>
36#include <sys/syscall.h>
43#include <sys/sysinfo.h>
59#include <sys/sysctl.h>
60#elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD
62#include <sys/sysctl.h>
64#include <pthread_np.h>
68#elif KMP_OS_NETBSD || KMP_OS_OPENBSD
70#include <sys/sysctl.h>
75#include <pthread_np.h>
80#include <sys/loadavg.h>
91#ifndef TIMEVAL_TO_TIMESPEC
93#define TIMEVAL_TO_TIMESPEC(tv, ts) \
95 (ts)->tv_sec = (tv)->tv_sec; \
96 (ts)->tv_nsec = (tv)->tv_usec * 1000; \
101#define TS2NS(timespec) \
102 (((timespec).tv_sec * (long int)1e9) + (timespec).tv_nsec)
106#if KMP_HANDLE_SIGNALS
107typedef void (*sig_func_t)(
int);
109static sigset_t __kmp_sigset;
126static void __kmp_print_cond(
char *buffer, kmp_cond_align_t *cond) {
127 KMP_SNPRINTF(buffer, 128,
"(cond (lock (%ld, %d)), (descr (%p)))",
128 cond->c_cond.__c_lock.__status, cond->c_cond.__c_lock.__spinlock,
129 cond->c_cond.__c_waiting);
133#if ((KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
135 KMP_AFFINITY_SUPPORTED)
141 "Illegal set affinity operation when not capable");
143 kmp_affin_mask_t *
mask;
144 KMP_CPU_ALLOC_ON_STACK(
mask);
146 KMP_CPU_SET(which,
mask);
147 __kmp_set_system_affinity(
mask,
TRUE);
148 KMP_CPU_FREE_FROM_STACK(
mask);
161 if (mask_size %
sizeof(__kmp_affin_mask_size))
162 mask_size +=
sizeof(__kmp_affin_mask_size) -
163 mask_size %
sizeof(__kmp_affin_mask_size);
164 KMP_AFFINITY_ENABLE(mask_size);
166 (
"__kmp_affinity_determine_capable: "
167 "AIX OS affinity interface bindprocessor functional (mask size = "
168 "%" KMP_SIZE_T_SPEC
").\n",
169 __kmp_affin_mask_size));
181#define KMP_CPU_SET_SIZE_LIMIT (1024 * 1024)
182#define KMP_CPU_SET_TRY_SIZE CACHE_LINE
183#elif KMP_OS_FREEBSD || KMP_OS_DRAGONFLY
184#define KMP_CPU_SET_SIZE_LIMIT (sizeof(cpuset_t))
186#define KMP_CPU_SET_SIZE_LIMIT (256)
189 int verbose = __kmp_affinity.flags.verbose;
190 int warnings = __kmp_affinity.flags.warnings;
191 enum affinity_type
type = __kmp_affinity.type;
200 gCode = syscall(__NR_sched_getaffinity, 0, KMP_CPU_SET_TRY_SIZE,
buf);
201 KA_TRACE(30, (
"__kmp_affinity_determine_capable: "
202 "initial getaffinity call returned %ld errno = %d\n",
205 if (gCode < 0 && errno != EINVAL) {
208 (warnings && (
type != affinity_none) && (
type != affinity_default) &&
209 (
type != affinity_disabled))) {
218 KMP_AFFINITY_DISABLE();
221 }
else if (gCode > 0) {
223 KMP_AFFINITY_ENABLE(gCode);
224 KA_TRACE(10, (
"__kmp_affinity_determine_capable: "
225 "affinity supported (mask size %d)\n",
226 (
int)__kmp_affin_mask_size));
233 KA_TRACE(30, (
"__kmp_affinity_determine_capable: "
234 "searching for proper set size\n"));
236 for (
size = 1;
size <= KMP_CPU_SET_SIZE_LIMIT;
size *= 2) {
237 gCode = syscall(__NR_sched_getaffinity, 0,
size,
buf);
238 KA_TRACE(30, (
"__kmp_affinity_determine_capable: "
239 "getaffinity for mask size %ld returned %ld errno = %d\n",
240 size, gCode, errno));
243 if (errno == ENOSYS) {
245 KA_TRACE(30, (
"__kmp_affinity_determine_capable: "
246 "inconsistent OS call behavior: errno == ENOSYS for mask "
250 (warnings && (
type != affinity_none) &&
251 (
type != affinity_default) && (
type != affinity_disabled))) {
260 KMP_AFFINITY_DISABLE();
267 KMP_AFFINITY_ENABLE(gCode);
268 KA_TRACE(10, (
"__kmp_affinity_determine_capable: "
269 "affinity supported (mask size %d)\n",
270 (
int)__kmp_affin_mask_size));
274#elif KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY
278 gCode = pthread_getaffinity_np(pthread_self(), KMP_CPU_SET_SIZE_LIMIT,
279 reinterpret_cast<cpuset_t *
>(
buf));
280 KA_TRACE(30, (
"__kmp_affinity_determine_capable: "
281 "initial getaffinity call returned %d errno = %d\n",
284 KMP_AFFINITY_ENABLE(KMP_CPU_SET_SIZE_LIMIT);
285 KA_TRACE(10, (
"__kmp_affinity_determine_capable: "
286 "affinity supported (mask size %d)\n",
287 (
int)__kmp_affin_mask_size));
295 KMP_AFFINITY_DISABLE();
296 KA_TRACE(10, (
"__kmp_affinity_determine_capable: "
297 "cannot determine mask size - affinity not supported\n"));
298 if (verbose || (warnings && (
type != affinity_none) &&
299 (
type != affinity_default) && (
type != affinity_disabled))) {
309int __kmp_futex_determine_capable() {
311 long rc = syscall(__NR_futex, &
loc, FUTEX_WAKE, 1, NULL, NULL, 0);
312 int retval = (rc == 0) || (errno != ENOSYS);
315 (
"__kmp_futex_determine_capable: rc = %d errno = %d\n", rc, errno));
316 KA_TRACE(10, (
"__kmp_futex_determine_capable: futex syscall%s supported\n",
317 retval ?
"" :
" not"));
324#if (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_WASM32 || KMP_ARCH_WASM64) && \
333 new_value = old_value |
d;
338 new_value = old_value |
d;
347 new_value = old_value &
d;
352 new_value = old_value &
d;
361 new_value = old_value |
d;
366 new_value = old_value |
d;
375 new_value = old_value &
d;
380 new_value = old_value &
d;
385#if KMP_ARCH_X86 || KMP_ARCH_WASM32
390 new_value = old_value +
d;
395 new_value = old_value +
d;
404 new_value = old_value +
d;
409 new_value = old_value +
d;
419 new_value = old_value |
d;
423 new_value = old_value |
d;
432 new_value = old_value &
d;
436 new_value = old_value &
d;
450#if KMP_CANCEL_THREADS
451 KA_TRACE(10, (
"__kmp_terminate_thread: kill (%d)\n", gtid));
452 status = pthread_cancel(th->th.th_info.ds.ds_thread);
467#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
468 KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
480 if ((
status = thr_stksegment(&
s)) < 0) {
486 KA_TRACE(60, (
"__kmp_set_stack_info: T#%d thr_stksegment returned size:"
487 " %lu, low addr: %p\n",
492 status = pthread_attr_init(&attr);
494#if KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD
495 status = pthread_attr_get_np(pthread_self(), &attr);
498 status = pthread_getattr_np(pthread_self(), &attr);
504 (
"__kmp_set_stack_info: T#%d pthread_attr_getstack returned size:"
505 " %lu, low addr: %p\n",
507 status = pthread_attr_destroy(&attr);
522 TCW_PTR(th->th.th_info.ds.ds_stacksize, 0);
523 TCW_PTR(th->th.th_info.ds.ds_stackbase, &stack_data);
524 TCW_4(th->th.th_info.ds.ds_stackgrow,
TRUE);
529 int status, old_type, old_state;
530#ifdef KMP_BLOCK_SIGNALS
531 sigset_t new_set, old_set;
534#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
535 KMP_OS_OPENBSD || KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || \
537 void *
volatile padding = 0;
541 gtid = ((
kmp_info_t *)thr)->th.th_info.ds.ds_gtid;
548 __kmp_stats_thread_ptr = ((
kmp_info_t *)thr)->th.th_stats;
549 __kmp_stats_thread_ptr->startLife();
555 __kmp_itt_thread_name(gtid);
558#if KMP_AFFINITY_SUPPORTED
559 __kmp_affinity_bind_init_mask(gtid);
562#if KMP_CANCEL_THREADS
563 status = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_type);
566 status = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state);
570#if KMP_ARCH_X86 || KMP_ARCH_X86_64
572 __kmp_clear_x87_fpu_status_word();
573 __kmp_load_x87_fpu_control_word(&__kmp_init_x87_fpu_control_word);
574 __kmp_load_mxcsr(&__kmp_init_mxcsr);
577#ifdef KMP_BLOCK_SIGNALS
578 status = sigfillset(&new_set);
580 status = pthread_sigmask(SIG_BLOCK, &new_set, &old_set);
584#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
585 KMP_OS_OPENBSD || KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || \
600#ifdef KMP_BLOCK_SIGNALS
601 status = pthread_sigmask(SIG_SETMASK, &old_set, NULL);
611static void *__kmp_launch_monitor(
void *thr) {
612 int status, old_type, old_state;
613#ifdef KMP_BLOCK_SIGNALS
616 struct timespec interval;
620 KA_TRACE(10, (
"__kmp_launch_monitor: #1 launched\n"));
632 __kmp_itt_thread_ignore();
640#if KMP_CANCEL_THREADS
641 status = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_type);
644 status = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state);
653 int sched = sched_getscheduler(0);
654 if (
sched == SCHED_FIFO ||
sched == SCHED_RR) {
657 struct sched_param param;
658 int max_priority = sched_get_priority_max(
sched);
661 sched_getparam(0, ¶m);
662 if (param.sched_priority < max_priority) {
663 param.sched_priority += 1;
664 rc = sched_setscheduler(0,
sched, ¶m);
690 if (__kmp_monitor_wakeups == 1) {
692 interval.tv_nsec = 0;
698 KA_TRACE(10, (
"__kmp_launch_monitor: #2 monitor\n"));
706 KA_TRACE(15, (
"__kmp_launch_monitor: update\n"));
708 status = gettimeofday(&tval, NULL);
712 now.tv_sec += interval.tv_sec;
713 now.tv_nsec += interval.tv_nsec;
741 KA_TRACE(10, (
"__kmp_launch_monitor: #3 cleanup\n"));
743#ifdef KMP_BLOCK_SIGNALS
744 status = sigfillset(&new_set);
746 status = pthread_sigmask(SIG_UNBLOCK, &new_set, NULL);
750 KA_TRACE(10, (
"__kmp_launch_monitor: #4 finished\n"));
758 KA_TRACE(10, (
"__kmp_launch_monitor: #5 terminate sig=%d\n",
769 KA_TRACE(10, (
"__kmp_launch_monitor: #6 raise sig=%d\n",
776 KA_TRACE(10, (
"__kmp_launch_monitor: #7 exit\n"));
784 pthread_attr_t thread_attr;
787 th->th.th_info.ds.ds_gtid = gtid;
798 th->th.th_stats = __kmp_stats_list->push_back(gtid);
802 th->th.th_stats = __kmp_stats_thread_ptr;
809 KA_TRACE(10, (
"__kmp_create_worker: uber thread (%d)\n", gtid));
810 th->th.th_info.ds.ds_thread = pthread_self();
816 KA_TRACE(10, (
"__kmp_create_worker: try to create thread (%d)\n", gtid));
820#ifdef KMP_THREAD_ATTR
821 status = pthread_attr_init(&thread_attr);
825 status = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
839 KA_TRACE(10, (
"__kmp_create_worker: T#%d, default stacksize = %lu bytes, "
840 "__kmp_stksize = %lu bytes, final stacksize = %lu bytes\n",
843#ifdef _POSIX_THREAD_ATTR_STACKSIZE
844 status = pthread_attr_setstacksize(&thread_attr, stack_size);
845#ifdef KMP_BACKUP_STKSIZE
850 KA_TRACE(10, (
"__kmp_create_worker: T#%d, default stacksize = %lu bytes, "
851 "__kmp_stksize = %lu bytes, (backup) final stacksize = %lu "
854 status = pthread_attr_setstacksize(&thread_attr, stack_size);
868 if (
status != 0 || !handle) {
869#ifdef _POSIX_THREAD_ATTR_STACKSIZE
888#if defined(LIBOMP_HAVE_PTHREAD_SET_NAME_NP)
889 pthread_set_name_np(handle,
"openmp_worker");
890#elif defined(LIBOMP_HAVE_PTHREAD_SETNAME_NP) && !KMP_OS_DARWIN
892 pthread_setname_np(handle,
"%s",
const_cast<char *
>(
"openmp_worker"));
894 pthread_setname_np(handle,
"openmp_worker");
899 th->th.th_info.ds.ds_thread = handle;
901#ifdef KMP_THREAD_ATTR
902 status = pthread_attr_destroy(&thread_attr);
915 KA_TRACE(10, (
"__kmp_create_worker: done creating thread (%d)\n", gtid));
922 pthread_attr_t thread_attr;
925 int auto_adj_size =
FALSE;
929 KA_TRACE(10, (
"__kmp_create_monitor: skipping monitor thread because of "
931 th->th.th_info.ds.ds_tid = 0;
932 th->th.th_info.ds.ds_gtid = 0;
935 KA_TRACE(10, (
"__kmp_create_monitor: try to create monitor\n"));
948#ifdef KMP_THREAD_ATTR
949 if (__kmp_monitor_stksize == 0) {
950 __kmp_monitor_stksize = KMP_DEFAULT_MONITOR_STKSIZE;
951 auto_adj_size =
TRUE;
953 status = pthread_attr_init(&thread_attr);
957 status = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
962#ifdef _POSIX_THREAD_ATTR_STACKSIZE
963 status = pthread_attr_getstacksize(&thread_attr, &
size);
970 if (__kmp_monitor_stksize == 0) {
971 __kmp_monitor_stksize = KMP_DEFAULT_MONITOR_STKSIZE;
977 KA_TRACE(10, (
"__kmp_create_monitor: default stacksize = %lu bytes,"
978 "requested stacksize = %lu bytes\n",
979 size, __kmp_monitor_stksize));
984#ifdef _POSIX_THREAD_ATTR_STACKSIZE
985 KA_TRACE(10, (
"__kmp_create_monitor: setting stacksize = %lu bytes,",
986 __kmp_monitor_stksize));
987 status = pthread_attr_setstacksize(&thread_attr, __kmp_monitor_stksize);
990 __kmp_monitor_stksize *= 2;
995 KMP_MSG(CantSetMonitorStackSize, (
long int)__kmp_monitor_stksize),
1004 pthread_create(&handle, &thread_attr, __kmp_launch_monitor, (
void *)th);
1007#ifdef _POSIX_THREAD_ATTR_STACKSIZE
1009 if (auto_adj_size && (__kmp_monitor_stksize < (
size_t)0x40000000)) {
1010 __kmp_monitor_stksize *= 2;
1030 th->th.th_info.ds.ds_thread = handle;
1032#if KMP_REAL_TIME_FIX
1040#ifdef KMP_THREAD_ATTR
1041 status = pthread_attr_destroy(&thread_attr);
1054 KA_TRACE(10, (
"__kmp_create_monitor: monitor created %#.8lx\n",
1055 th->th.th_info.ds.ds_thread));
1064 pthread_exit((
void *)(intptr_t)exit_status);
1069void __kmp_resume_monitor();
1075 KA_TRACE(10, (
"__kmp_reap_monitor: try to reap monitor thread with handle"
1077 th->th.th_info.ds.ds_thread));
1084 KA_TRACE(10, (
"__kmp_reap_monitor: monitor did not start, returning\n"));
1094 status = pthread_kill(th->th.th_info.ds.ds_thread, 0);
1096 __kmp_resume_monitor();
1098 KA_TRACE(10, (
"__kmp_reap_monitor: try to join with monitor\n"));
1099 status = pthread_join(th->th.th_info.ds.ds_thread, &exit_val);
1100 if (exit_val != th) {
1107 KA_TRACE(10, (
"__kmp_reap_monitor: done reaping monitor thread with handle"
1109 th->th.th_info.ds.ds_thread));
1126 10, (
"__kmp_reap_worker: try to reap T#%d\n", th->th.th_info.ds.ds_gtid));
1128 status = pthread_join(th->th.th_info.ds.ds_thread, &exit_val);
1134 if (exit_val != th) {
1135 KA_TRACE(10, (
"__kmp_reap_worker: worker T#%d did not reap properly, "
1137 th->th.th_info.ds.ds_gtid, exit_val));
1143 KA_TRACE(10, (
"__kmp_reap_worker: done reaping T#%d\n",
1144 th->th.th_info.ds.ds_gtid));
1149#if KMP_HANDLE_SIGNALS
1151static void __kmp_null_handler(
int signo) {
1155static void __kmp_team_handler(
int signo) {
1193static void __kmp_sigaction(
int signum,
const struct sigaction *act,
1194 struct sigaction *oldact) {
1195 int rc = sigaction(signum, act, oldact);
1199static void __kmp_install_one_handler(
int sig, sig_func_t handler_func,
1200 int parallel_init) {
1203 (
"__kmp_install_one_handler( %d, ..., %d )\n", sig, parallel_init));
1204 if (parallel_init) {
1205 struct sigaction new_action;
1206 struct sigaction old_action;
1207 new_action.sa_handler = handler_func;
1208 new_action.sa_flags = 0;
1209 sigfillset(&new_action.sa_mask);
1210 __kmp_sigaction(sig, &new_action, &old_action);
1211 if (old_action.sa_handler == __kmp_sighldrs[sig].sa_handler) {
1212 sigaddset(&__kmp_sigset, sig);
1215 __kmp_sigaction(sig, &old_action, NULL);
1219 __kmp_sigaction(sig, NULL, &__kmp_sighldrs[sig]);
1224static void __kmp_remove_one_handler(
int sig) {
1225 KB_TRACE(60, (
"__kmp_remove_one_handler( %d )\n", sig));
1226 if (sigismember(&__kmp_sigset, sig)) {
1227 struct sigaction old;
1229 __kmp_sigaction(sig, &__kmp_sighldrs[sig], &old);
1230 if ((old.sa_handler != __kmp_team_handler) &&
1231 (old.sa_handler != __kmp_null_handler)) {
1233 KB_TRACE(10, (
"__kmp_remove_one_handler: oops, not our handler, "
1234 "restoring: sig=%d\n",
1236 __kmp_sigaction(sig, &old, NULL);
1238 sigdelset(&__kmp_sigset, sig);
1243void __kmp_install_signals(
int parallel_init) {
1244 KB_TRACE(10, (
"__kmp_install_signals( %d )\n", parallel_init));
1245 if (__kmp_handle_signals || !parallel_init) {
1248 sigemptyset(&__kmp_sigset);
1249 __kmp_install_one_handler(SIGHUP, __kmp_team_handler, parallel_init);
1250 __kmp_install_one_handler(SIGINT, __kmp_team_handler, parallel_init);
1251 __kmp_install_one_handler(SIGQUIT, __kmp_team_handler, parallel_init);
1252 __kmp_install_one_handler(SIGILL, __kmp_team_handler, parallel_init);
1253 __kmp_install_one_handler(SIGABRT, __kmp_team_handler, parallel_init);
1254 __kmp_install_one_handler(SIGFPE, __kmp_team_handler, parallel_init);
1255 __kmp_install_one_handler(SIGBUS, __kmp_team_handler, parallel_init);
1256 __kmp_install_one_handler(SIGSEGV, __kmp_team_handler, parallel_init);
1258 __kmp_install_one_handler(SIGSYS, __kmp_team_handler, parallel_init);
1260 __kmp_install_one_handler(SIGTERM, __kmp_team_handler, parallel_init);
1262 __kmp_install_one_handler(SIGPIPE, __kmp_team_handler, parallel_init);
1267void __kmp_remove_signals(
void) {
1269 KB_TRACE(10, (
"__kmp_remove_signals()\n"));
1270 for (sig = 1; sig < NSIG; ++sig) {
1271 __kmp_remove_one_handler(sig);
1278#if KMP_CANCEL_THREADS
1280 status = pthread_setcancelstate(new_state, &old_state);
1287#if KMP_CANCEL_THREADS
1289 status = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, old_state);
1316#if KMP_AFFINITY_SUPPORTED
1317#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DRAGONFLY || \
1321 kmp_set_thread_affinity_mask_initial();
1329 for (kmp_affinity_t *affinity : __kmp_affinities)
1330 *affinity = KMP_AFFINITY_INIT(affinity->env_var);
1331 __kmp_affin_fullMask =
nullptr;
1332 __kmp_affin_origMask =
nullptr;
1337 __kmp_init_monitor = 0;
1346#if !KMP_USE_DYNAMIC_LOCK
1362 KA_TRACE(10, (
"__kmp_atfork_child: checking cache address list %p\n",
1368 KC_TRACE(50, (
"__kmp_atfork_child: zeroing cache at address %p\n",
1430 if (old_value == new_value)
1434 &th->th.th_suspend_init_count, old_value, -1)) {
1441 status = pthread_cond_init(&th->th.th_suspend_cv.c_cond,
1444 status = pthread_mutex_init(&th->th.th_suspend_mx.m_mutex,
1457 status = pthread_cond_destroy(&th->th.th_suspend_cv.c_cond);
1461 status = pthread_mutex_destroy(&th->th.th_suspend_mx.m_mutex);
1465 --th->th.th_suspend_init_count;
1473 return (pthread_mutex_trylock(&th->th.th_suspend_mx.m_mutex) == 0);
1477 int status = pthread_mutex_lock(&th->th.th_suspend_mx.m_mutex);
1482 int status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1493 typename C::flag_t old_spin;
1495 KF_TRACE(30, (
"__kmp_suspend_template: T#%d enter for flag = %p\n", th_gtid,
1502 KF_TRACE(10, (
"__kmp_suspend_template: T#%d setting sleep bit for spin(%p)\n",
1503 th_gtid,
flag->get()));
1507 old_spin =
flag->set_sleeping();
1509 th->th.th_sleep_loc_type =
flag->get_type();
1512 flag->unset_sleeping();
1513 TCW_PTR(th->th.th_sleep_loc, NULL);
1518 KF_TRACE(5, (
"__kmp_suspend_template: T#%d set sleep bit for spin(%p)==%x,"
1520 th_gtid,
flag->get(),
flag->load(), old_spin));
1522 if (
flag->done_check_val(old_spin) ||
flag->done_check()) {
1523 flag->unset_sleeping();
1524 TCW_PTR(th->th.th_sleep_loc, NULL);
1526 KF_TRACE(5, (
"__kmp_suspend_template: T#%d false alarm, reset sleep bit "
1528 th_gtid,
flag->get()));
1533 int deactivated =
FALSE;
1535 while (
flag->is_sleeping()) {
1538 __kmp_suspend_count++;
1539 __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1540 __kmp_printf(
"__kmp_suspend_template: suspending T#%d: %s\n", th_gtid,
1546 th->th.th_active =
FALSE;
1547 if (th->th.th_active_in_pool) {
1548 th->th.th_active_in_pool =
FALSE;
1558#if USE_SUSPEND_TIMEOUT
1559 struct timespec now;
1560 struct timeval tval;
1563 status = gettimeofday(&tval, NULL);
1568 now.tv_sec += msecs / 1000;
1569 now.tv_nsec += (msecs % 1000) * 1000;
1571 KF_TRACE(15, (
"__kmp_suspend_template: T#%d about to perform "
1572 "pthread_cond_timedwait\n",
1574 status = pthread_cond_timedwait(&th->th.th_suspend_cv.c_cond,
1575 &th->th.th_suspend_mx.m_mutex, &now);
1577 KF_TRACE(15, (
"__kmp_suspend_template: T#%d about to perform"
1578 " pthread_cond_wait\n",
1580 status = pthread_cond_wait(&th->th.th_suspend_cv.c_cond,
1581 &th->th.th_suspend_mx.m_mutex);
1590 if (!
flag->is_sleeping() &&
1595 flag->unset_sleeping();
1596 TCW_PTR(th->th.th_sleep_loc, NULL);
1600 if (
status == ETIMEDOUT) {
1601 if (
flag->is_sleeping()) {
1603 (
"__kmp_suspend_template: T#%d timeout wakeup\n", th_gtid));
1605 KF_TRACE(2, (
"__kmp_suspend_template: T#%d timeout wakeup, sleep bit "
1608 TCW_PTR(th->th.th_sleep_loc, NULL);
1611 }
else if (
flag->is_sleeping()) {
1613 (
"__kmp_suspend_template: T#%d spurious wakeup\n", th_gtid));
1620 th->th.th_active =
TRUE;
1621 if (
TCR_4(th->th.th_in_pool)) {
1623 th->th.th_active_in_pool =
TRUE;
1629 TCW_PTR(th->th.th_sleep_loc, NULL);
1637 __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1638 __kmp_printf(
"__kmp_suspend_template: T#%d has awakened: %s\n", th_gtid,
1644 KF_TRACE(30, (
"__kmp_suspend_template: T#%d exit\n", th_gtid));
1647template <
bool C,
bool S>
1651template <
bool C,
bool S>
1655template <
bool C,
bool S>
1684 KF_TRACE(30, (
"__kmp_resume_template: T#%d wants to wakeup T#%d enter\n",
1685 gtid, target_gtid));
1692 if (!
flag ||
flag != th->th.th_sleep_loc) {
1695 flag = (
C *)
CCAST(
void *, th->th.th_sleep_loc);
1701 KF_TRACE(5, (
"__kmp_resume_template: T#%d exiting, thread T#%d already "
1702 "awake: flag(%p)\n",
1703 gtid, target_gtid, (
void *)NULL));
1706 }
else if (
flag->get_type() != th->th.th_sleep_loc_type) {
1711 (
"__kmp_resume_template: T#%d retrying, thread T#%d Mismatch flag(%p), "
1712 "spin(%p) type=%d ptr_type=%d\n",
1713 gtid, target_gtid,
flag,
flag->get(),
flag->get_type(),
1714 th->th.th_sleep_loc_type));
1720 if (!
flag->is_sleeping()) {
1721 KF_TRACE(5, (
"__kmp_resume_template: T#%d exiting, thread T#%d already "
1722 "awake: flag(%p): %u\n",
1723 gtid, target_gtid,
flag->get(), (
unsigned int)
flag->load()));
1729 flag->unset_sleeping();
1730 TCW_PTR(th->th.th_sleep_loc, NULL);
1733 KF_TRACE(5, (
"__kmp_resume_template: T#%d about to wakeup T#%d, reset "
1734 "sleep bit for flag's loc(%p): %u\n",
1735 gtid, target_gtid,
flag->get(), (
unsigned int)
flag->load()));
1740 __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1741 __kmp_printf(
"__kmp_resume_template: T#%d resuming T#%d: %s\n", gtid,
1742 target_gtid, buffer);
1745 status = pthread_cond_signal(&th->th.th_suspend_cv.c_cond);
1748 KF_TRACE(30, (
"__kmp_resume_template: T#%d exiting after signaling wake up"
1750 gtid, target_gtid));
1753template <
bool C,
bool S>
1757template <
bool C,
bool S>
1761template <
bool C,
bool S>
1776void __kmp_resume_monitor() {
1781 KF_TRACE(30, (
"__kmp_resume_monitor: T#%d wants to wakeup T#%d enter\n", gtid,
1791 __kmp_printf(
"__kmp_resume_monitor: T#%d resuming T#%d: %s\n", gtid,
1799 KF_TRACE(30, (
"__kmp_resume_monitor: T#%d exiting after signaling wake up"
1811 (
void *)(intptr_t)(gtid + 1));
1814 KA_TRACE(50, (
"__kmp_gtid_set_specific: runtime shutdown, returning\n"));
1821 KA_TRACE(50, (
"__kmp_gtid_get_specific: runtime shutdown, returning "
1822 "KMP_GTID_SHUTDOWN\n"));
1831 KA_TRACE(50, (
"__kmp_gtid_get_specific: key:%d gtid:%d\n",
1842 return (
double)(buffer.tms_utime + buffer.tms_cutime) /
1843 (
double)CLOCKS_PER_SEC;
1848 struct rusage r_usage;
1850 memset(info, 0,
sizeof(*info));
1852 status = getrusage(RUSAGE_SELF, &r_usage);
1857 info->
maxrss = r_usage.ru_maxrss;
1859 info->
minflt = r_usage.ru_minflt;
1861 info->
majflt = r_usage.ru_majflt;
1863 info->
nswap = r_usage.ru_nswap;
1865 info->
inblock = r_usage.ru_inblock;
1867 info->
oublock = r_usage.ru_oublock;
1869 info->
nvcsw = r_usage.ru_nvcsw;
1871 info->
nivcsw = r_usage.ru_nivcsw;
1879 struct timeval tval;
1880 struct timespec
stop;
1883 status = gettimeofday(&tval, NULL);
1887 *delta = (t_ns * 1e-9);
1891 struct timeval tval;
1893 status = gettimeofday(&tval, NULL);
1906#elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_OPENBSD || \
1907 KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
1913 size_t len =
sizeof(
r);
1914 sysctlbyname(
"hw.logicalcpu", &
r, &len, NULL, 0);
1918#error "Unknown or unsupported OS."
1922 return r > 0 ?
r : 2;
1930 va_start(
args, format);
1931 FILE *
f = fopen(
path,
"rb");
1945 pthread_mutexattr_t mutex_attr;
1946 pthread_condattr_t cond_attr;
1952#if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
1953 if (!__kmp_cpuinfo.initialized) {
1954 __kmp_query_cpuid(&__kmp_cpuinfo);
1964 status = getrlimit(RLIMIT_STACK, &rlim);
1971 if (sysconf(_SC_THREADS)) {
2004 status = pthread_mutexattr_init(&mutex_attr);
2008 status = pthread_mutexattr_destroy(&mutex_attr);
2010 status = pthread_condattr_init(&cond_attr);
2014 status = pthread_condattr_destroy(&cond_attr);
2017 __kmp_itt_initialize();
2031 __kmp_itt_destroy();
2045#if KMP_AFFINITY_SUPPORTED
2046 __kmp_affinity_uninitialize();
2062 status = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);
2069 status = gettimeofday(&tv, NULL);
2082 gettimeofday(&t, NULL);
2088#if KMP_ARCH_X86 || KMP_ARCH_X86_64
2098 diff = nsec2 - nsec;
2117#if KMP_OS_LINUX || KMP_OS_HURD
2125 file = fopen(
name,
"r");
2130 void *beginning = NULL;
2131 void *ending = NULL;
2134 rc = fscanf(file,
"%p-%p %4s %*[^\n]\n", &beginning, &ending, perms);
2142 if ((
addr >= beginning) && (
addr < ending)) {
2144 if (strcmp(perms,
"rw") == 0) {
2158 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()};
2159 rc = sysctl(mib, 4, NULL, &lstsz, NULL, 0);
2164 lstsz = lstsz * 4 / 3;
2166 rc = sysctl(mib, 4,
buf, &lstsz, NULL, 0);
2173 char *up =
buf + lstsz;
2176 struct kinfo_vmentry *cur =
reinterpret_cast<struct kinfo_vmentry *
>(lw);
2177 size_t cursz = cur->kve_structsize;
2180 void *start =
reinterpret_cast<void *
>(cur->kve_start);
2181 void *
end =
reinterpret_cast<void *
>(cur->kve_end);
2184 if ((cur->kve_protection & KVME_PROT_READ) != 0 &&
2185 (cur->kve_protection & KVME_PROT_WRITE) != 0) {
2193#elif KMP_OS_DRAGONFLY
2194 char err[_POSIX2_LINE_MAX];
2198 vm_map_entry entry, *c;
2204 fd = kvm_openfiles(
nullptr,
nullptr,
nullptr, O_RDONLY,
err);
2209 proc = kvm_getprocs(fd, KERN_PROC_PID, getpid(), &num);
2211 if (kvm_read(fd,
static_cast<uintptr_t
>(proc->kp_paddr), &
p,
sizeof(
p)) !=
2213 kvm_read(fd,
reinterpret_cast<uintptr_t
>(
p.p_vmspace), &sp,
sizeof(sp)) !=
2221 uaddr =
reinterpret_cast<uintptr_t
>(
addr);
2222 for (c = kvm_vm_map_entry_first(fd, cur, &entry); c;
2223 c = kvm_vm_map_entry_next(fd, c, &entry)) {
2224 if ((uaddr >= entry.ba.start) && (uaddr <= entry.ba.end)) {
2225 if ((entry.protection & VM_PROT_READ) != 0 &&
2226 (entry.protection & VM_PROT_WRITE) != 0) {
2235 prxmap_t *cur, *map;
2240 pid_t pid = getpid();
2242 fd = open(
name, O_RDONLY);
2248 size_t sz = (1 << 20);
2251 while (sz > 0 && (
rd = pread(fd,
buf, sz, 0)) == sz) {
2258 map =
reinterpret_cast<prxmap_t *
>(
buf);
2259 uaddr =
reinterpret_cast<uintptr_t
>(
addr);
2261 for (cur = map;
rd > 0; cur++,
rd = -
sizeof(*map)) {
2262 if (uaddr >= cur->pr_vaddr && uaddr < cur->pr_vaddr) {
2263 if ((cur->pr_mflags & MA_READ) != 0 && (cur->pr_mflags & MA_WRITE) != 0) {
2280 rc = vm_read_overwrite(
2282 (vm_address_t)(
addr),
2284 (vm_address_t)(&buffer),
2297 mib[2] = VM_PROC_MAP;
2299 mib[4] =
sizeof(
struct kinfo_vmentry);
2302 rc = sysctl(mib, __arraycount(mib), NULL, &
size, NULL, 0);
2310 rc = sysctl(mib, __arraycount(mib), kiv, &
size, NULL, 0);
2314 for (
size_t i = 0;
i <
size;
i++) {
2315 if (kiv[
i].kve_start >= (uint64_t)
addr &&
2316 kiv[
i].kve_end <= (uint64_t)
addr) {
2326 mib[1] = KERN_PROC_VMMAP;
2331 rc = sysctl(mib, 3, NULL, &
size, NULL, 0);
2336 struct kinfo_vmentry kiv = {.kve_start = 0};
2338 while ((rc = sysctl(mib, 3, &kiv, &
size, NULL, 0)) == 0) {
2340 if (kiv.kve_end ==
end)
2343 if (kiv.kve_start >= (uint64_t)
addr && kiv.kve_end <= (uint64_t)
addr) {
2350 found = (
int)
addr < (__builtin_wasm_memory_size(0) * PAGESIZE);
2353 uint32_t loadQueryBufSize = 4096u;
2358 if (loadQueryBuf == NULL) {
2362 rc = loadquery(L_GETXINFO | L_IGNOREUNLOAD, loadQueryBuf, loadQueryBufSize);
2365 if (errno != ENOMEM) {
2369 loadQueryBufSize <<= 1;
2376 struct ld_xinfo *curLdInfo = (
struct ld_xinfo *)loadQueryBuf;
2380 uintptr_t curDataStart = (uintptr_t)curLdInfo->ldinfo_dataorg;
2381 uintptr_t curDataEnd = curDataStart + curLdInfo->ldinfo_datasize;
2384 if (curDataStart <= (uintptr_t)
addr && (uintptr_t)
addr < curDataEnd) {
2388 if (curLdInfo->ldinfo_next == 0u) {
2392 curLdInfo = (
struct ld_xinfo *)((
char *)curLdInfo + curLdInfo->ldinfo_next);
2401#error "Unknown or unsupported OS"
2409#ifdef USE_LOAD_BALANCE
2411#if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
2412 KMP_OS_OPENBSD || KMP_OS_SOLARIS
2423 int res = getloadavg(averages, 3);
2428 if (__kmp_load_balance_interval < 180 && (
res >= 1)) {
2429 ret_avg = (
int)averages[0];
2430 }
else if ((__kmp_load_balance_interval >= 180 &&
2431 __kmp_load_balance_interval < 600) &&
2433 ret_avg = (
int)averages[1];
2434 }
else if ((__kmp_load_balance_interval >= 600) && (
res == 3)) {
2435 ret_avg = (
int)averages[2];
2449 static int glb_running_threads = 0;
2451 static double glb_call_time = 0;
2452 int running_threads = 0;
2454 double call_time = 0.0;
2458 if (glb_call_time &&
2459 (call_time - glb_call_time < __kmp_load_balance_interval))
2460 return glb_running_threads;
2462 glb_call_time = call_time;
2469 int logical_cpus = perfstat_cpu(NULL, NULL,
sizeof(perfstat_cpu_t), 0);
2470 if (logical_cpus <= 0) {
2476 logical_cpus *
sizeof(perfstat_cpu_t));
2477 if (cpu_stat == NULL) {
2484 perfstat_id_t first_cpu_name;
2485 strcpy(first_cpu_name.name, FIRST_CPU);
2488 int rc = perfstat_cpu(&first_cpu_name, cpu_stat,
sizeof(perfstat_cpu_t),
2496 for (
int i = 0;
i < logical_cpus; ++
i) {
2497 running_threads += cpu_stat[
i].runque;
2498 if (running_threads >= max)
2506 if (running_threads <= 0)
2507 running_threads = 1;
2511 glb_running_threads = running_threads;
2513 return running_threads;
2523 static int permanent_error = 0;
2524 static int glb_running_threads = 0;
2526 static double glb_call_time = 0;
2528 int running_threads = 0;
2530 DIR *proc_dir = NULL;
2531 struct dirent *proc_entry = NULL;
2534 DIR *task_dir = NULL;
2536 int task_path_fixed_len;
2540 int stat_path_fixed_len;
2543 int total_processes = 0;
2546 double call_time = 0.0;
2553 if (glb_call_time &&
2554 (call_time - glb_call_time < __kmp_load_balance_interval)) {
2555 running_threads = glb_running_threads;
2559 glb_call_time = call_time;
2562 if (permanent_error) {
2563 running_threads = -1;
2572 proc_dir = opendir(
"/proc");
2573 if (proc_dir == NULL) {
2576 running_threads = -1;
2577 permanent_error = 1;
2583 task_path_fixed_len = task_path.
used;
2585 proc_entry = readdir(proc_dir);
2586 while (proc_entry != NULL) {
2589 if (proc_entry->d_type == DT_DIR && isdigit(proc_entry->d_name[0])) {
2600 strcmp(proc_entry->d_name,
"1") == 0);
2603 task_path.
used = task_path_fixed_len;
2608 task_dir = opendir(task_path.
str);
2609 if (task_dir == NULL) {
2618 if (strcmp(proc_entry->d_name,
"1") == 0) {
2619 running_threads = -1;
2620 permanent_error = 1;
2628 stat_path_fixed_len = stat_path.
used;
2633 if (proc_entry->d_type == DT_DIR && isdigit(
task_entry->d_name[0])) {
2640 stat_path_fixed_len;
2647 stat_file = open(stat_path.
str, O_RDONLY);
2648 if (stat_file == -1) {
2678 len = read(stat_file, buffer,
sizeof(buffer) - 1);
2685 char *close_parent = strstr(buffer,
") ");
2686 if (close_parent != NULL) {
2687 char state = *(close_parent + 2);
2690 if (running_threads >= max) {
2706 proc_entry = readdir(proc_dir);
2713 if (running_threads <= 0) {
2714 running_threads = 1;
2718 if (proc_dir != NULL) {
2722 if (task_dir != NULL) {
2726 if (stat_file != -1) {
2730 glb_running_threads = running_threads;
2732 return running_threads;
2744pthread_cond_t hidden_helper_threads_initz_cond_var;
2745pthread_mutex_t hidden_helper_threads_initz_lock;
2746volatile int hidden_helper_initz_signaled =
FALSE;
2749pthread_cond_t hidden_helper_threads_deinitz_cond_var;
2750pthread_mutex_t hidden_helper_threads_deinitz_lock;
2751volatile int hidden_helper_deinitz_signaled =
FALSE;
2754pthread_cond_t hidden_helper_main_thread_cond_var;
2755pthread_mutex_t hidden_helper_main_thread_lock;
2756volatile int hidden_helper_main_thread_signaled =
FALSE;
2761sem_t hidden_helper_task_sem;
2765 int status = sem_wait(&hidden_helper_task_sem);
2772 pthread_cond_init(&hidden_helper_threads_initz_cond_var,
nullptr);
2775 status = pthread_cond_init(&hidden_helper_threads_deinitz_cond_var,
nullptr);
2778 status = pthread_cond_init(&hidden_helper_main_thread_cond_var,
nullptr);
2781 status = pthread_mutex_init(&hidden_helper_threads_initz_lock,
nullptr);
2784 status = pthread_mutex_init(&hidden_helper_threads_deinitz_lock,
nullptr);
2787 status = pthread_mutex_init(&hidden_helper_main_thread_lock,
nullptr);
2791 status = sem_init(&hidden_helper_task_sem, 0, 0);
2798 [](
void *) ->
void * {
2809 int status = pthread_mutex_lock(&hidden_helper_threads_initz_lock);
2812 if (!
TCR_4(hidden_helper_initz_signaled)) {
2813 status = pthread_cond_wait(&hidden_helper_threads_initz_cond_var,
2814 &hidden_helper_threads_initz_lock);
2818 status = pthread_mutex_unlock(&hidden_helper_threads_initz_lock);
2824 int status = pthread_mutex_lock(&hidden_helper_threads_initz_lock);
2827 status = pthread_cond_signal(&hidden_helper_threads_initz_cond_var);
2832 status = pthread_mutex_unlock(&hidden_helper_threads_initz_lock);
2839 int status = pthread_mutex_lock(&hidden_helper_main_thread_lock);
2842 if (!
TCR_4(hidden_helper_main_thread_signaled)) {
2843 status = pthread_cond_wait(&hidden_helper_main_thread_cond_var,
2844 &hidden_helper_main_thread_lock);
2848 status = pthread_mutex_unlock(&hidden_helper_main_thread_lock);
2855 int status = pthread_mutex_lock(&hidden_helper_main_thread_lock);
2858 status = pthread_cond_signal(&hidden_helper_main_thread_cond_var);
2864 status = pthread_mutex_unlock(&hidden_helper_main_thread_lock);
2869 int status = sem_post(&hidden_helper_task_sem);
2876 int status = pthread_mutex_lock(&hidden_helper_threads_deinitz_lock);
2879 if (!
TCR_4(hidden_helper_deinitz_signaled)) {
2880 status = pthread_cond_wait(&hidden_helper_threads_deinitz_cond_var,
2881 &hidden_helper_threads_deinitz_lock);
2885 status = pthread_mutex_unlock(&hidden_helper_threads_deinitz_lock);
2890 int status = pthread_mutex_lock(&hidden_helper_threads_deinitz_lock);
2893 status = pthread_cond_signal(&hidden_helper_threads_deinitz_cond_var);
2898 status = pthread_mutex_unlock(&hidden_helper_threads_deinitz_lock);
2903 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2907 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2911 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2915 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2919 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2923 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2927 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2931 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2935 KMP_ASSERT(0 &&
"Hidden helper task is not supported on this OS");
2940 DIR *dir = opendir(
"/dev/shm");
2944 }
else if (ENOENT == errno) {
2952 DIR *dir = opendir(
"/tmp");
2956 }
else if (ENOENT == errno) {
int task_entry(kmp_int32 gtid, kmp_task_t *task)
__itt_string_handle * name
void const char const char int ITT_FORMAT __itt_group_sync s
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int mask
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope ITT_FORMAT d const __itt_domain __itt_scope __itt_string_handle const char size_t ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_relation __itt_id ITT_FORMAT lu __itt_track_group __itt_string_handle __itt_track_group_type ITT_FORMAT d __itt_track ITT_FORMAT p void int const int int const char int ITT_FORMAT d void void const char * path
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t count
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync p
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
volatile kmp_team_t * __kmp_team_pool
int __kmp_generate_warnings
volatile int __kmp_init_user_locks
#define KMP_INTERNAL_MALLOC(sz)
kmp_bootstrap_lock_t __kmp_initz_lock
kmp_global_t __kmp_global
kmp_pause_status_t __kmp_pause_status
#define KMP_MAX_BLOCKTIME
void __kmp_check_stack_overlap(kmp_info_t *thr)
#define KMP_INTERNAL_REALLOC(p, sz)
volatile kmp_info_t * __kmp_thread_pool
volatile int __kmp_init_gtid
kmp_bootstrap_lock_t __kmp_task_team_lock
kmp_nested_proc_bind_t __kmp_nested_proc_bind
#define KMP_GTID_SHUTDOWN
kmp_cached_addr_t * __kmp_threadpriv_cache_list
volatile int __kmp_all_nth
void __kmp_check_stksize(size_t *val)
volatile int __kmp_init_common
static bool KMP_UBER_GTID(int gtid)
#define KMP_DEFAULT_STKSIZE
volatile int __kmp_init_middle
std::atomic< int > __kmp_thread_pool_active_nth
void __kmp_hidden_helper_threads_initz_routine()
volatile int __kmp_need_register_serial
kmp_bootstrap_lock_t __kmp_forkjoin_lock
void * __kmp_launch_thread(kmp_info_t *thr)
kmp_info_t ** __kmp_threads
int __kmp_need_register_atfork
void __kmp_internal_end_dest(void *)
void __kmp_unregister_library(void)
volatile int __kmp_init_parallel
kmp_key_t __kmp_gtid_threadprivate_key
kmp_info_t * __kmp_thread_pool_insert_pt
kmp_uint32 __kmp_neq_4(kmp_uint32 value, kmp_uint32 checker)
size_t __kmp_sys_min_stksize
#define KMP_INTERNAL_FREE(p)
int __kmp_threads_capacity
void __kmp_serial_initialize(void)
kmp_uint32 __kmp_wait_4(kmp_uint32 volatile *spinner, kmp_uint32 checker, kmp_uint32(*pred)(kmp_uint32, kmp_uint32), void *obj)
volatile int __kmp_init_serial
static void __kmp_type_convert(T1 src, T2 *dest)
union KMP_ALIGN_CACHE kmp_info kmp_info_t
kmp_uint64 __kmp_hardware_timestamp(void)
kmp_topology_t * __kmp_topology
KMP_ARCH_X86 KMP_ARCH_X86 long double
KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 kmp_int8
KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86 KMP_ARCH_X86<<, 2i, 1, KMP_ARCH_X86) ATOMIC_CMPXCHG(fixed2, shr, kmp_int16, 16, > KMP_ARCH_X86 KMP_ARCH_X86 kmp_uint32
void __kmp_dump_debug_buffer(void)
void __kmp_debug_printf(char const *format,...)
#define KMP_DEBUG_ASSERT(cond)
#define KMP_ASSERT2(cond, msg)
unsigned long long kmp_uint64
static volatile kmp_i18n_cat_status_t status
static void __kmp_msg(kmp_msg_severity_t severity, kmp_msg_t message, va_list ap)
void __kmp_fatal(kmp_msg_t message,...)
#define KMP_CHECK_SYSFAIL(func, error)
#define KMP_CHECK_SYSFAIL_ERRNO(func, status)
#define KMP_SYSFAIL(func, error)
kmp_bootstrap_lock_t __kmp_console_lock
kmp_bootstrap_lock_t __kmp_stdio_lock
void __kmp_printf(char const *format,...)
int __kmp_acquire_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid)
kmp_block_of_locks * __kmp_lock_blocks
int __kmp_release_tas_lock(kmp_tas_lock_t *lck, kmp_int32 gtid)
kmp_lock_table_t __kmp_user_lock_table
static void __kmp_release_bootstrap_lock(kmp_bootstrap_lock_t *lck)
static int __kmp_acquire_bootstrap_lock(kmp_bootstrap_lock_t *lck)
static void __kmp_init_bootstrap_lock(kmp_bootstrap_lock_t *lck)
#define KMP_COMPARE_AND_STORE_REL64(p, cv, sv)
#define KMP_COMPARE_AND_STORE_REL32(p, cv, sv)
#define KMP_ATOMIC_ST_REL(p, v)
bool __kmp_atomic_compare_store(std::atomic< T > *p, T expected, T desired)
#define KMP_ATOMIC_LD_ACQ(p)
#define STATIC_EFI2_WORKAROUND
#define KMP_COMPARE_AND_STORE_REL8(p, cv, sv)
#define KMP_ATOMIC_DEC(p)
#define KMP_ATOMIC_LD_RLX(p)
#define KMP_ATOMIC_INC(p)
Functions for collecting statistics.
#define KMP_INIT_PARTITIONED_TIMERS(name)
#define KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(n)
#define KMP_SET_THREAD_STATE(state_name)
void __kmp_str_buf_clear(kmp_str_buf_t *buffer)
void __kmp_str_buf_free(kmp_str_buf_t *buffer)
char * __kmp_str_format(char const *format,...)
void __kmp_str_buf_cat(kmp_str_buf_t *buffer, char const *str, size_t len)
void __kmp_str_free(char **str)
struct kmp_str_buf kmp_str_buf_t
#define __kmp_str_buf_init(b)
static void __kmp_null_resume_wrapper(kmp_info_t *thr)
static void __kmp_atfork_child(void)
void __kmp_hidden_helper_worker_thread_signal()
template void __kmp_atomic_resume_64< false, true >(int, kmp_atomic_flag_64< false, true > *)
template void __kmp_suspend_64< true, false >(int, kmp_flag_64< true, false > *)
static kmp_mutex_align_t __kmp_wait_mx
void __kmp_read_system_time(double *delta)
void __kmp_hidden_helper_threads_initz_wait()
static void __kmp_suspend_template(int th_gtid, C *flag)
void __kmp_enable(int new_state)
void __kmp_unlock_suspend_mx(kmp_info_t *th)
void __kmp_do_initialize_hidden_helper_threads()
static pthread_mutexattr_t __kmp_suspend_mutex_attr
void __kmp_thread_sleep(int millis)
static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th)
void __kmp_suspend_64(int th_gtid, kmp_flag_64< C, S > *flag)
static int __kmp_init_runtime
static void __kmp_atfork_parent(void)
void __kmp_hidden_helper_main_thread_release()
template void __kmp_resume_32< false, false >(int, kmp_flag_32< false, false > *)
void __kmp_suspend_initialize(void)
kmp_uint64 __kmp_now_nsec()
kmp_uint64 __kmp_ticks_per_usec
int __kmp_is_address_mapped(void *addr)
#define TIMEVAL_TO_TIMESPEC(tv, ts)
double __kmp_read_cpu_time(void)
void __kmp_suspend_32(int th_gtid, kmp_flag_32< C, S > *flag)
void __kmp_hidden_helper_worker_thread_wait()
template void __kmp_resume_32< false, true >(int, kmp_flag_32< false, true > *)
void __kmp_disable(int *old_state)
static pthread_condattr_t __kmp_suspend_cond_attr
void __kmp_reap_monitor(kmp_info_t *th)
template void __kmp_atomic_suspend_64< true, false >(int, kmp_atomic_flag_64< true, false > *)
void __kmp_hidden_helper_threads_deinitz_wait()
kmp_uint64 __kmp_ticks_per_msec
template void __kmp_atomic_suspend_64< false, true >(int, kmp_atomic_flag_64< false, true > *)
int __kmp_gtid_get_specific()
void __kmp_hidden_helper_main_thread_wait()
static struct kmp_sys_timer __kmp_sys_timer_data
void __kmp_hidden_helper_initz_release()
void __kmp_suspend_uninitialize_thread(kmp_info_t *th)
static int __kmp_fork_count
void __kmp_suspend_oncore(int th_gtid, kmp_flag_oncore *flag)
void __kmp_lock_suspend_mx(kmp_info_t *th)
void __kmp_terminate_thread(int gtid)
void __kmp_create_worker(int gtid, kmp_info_t *th, size_t stack_size)
template void __kmp_resume_64< false, true >(int, kmp_flag_64< false, true > *)
static void __kmp_atfork_prepare(void)
int __kmp_read_from_file(char const *path, char const *format,...)
void __kmp_elapsed(double *t)
void __kmp_clear_system_time(void)
template void __kmp_suspend_64< false, true >(int, kmp_flag_64< false, true > *)
static void __kmp_resume_template(int target_gtid, C *flag)
void __kmp_runtime_destroy(void)
int __kmp_read_system_info(struct kmp_sys_info *info)
static void * __kmp_launch_worker(void *thr)
template void __kmp_suspend_32< false, false >(int, kmp_flag_32< false, false > *)
void __kmp_resume_oncore(int target_gtid, kmp_flag_oncore *flag)
void __kmp_runtime_initialize(void)
int __kmp_try_suspend_mx(kmp_info_t *th)
void __kmp_resume_64(int target_gtid, kmp_flag_64< C, S > *flag)
void __kmp_resume_32(int target_gtid, kmp_flag_32< C, S > *flag)
void __kmp_atomic_suspend_64(int th_gtid, kmp_atomic_flag_64< C, S > *flag)
static kmp_cond_align_t __kmp_wait_cv
void __kmp_elapsed_tick(double *t)
void __kmp_gtid_set_specific(int gtid)
static int __kmp_get_xproc(void)
void __kmp_atomic_resume_64(int target_gtid, kmp_atomic_flag_64< C, S > *flag)
void __kmp_suspend_initialize_thread(kmp_info_t *th)
void __kmp_exit_thread(int exit_status)
void __kmp_register_atfork(void)
void __kmp_reap_worker(kmp_info_t *th)
void __kmp_hidden_helper_threads_deinitz_release()
void __kmp_affinity_determine_capable(const char *env_var)
void __kmp_affinity_bind_thread(int proc)
int __kmp_get_load_balance(int max)
void __kmp_initialize_system_tick(void)