Skip to content

Commit

Permalink
[OpenMP] libomp: honor passive wait policy requested with tasking
Browse files Browse the repository at this point in the history
Currently the library ignores requested wait policy in the presence
of tasking. Threads always actively spin. The patch fixes this problem
making the wait policy passive if this explicitly requested by user.

Differential Revision: https://reviews.llvm.org/D123044
  • Loading branch information
AndreyChurbanov authored and jpeyton52 committed May 18, 2022
1 parent d39928e commit c44ba01
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 2 deletions.
1 change: 1 addition & 0 deletions openmp/runtime/src/kmp.h
Expand Up @@ -3160,6 +3160,7 @@ extern int __kmp_tp_cached; /* whether threadprivate cache has been created
(__kmpc_threadprivate_cached()) */
extern int __kmp_dflt_blocktime; /* number of milliseconds to wait before
blocking (env setting) */
extern bool __kmp_wpolicy_passive; /* explicitly set passive wait policy */
#if KMP_USE_MONITOR
extern int
__kmp_monitor_wakeups; /* number of times monitor wakes up per second */
Expand Down
1 change: 1 addition & 0 deletions openmp/runtime/src/kmp_global.cpp
Expand Up @@ -154,6 +154,7 @@ int __kmp_hier_threads_per[kmp_hier_layer_e::LAYER_LAST + 1];
kmp_hier_sched_env_t __kmp_hier_scheds = {0, 0, NULL, NULL, NULL};
#endif
int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
bool __kmp_wpolicy_passive = false;
#if KMP_USE_MONITOR
int __kmp_monitor_wakeups = KMP_MIN_MONITOR_WAKEUPS;
int __kmp_bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME(KMP_DEFAULT_BLOCKTIME,
Expand Down
1 change: 1 addition & 0 deletions openmp/runtime/src/kmp_settings.cpp
Expand Up @@ -812,6 +812,7 @@ static void __kmp_stg_parse_wait_policy(char const *name, char const *value,
}
} else if (__kmp_str_match("PASSIVE", 1, value)) {
__kmp_library = library_throughput;
__kmp_wpolicy_passive = true; /* allow sleep while active tasking */
if (blocktime_str == NULL) {
// KMP_BLOCKTIME not specified, so set default to 0.
__kmp_dflt_blocktime = 0;
Expand Down
26 changes: 25 additions & 1 deletion openmp/runtime/src/kmp_tasking.cpp
Expand Up @@ -1909,8 +1909,21 @@ kmp_int32 __kmp_omp_task(kmp_int32 gtid, kmp_task_t *new_task,
if (serialize_immediate)
new_taskdata->td_flags.task_serial = 1;
__kmp_invoke_task(gtid, new_task, current_task);
} else if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME &&
__kmp_wpolicy_passive) {
kmp_info_t *this_thr = __kmp_threads[gtid];
kmp_team_t *team = this_thr->th.th_team;
kmp_int32 nthreads = this_thr->th.th_team_nproc;
for (int i = 0; i < nthreads; ++i) {
kmp_info_t *thread = team->t.t_threads[i];
if (thread == this_thr)
continue;
if (thread->th.th_sleep_loc != NULL) {
__kmp_null_resume_wrapper(thread);
break; // awake one thread at a time
}
}
}

return TASK_CURRENT_NOT_QUEUED;
}

Expand Down Expand Up @@ -4282,6 +4295,17 @@ void __kmpc_give_task(kmp_task_t *ptask, kmp_int32 start = 0) {
pass = pass << 1;

} while (!__kmp_give_task(thread, k, ptask, pass));

if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME && __kmp_wpolicy_passive) {
// awake at least one thread to execute given task
for (int i = 0; i < nthreads; ++i) {
thread = team->t.t_threads[i];
if (thread->th.th_sleep_loc != NULL) {
__kmp_null_resume_wrapper(thread);
break;
}
}
}
}

/*!
Expand Down
3 changes: 2 additions & 1 deletion openmp/runtime/src/kmp_wait_release.h
Expand Up @@ -609,7 +609,8 @@ final_spin=FALSE)
continue;

// Don't suspend if there is a likelihood of new tasks being spawned.
if ((task_team != NULL) && TCR_4(task_team->tt.tt_found_tasks))
if (task_team != NULL && TCR_4(task_team->tt.tt_found_tasks) &&
!__kmp_wpolicy_passive)
continue;

#if KMP_USE_MONITOR
Expand Down

0 comments on commit c44ba01

Please sign in to comment.