diff options
Diffstat (limited to 'openmp/runtime/src')
-rw-r--r-- | openmp/runtime/src/kmp_runtime.c | 3 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_tasking.c | 42 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_wait_release.h | 5 | ||||
-rw-r--r-- | openmp/runtime/src/z_Linux_util.c | 4 |
4 files changed, 28 insertions, 26 deletions
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index b1d5e06bfd1..60e0e495930 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -5093,7 +5093,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, } } - /* reinitialize the old threads */ + /* reinitialize the threads */ + KMP_DEBUG_ASSERT(team->t.t_nproc == new_nproc); if (level) { for( f = 0 ; f < team->t.t_nproc ; f++ ) { __kmp_initialize_info( team->t.t_threads[ f ], team, f, diff --git a/openmp/runtime/src/kmp_tasking.c b/openmp/runtime/src/kmp_tasking.c index 20ac242e3a7..80e82691f41 100644 --- a/openmp/runtime/src/kmp_tasking.c +++ b/openmp/runtime/src/kmp_tasking.c @@ -1092,7 +1092,7 @@ __kmp_invoke_task( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t * current_ta #endif KA_TRACE(30, ("__kmp_invoke_task(enter): T#%d invoking task %p, current_task=%p\n", gtid, taskdata, current_task) ); - + KMP_DEBUG_ASSERT(task); #if OMP_41_ENABLED if ( taskdata->td_flags.proxy == TASK_PROXY && taskdata->td_flags.complete == 1) @@ -2535,9 +2535,9 @@ __kmp_task_team_setup( kmp_info_t *this_thr, kmp_team_t *team, int both, int alw // reference the kmp_team_t struct, which could be reallocated // by the master thread). team->t.t_task_team[this_thr->th.th_task_state] = __kmp_allocate_task_team( this_thr, team ); - KA_TRACE(20, ("__kmp_task_team_setup: Master T#%d created new task_team %p for team %d\n", + KA_TRACE(20, ("__kmp_task_team_setup: Master T#%d created new task_team %p for team %d at parity=%d\n", __kmp_gtid_from_thread(this_thr), team->t.t_task_team[this_thr->th.th_task_state], - ((team != NULL) ? team->t.t_id : -1)) ); + ((team != NULL) ? team->t.t_id : -1), this_thr->th.th_task_state)); } // else: Either all threads have reported in, and no tasks were spawned for this release->gather region // Leave the old task team struct in place for the upcoming region. @@ -2546,10 +2546,10 @@ __kmp_task_team_setup( kmp_info_t *this_thr, kmp_team_t *team, int both, int alw int other_team = 1 - this_thr->th.th_task_state; if ( ( team->t.t_task_team[other_team] == NULL ) && ( team->t.t_nproc > 1 ) ) { // setup other team as well team->t.t_task_team[other_team] = __kmp_allocate_task_team( this_thr, team ); - KA_TRACE( 20, ( "__kmp_task_team_setup: Master T#%d created new task_team %p for team %d\n", - __kmp_gtid_from_thread( this_thr ), team->t.t_task_team[other_team], - ((team != NULL) ? team->t.t_id : -1)) ); - } + KA_TRACE(20, ("__kmp_task_team_setup: Master T#%d created second new task_team %p for team %d at parity=%d\n", + __kmp_gtid_from_thread( this_thr ), team->t.t_task_team[other_team], + ((team != NULL) ? team->t.t_id : -1), other_team )); + } } } @@ -2568,19 +2568,24 @@ __kmp_task_team_sync( kmp_info_t *this_thr, kmp_team_t *team ) if ( this_thr->th.th_task_team != NULL ) { if ( ! TCR_SYNC_4( this_thr->th.th_task_team->tt.tt_active ) ) { KMP_DEBUG_ASSERT( ! KMP_MASTER_TID( __kmp_tid_from_gtid( __kmp_gtid_from_thread( this_thr ) ) ) ); + KA_TRACE(20, ("__kmp_task_team_sync: Thread T#%d task team (%p)is not active, unrefing\n", + __kmp_gtid_from_thread( this_thr ), this_thr->th.th_task_team)); __kmp_unref_task_team( this_thr->th.th_task_team, this_thr ); - } else { // We are re-using a task team that was never enabled. + } +#if KMP_DEBUG + else { // We are re-using a task team that was never enabled. KMP_DEBUG_ASSERT(this_thr->th.th_task_team == team->t.t_task_team[this_thr->th.th_task_state]); } +#endif } // Toggle the th_task_state field, to switch which task_team this thread refers to - this_thr->th.th_task_state = 1 - this_thr->th.th_task_state; + this_thr->th.th_task_state = 1 - this_thr->th.th_task_state; // It is now safe to propagate the task team pointer from the team struct to the current thread. TCW_PTR(this_thr->th.th_task_team, team->t.t_task_team[this_thr->th.th_task_state]); - KA_TRACE( 20, ( "__kmp_task_team_sync: Thread T#%d task team assigned pointer (%p) from Team #%d task team\n", - __kmp_gtid_from_thread( this_thr ), &this_thr->th.th_task_team, - this_thr->th.th_task_team, ((team != NULL) ? (team->t.t_id) : -1) ) ); + KA_TRACE(20, ("__kmp_task_team_sync: Thread T#%d task team switched to %p from Team #%d task team (parity=%d)\n", + __kmp_gtid_from_thread( this_thr ), this_thr->th.th_task_team, + ((team != NULL) ? team->t.t_id : -1), this_thr->th.th_task_state)); } @@ -2598,11 +2603,10 @@ __kmp_task_team_wait( kmp_info_t *this_thr, kmp_team_t *team KMP_DEBUG_ASSERT( task_team == this_thr->th.th_task_team ); if ( ( task_team != NULL ) && KMP_TASKING_ENABLED(task_team) ) { - KA_TRACE( 20, ( "__kmp_task_team_wait: Master T#%d waiting for all tasks: task_team = %p\n", - __kmp_gtid_from_thread( this_thr ), task_team ) ); - // All worker threads might have dropped through to the release phase, but could still - // be executing tasks. Wait here for all tasks to complete. To avoid memory contention, - // only the master thread checks for the termination condition. + KA_TRACE(20, ("__kmp_task_team_wait: Master T#%d waiting for all tasks (for unfinished_threads to reach 0) on task_team = %p\n", + __kmp_gtid_from_thread(this_thr), task_team)); + // Worker threads may have dropped through to release phase, but could still be executing tasks. Wait + // here for tasks to complete. To avoid memory contention, only master thread checks termination condition. kmp_flag_32 flag(&task_team->tt.tt_unfinished_threads, 0U); flag.wait(this_thr, TRUE USE_ITT_BUILD_ARG(itt_sync_obj)); @@ -2610,8 +2614,8 @@ __kmp_task_team_wait( kmp_info_t *this_thr, kmp_team_t *team // Kill the old task team, so that the worker threads will stop referencing it while spinning. // They will deallocate it when the reference count reaches zero. // The master thread is not included in the ref count. - KA_TRACE( 20, ( "__kmp_task_team_wait: Master T#%d deactivating task_team %p\n", - __kmp_gtid_from_thread( this_thr ), task_team ) ); + KA_TRACE(20, ("__kmp_task_team_wait: Master T#%d deactivating task_team %p: setting active to false, setting local and team's pointer to NULL\n", + __kmp_gtid_from_thread(this_thr), task_team)); #if OMP_41_ENABLED KMP_DEBUG_ASSERT( task_team->tt.tt_nproc > 1 || task_team->tt.tt_found_proxy_tasks == TRUE ); TCW_SYNC_4( task_team->tt.tt_found_proxy_tasks, FALSE ); diff --git a/openmp/runtime/src/kmp_wait_release.h b/openmp/runtime/src/kmp_wait_release.h index 97949efdd5c..aac924db422 100644 --- a/openmp/runtime/src/kmp_wait_release.h +++ b/openmp/runtime/src/kmp_wait_release.h @@ -282,12 +282,9 @@ template <class C> static inline void __kmp_release_template(C *flag) { #ifdef KMP_DEBUG - // FIX ME - kmp_info_t * wait_thr = flag->get_waiter(0); - int target_gtid = wait_thr->th.th_info.ds.ds_gtid; int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1; #endif - KF_TRACE(20, ("__kmp_release: T#%d releasing T#%d spin(%p)\n", gtid, target_gtid, flag->get())); + KF_TRACE(20, ("__kmp_release: T#%d releasing flag(%x)\n", gtid, flag->get())); KMP_DEBUG_ASSERT(flag->get()); KMP_FSYNC_RELEASING(flag->get()); diff --git a/openmp/runtime/src/z_Linux_util.c b/openmp/runtime/src/z_Linux_util.c index 8992733d7bb..9815232201f 100644 --- a/openmp/runtime/src/z_Linux_util.c +++ b/openmp/runtime/src/z_Linux_util.c @@ -1704,8 +1704,8 @@ static inline void __kmp_suspend_template( int th_gtid, C *flag ) */ old_spin = flag->set_sleeping(); - KF_TRACE( 5, ( "__kmp_suspend_template: T#%d set sleep bit for spin(%p)==%d\n", - th_gtid, flag->get(), *(flag->get()) ) ); + KF_TRACE( 5, ( "__kmp_suspend_template: T#%d set sleep bit for spin(%p)==%x, was %x\n", + th_gtid, flag->get(), *(flag->get()), old_spin ) ); if ( flag->done_check_val(old_spin) ) { old_spin = flag->unset_sleeping(); |