@@ -7192,19 +7192,32 @@ void __kmp_push_num_teams(ident_t *id, int gtid, int num_teams,
7192
7192
thr->th .th_set_nproc = thr->th .th_teams_size .nteams = num_teams;
7193
7193
7194
7194
// Remember the number of threads for inner parallel regions
7195
+ if (!TCR_4 (__kmp_init_middle))
7196
+ __kmp_middle_initialize (); // get internal globals calculated
7197
+ KMP_DEBUG_ASSERT (__kmp_avail_proc);
7198
+ KMP_DEBUG_ASSERT (__kmp_dflt_team_nth);
7195
7199
if (num_threads == 0 ) {
7196
- if (!TCR_4 (__kmp_init_middle))
7197
- __kmp_middle_initialize (); // get __kmp_avail_proc calculated
7198
7200
num_threads = __kmp_avail_proc / num_teams;
7201
+ // adjust num_threads w/o warning as it is not user setting
7202
+ // num_threads = min(num_threads, nthreads-var, thread-limit-var)
7203
+ // no thread_limit clause specified - do not change thread-limit-var ICV
7204
+ if (num_threads > __kmp_dflt_team_nth) {
7205
+ num_threads = __kmp_dflt_team_nth; // honor nthreads-var ICV
7206
+ }
7207
+ if (num_threads > thr->th .th_current_task ->td_icvs .thread_limit ) {
7208
+ num_threads = thr->th .th_current_task ->td_icvs .thread_limit ;
7209
+ } // prevent team size to exceed thread-limit-var
7199
7210
if (num_teams * num_threads > __kmp_teams_max_nth) {
7200
- // adjust num_threads w/o warning as it is not user setting
7201
7211
num_threads = __kmp_teams_max_nth / num_teams;
7202
7212
}
7203
7213
} else {
7204
7214
// This thread will be the master of the league masters
7205
7215
// Store new thread limit; old limit is saved in th_cg_roots list
7206
7216
thr->th .th_current_task ->td_icvs .thread_limit = num_threads;
7207
-
7217
+ // num_threads = min(num_threads, nthreads-var)
7218
+ if (num_threads > __kmp_dflt_team_nth) {
7219
+ num_threads = __kmp_dflt_team_nth; // honor nthreads-var ICV
7220
+ }
7208
7221
if (num_teams * num_threads > __kmp_teams_max_nth) {
7209
7222
int new_threads = __kmp_teams_max_nth / num_teams;
7210
7223
if (!__kmp_reserve_warn) { // user asked for too many threads
0 commit comments