diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-11-21 18:45:39 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-11-21 18:45:39 +0000 |
commit | 415817083b7f2abf48775ced15691960fb4b77dc (patch) | |
tree | 38d963c342ba7b78b5069228a08a62f64ba8e103 | |
parent | ba41eae9a259c034b365f9001d19cd713aec1661 (diff) | |
download | llvm-415817083b7f2abf48775ced15691960fb4b77dc.zip llvm-415817083b7f2abf48775ced15691960fb4b77dc.tar.gz llvm-415817083b7f2abf48775ced15691960fb4b77dc.tar.bz2 |
Merging r285283:
------------------------------------------------------------------------
r285283 | achurbanov | 2016-10-27 06:43:07 -0500 (Thu, 27 Oct 2016) | 6 lines
Fixed a memory leak related to task dependencies.
Differential Revision: http://reviews.llvm.org/D25504
Patch by Alex Duran.
------------------------------------------------------------------------
llvm-svn: 287559
-rw-r--r-- | openmp/runtime/src/kmp.h | 20 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_runtime.c | 3 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_taskdeps.cpp | 20 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_tasking.c | 35 |
4 files changed, 65 insertions, 13 deletions
diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h index 6fc378b..dd73992 100644 --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -3327,6 +3327,8 @@ extern kmp_task_t* __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_routine_entry_t task_entry ); extern void __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *team, int tid, int set_curr_task ); +extern void __kmp_finish_implicit_task(kmp_info_t *this_thr); +extern void __kmp_free_implicit_task(kmp_info_t *this_thr); int __kmp_execute_tasks_32(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_32 *flag, int final_spin, int *thread_finished, @@ -3496,12 +3498,18 @@ void __kmpc_omp_task_complete( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *tas KMP_EXPORT void __kmpc_taskgroup( ident_t * loc, int gtid ); KMP_EXPORT void __kmpc_end_taskgroup( ident_t * loc, int gtid ); -KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task, - kmp_int32 ndeps, kmp_depend_info_t *dep_list, - kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list ); -KMP_EXPORT void __kmpc_omp_wait_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_int32 ndeps, kmp_depend_info_t *dep_list, - kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list ); -extern void __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task ); +KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps( + ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *new_task, kmp_int32 ndeps, + kmp_depend_info_t *dep_list, kmp_int32 ndeps_noalias, + kmp_depend_info_t *noalias_dep_list); +KMP_EXPORT void __kmpc_omp_wait_deps(ident_t *loc_ref, kmp_int32 gtid, + kmp_int32 ndeps, + kmp_depend_info_t *dep_list, + kmp_int32 ndeps_noalias, + kmp_depend_info_t *noalias_dep_list); +extern void __kmp_release_deps(kmp_int32 gtid, kmp_taskdata_t *task); +extern void __kmp_dephash_free_entries(kmp_info_t *thread, kmp_dephash_t *h); +extern void __kmp_dephash_free(kmp_info_t *thread, kmp_dephash_t *h); extern kmp_int32 __kmp_omp_task( kmp_int32 gtid, kmp_task_t * new_task, bool serialize_immediate ); diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index 7b2ef06..77b8c07 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -5743,6 +5743,7 @@ __kmp_reap_thread( }; // if #endif /* KMP_AFFINITY_SUPPORTED */ + __kmp_free_implicit_task(thread); __kmp_reap_team( thread->th.th_serial_team ); thread->th.th_serial_team = NULL; __kmp_free( thread ); @@ -6784,6 +6785,8 @@ __kmp_run_after_invoked_task( int gtid, int tid, kmp_info_t *this_thr, { if( __kmp_env_consistency_check ) __kmp_pop_parallel( gtid, team->t.t_ident ); + + __kmp_finish_implicit_task(this_thr); } int diff --git a/openmp/runtime/src/kmp_taskdeps.cpp b/openmp/runtime/src/kmp_taskdeps.cpp index 46ba5df..47d0cd2 100644 --- a/openmp/runtime/src/kmp_taskdeps.cpp +++ b/openmp/runtime/src/kmp_taskdeps.cpp @@ -97,7 +97,8 @@ __kmp_dephash_create ( kmp_info_t *thread, kmp_taskdata_t *current_task ) else h_size = KMP_DEPHASH_OTHER_SIZE; - kmp_int32 size = h_size * sizeof(kmp_dephash_entry_t) + sizeof(kmp_dephash_t); + kmp_int32 size = + h_size * sizeof(kmp_dephash_entry_t *) + sizeof(kmp_dephash_t); #if USE_FAST_MEMORY h = (kmp_dephash_t *) __kmp_fast_allocate( thread, size ); @@ -118,13 +119,13 @@ __kmp_dephash_create ( kmp_info_t *thread, kmp_taskdata_t *current_task ) return h; } -static void -__kmp_dephash_free ( kmp_info_t *thread, kmp_dephash_t *h ) +void +__kmp_dephash_free_entries(kmp_info_t *thread, kmp_dephash_t *h) { - for ( size_t i=0; i < h->size; i++ ) { - if ( h->buckets[i] ) { + for (size_t i = 0; i < h->size; i++) { + if (h->buckets[i]) { kmp_dephash_entry_t *next; - for ( kmp_dephash_entry_t *entry = h->buckets[i]; entry; entry = next ) { + for (kmp_dephash_entry_t *entry = h->buckets[i]; entry; entry = next) { next = entry->next_in_bucket; __kmp_depnode_list_free(thread,entry->last_ins); __kmp_node_deref(thread,entry->last_out); @@ -134,8 +135,15 @@ __kmp_dephash_free ( kmp_info_t *thread, kmp_dephash_t *h ) __kmp_thread_free(thread,entry); #endif } + h->buckets[i] = 0; } } +} + +void +__kmp_dephash_free(kmp_info_t *thread, kmp_dephash_t *h) +{ + __kmp_dephash_free_entries(thread, h); #if USE_FAST_MEMORY __kmp_fast_free(thread,h); #else diff --git a/openmp/runtime/src/kmp_tasking.c b/openmp/runtime/src/kmp_tasking.c index ce1b63d..9a64045 100644 --- a/openmp/runtime/src/kmp_tasking.c +++ b/openmp/runtime/src/kmp_tasking.c @@ -852,7 +852,6 @@ __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *te task->td_flags.freed = 0; #if OMP_40_ENABLED - task->td_dephash = NULL; task->td_depnode = NULL; #endif @@ -861,6 +860,7 @@ __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *te task->td_allocated_child_tasks = 0; // Not used because do not need to deallocate implicit task #if OMP_40_ENABLED task->td_taskgroup = NULL; // An implicit task does not have taskgroup + task->td_dephash = NULL; #endif __kmp_push_current_task_to_thread( this_thr, team, tid ); } else { @@ -876,6 +876,39 @@ __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *te tid, team, task ) ); } + +//----------------------------------------------------------------------------- +//// __kmp_finish_implicit_task: Release resources associated to implicit tasks +//// at the end of parallel regions. Some resources are kept for reuse in the +//// next parallel region. +//// +//// thread: thread data structure corresponding to implicit task +// +void +__kmp_finish_implicit_task(kmp_info_t *thread) +{ + kmp_taskdata_t *task = thread->th.th_current_task; + if (task->td_dephash) + __kmp_dephash_free_entries(thread, task->td_dephash); +} + + +//----------------------------------------------------------------------------- +//// __kmp_free_implicit_task: Release resources associated to implicit tasks +//// when these are destroyed regions +//// +//// thread: thread data structure corresponding to implicit task +// +void +__kmp_free_implicit_task(kmp_info_t *thread) +{ + kmp_taskdata_t *task = thread->th.th_current_task; + if (task->td_dephash) + __kmp_dephash_free(thread, task->td_dephash); + task->td_dephash = NULL; +} + + // Round up a size to a power of two specified by val // Used to insert padding between structures co-allocated using a single malloc() call static size_t |