[Openmp-commits] [openmp] r270890 - Fix for OMP_PROC_BIND=spread strategy

Jonathan Peyton via Openmp-commits openmp-commits at lists.llvm.org
Thu May 26 12:09:47 PDT 2016


Author: jlpeyton
Date: Thu May 26 14:09:46 2016
New Revision: 270890

URL: http://llvm.org/viewvc/llvm-project?rev=270890&view=rev
Log:
Fix for OMP_PROC_BIND=spread strategy

The OMP_PROC_BIND=spread strategy fails to assign the master thread the
correct place partition after the first parallel region. Other threads in the
hot team will remember their place_partition, but the master's place partition
is restored to what it was before entering the parallel region. So when the hot
team is used for subsequent parallel regions, the master has lost this info.
This fix calls __kmp_partition_places to update only the master thread's place
partition in the spread case when there are no other changes to the hot team.

Patch by Terry Wilmarth

Differential Revision: http://reviews.llvm.org/D20539

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=270890&r1=270889&r2=270890&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_runtime.c (original)
+++ openmp/trunk/runtime/src/kmp_runtime.c Thu May 26 14:09:46 2016
@@ -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(
 // 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, i
 # 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 ) );




More information about the Openmp-commits mailing list