[Openmp-commits] [PATCH] D123044: [OpenMP] libomp: honor passive wait policy requested in the presence of tasking
Andrey Churbanov via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Mon Apr 4 09:14:26 PDT 2022
AndreyChurbanov created this revision.
AndreyChurbanov added reviewers: hbae, jlpeyton, tlwilmar.
AndreyChurbanov added a project: OpenMP.
Herald added subscribers: guansong, yaxunl.
Herald added a project: All.
AndreyChurbanov requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: openmp-commits, sstefan1.
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D123044
Files:
openmp/runtime/src/kmp.h
openmp/runtime/src/kmp_global.cpp
openmp/runtime/src/kmp_settings.cpp
openmp/runtime/src/kmp_tasking.cpp
openmp/runtime/src/kmp_wait_release.h
Index: openmp/runtime/src/kmp_wait_release.h
===================================================================
--- openmp/runtime/src/kmp_wait_release.h
+++ openmp/runtime/src/kmp_wait_release.h
@@ -609,7 +609,8 @@
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
Index: openmp/runtime/src/kmp_tasking.cpp
===================================================================
--- openmp/runtime/src/kmp_tasking.cpp
+++ openmp/runtime/src/kmp_tasking.cpp
@@ -1895,8 +1895,21 @@
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;
}
@@ -4268,6 +4281,17 @@
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;
+ }
+ }
+ }
}
/*!
Index: openmp/runtime/src/kmp_settings.cpp
===================================================================
--- openmp/runtime/src/kmp_settings.cpp
+++ openmp/runtime/src/kmp_settings.cpp
@@ -812,6 +812,7 @@
}
} 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;
Index: openmp/runtime/src/kmp_global.cpp
===================================================================
--- openmp/runtime/src/kmp_global.cpp
+++ openmp/runtime/src/kmp_global.cpp
@@ -154,6 +154,7 @@
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,
Index: openmp/runtime/src/kmp.h
===================================================================
--- openmp/runtime/src/kmp.h
+++ openmp/runtime/src/kmp.h
@@ -3168,6 +3168,7 @@
(__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 */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D123044.420203.patch
Type: text/x-patch
Size: 3532 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20220404/c90f590d/attachment-0001.bin>
More information about the Openmp-commits
mailing list