summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openmp/runtime/src/kmp_runtime.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c
index 72ecd7ee6ec..48aaea419b4 100644
--- a/openmp/runtime/src/kmp_runtime.c
+++ b/openmp/runtime/src/kmp_runtime.c
@@ -70,7 +70,7 @@ void __kmp_cleanup( void );
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 );
@@ -4438,7 +4438,7 @@ __kmp_set_thread_affinity_mask_full_tmp( kmp_affin_mask_t *old_mask )
// 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
@@ -4584,6 +4584,7 @@ __kmp_partition_places( kmp_team_t *team )
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;
}
@@ -4597,7 +4598,10 @@ __kmp_partition_places( kmp_team_t *team )
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 );
@@ -4657,7 +4661,10 @@ __kmp_partition_places( kmp_team_t *team )
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 );
@@ -4804,6 +4811,9 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
# 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 ) );
OpenPOWER on IntegriCloud