Index: runtime/src/kmp_runtime.c =================================================================== --- runtime/src/kmp_runtime.c +++ runtime/src/kmp_runtime.c @@ -70,7 +70,7 @@ static void __kmp_initialize_info( kmp_info_t *, kmp_team_t *, int tid, int gtid ); static void __kmp_initialize_team( kmp_team_t * team, int new_nproc, kmp_internal_control_t * new_icvs, ident_t * loc ); #if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED -static void __kmp_partition_places( kmp_team_t *team ); +static void __kmp_partition_places( kmp_team_t *team, int update_master_only=0 ); #endif static void __kmp_do_serial_initialize( void ); void __kmp_fork_barrier( int gtid, int tid ); @@ -4436,7 +4436,7 @@ // The master thread's partition should already include its current binding. // static void -__kmp_partition_places( kmp_team_t *team ) +__kmp_partition_places( kmp_team_t *team, int update_master_only ) { // // Copy the master thread's place partion to the team struct @@ -4582,6 +4582,7 @@ int f; int n_th = team->t.t_nproc; int n_places; + int thidx; if ( first_place <= last_place ) { n_places = last_place - first_place + 1; } @@ -4595,7 +4596,10 @@ rem = n_places - n_th*S; gap = rem ? n_th/rem : 1; gap_ct = gap; - for ( f = 0; f < n_th; f++ ) { + thidx = n_th; + if (update_master_only == 1) + thidx = 1; + for ( f = 0; f < thidx; f++ ) { kmp_info_t *th = team->t.t_threads[f]; KMP_DEBUG_ASSERT( th != NULL ); @@ -4655,7 +4659,10 @@ gap = rem > 0 ? n_places/rem : n_places; int place = masters_place; int gap_ct = gap; - for ( f = 0; f < n_th; f++ ) { + thidx = n_th; + if (update_master_only == 1) + thidx = 1; + for ( f = 0; f < thidx; f++ ) { kmp_info_t *th = team->t.t_threads[f]; KMP_DEBUG_ASSERT( th != NULL ); @@ -4802,6 +4809,9 @@ # if KMP_AFFINITY_SUPPORTED if ( ( team->t.t_size_changed == 0 ) && ( team->t.t_proc_bind == new_proc_bind ) ) { + if (new_proc_bind == proc_bind_spread) { + __kmp_partition_places(team, 1); // add flag to update only master for spread + } KA_TRACE( 200, ("__kmp_allocate_team: reusing hot team #%d bindings: proc_bind = %d, partition = [%d,%d]\n", team->t.t_id, new_proc_bind, team->t.t_first_place, team->t.t_last_place ) );