[Openmp-commits] [openmp] r254322 - Fix honoring of OMP_THREAD_LIMIT in the teams construct
Jonathan Peyton via Openmp-commits
openmp-commits at lists.llvm.org
Mon Nov 30 12:14:05 PST 2015
Author: jlpeyton
Date: Mon Nov 30 14:14:05 2015
New Revision: 254322
URL: http://llvm.org/viewvc/llvm-project?rev=254322&view=rev
Log:
Fix honoring of OMP_THREAD_LIMIT in the teams construct
Fix for crash in the teams construct in case user sets OMP_THREAD_LIMIT to a
number less than the number of processors. Now the number of threads will be
silently reduced if the user didn't specify teams parameters or with a
warning if the user specified teams parameters conflicting with
OMP_THREAD_LIMIT.
Differential Revision: http://reviews.llvm.org/D14732
Modified:
openmp/trunk/runtime/src/kmp_runtime.c
Modified: openmp/trunk/runtime/src/kmp_runtime.c
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_runtime.c?rev=254322&r1=254321&r2=254322&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_runtime.c (original)
+++ openmp/trunk/runtime/src/kmp_runtime.c Mon Nov 30 14:14:05 2015
@@ -5033,7 +5033,7 @@ __kmp_allocate_team( kmp_root_t *root, i
__kmp_initialize_info( team->t.t_threads[ f ], team, f, __kmp_gtid_from_tid( f, team ) );
if (level) { // set th_task_state for new threads in nested hot team
// __kmp_initialize_info() no longer zeroes th_task_state, so we should only need to set the
- // th_task_state for the new threads. th_task_state for master thread will not be accurate until
+ // th_task_state for the new threads. th_task_state for master thread will not be accurate until
// after this in __kmp_fork_call(), so we look to the master's memo_stack to get the correct value.
for (f=old_nproc; f < team->t.t_nproc; ++f)
team->t.t_threads[f]->th.th_task_state = team->t.t_threads[0]->th.th_task_state_memo_stack[level];
@@ -5517,7 +5517,7 @@ __kmp_launch_thread( kmp_info_t *this_th
this_thr->th.ompt_thread_info.state = ompt_state_work_parallel;
// Initialize OMPT task id for implicit task.
int tid = __kmp_tid_from_gtid(gtid);
- (*pteam)->t.t_implicit_task_taskdata[tid].ompt_task_info.task_id =
+ (*pteam)->t.t_implicit_task_taskdata[tid].ompt_task_info.task_id =
__ompt_task_id_new(tid);
}
#endif
@@ -6955,20 +6955,49 @@ __kmp_push_num_teams( ident_t *id, int g
kmp_info_t *thr = __kmp_threads[gtid];
KMP_DEBUG_ASSERT(num_teams >= 0);
KMP_DEBUG_ASSERT(num_threads >= 0);
- if( num_teams == 0 ) {
+
+ if( num_teams == 0 )
num_teams = 1; // default number of teams is 1.
+ if( num_teams > __kmp_max_nth ) { // if too many teams requested?
+ if ( !__kmp_reserve_warn ) {
+ __kmp_reserve_warn = 1;
+ __kmp_msg(
+ kmp_ms_warning,
+ KMP_MSG( CantFormThrTeam, num_teams, __kmp_max_nth ),
+ KMP_HNT( Unset_ALL_THREADS ),
+ __kmp_msg_null
+ );
+ }
+ num_teams = __kmp_max_nth;
}
// Set number of teams (number of threads in the outer "parallel" of the teams)
thr->th.th_set_nproc = thr->th.th_teams_size.nteams = num_teams;
// Remember the number of threads for inner parallel regions
- if( num_threads > 0 ) {
- thr->th.th_teams_size.nth = num_threads;
- } else {
+ if( num_threads == 0 ) {
if( !TCR_4(__kmp_init_middle) )
__kmp_middle_initialize(); // get __kmp_avail_proc calculated
- thr->th.th_teams_size.nth = __kmp_avail_proc / num_teams;
+ num_threads = __kmp_avail_proc / num_teams;
+ if( num_teams * num_threads > __kmp_max_nth ) {
+ // adjust num_threads w/o warning as it is not user setting
+ num_threads = __kmp_max_nth / num_teams;
+ }
+ } else {
+ if( num_teams * num_threads > __kmp_max_nth ) {
+ int new_threads = __kmp_max_nth / num_teams;
+ if ( !__kmp_reserve_warn ) { // user asked for too many threads
+ __kmp_reserve_warn = 1; // that conflicts with OMP_THREAD_LIMIT
+ __kmp_msg(
+ kmp_ms_warning,
+ KMP_MSG( CantFormThrTeam, num_threads, new_threads ),
+ KMP_HNT( Unset_ALL_THREADS ),
+ __kmp_msg_null
+ );
+ }
+ num_threads = new_threads;
+ }
}
+ thr->th.th_teams_size.nth = num_threads;
}
More information about the Openmp-commits
mailing list