Index: runtime/src/kmp_csupport.cpp =================================================================== --- runtime/src/kmp_csupport.cpp +++ runtime/src/kmp_csupport.cpp @@ -486,7 +486,7 @@ if (ompt_enabled.ompt_callback_implicit_task) { ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_end, NULL, OMPT_CUR_TASK_DATA(this_thr), 1, - __kmp_tid_from_gtid(global_tid)); + OMPT_CUR_TASK_INFO(this_thr)->thread_num); } // reset clear the task id only after unlinking the task Index: runtime/src/kmp_gsupport.cpp =================================================================== --- runtime/src/kmp_gsupport.cpp +++ runtime/src/kmp_gsupport.cpp @@ -401,6 +401,7 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, &(team_info->parallel_data), &(task_info->task_data), ompt_team_size, __kmp_tid_from_gtid(gtid)); + task_info->thread_num = __kmp_tid_from_gtid(gtid); } thr->th.ompt_thread_info.state = omp_state_work_parallel; } Index: runtime/src/kmp_runtime.cpp =================================================================== --- runtime/src/kmp_runtime.cpp +++ runtime/src/kmp_runtime.cpp @@ -1386,6 +1386,8 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, OMPT_CUR_TEAM_DATA(this_thr), OMPT_CUR_TASK_DATA(this_thr), 1, __kmp_tid_from_gtid(global_tid)); + OMPT_CUR_TASK_INFO(this_thr) + ->thread_num = __kmp_tid_from_gtid(global_tid); } /* OMPT state */ @@ -1551,6 +1553,8 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th), implicit_task_data, 1, __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th) + ->thread_num = __kmp_tid_from_gtid(gtid); } /* OMPT state */ @@ -1578,7 +1582,7 @@ if (ompt_enabled.ompt_callback_implicit_task) { ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_end, NULL, implicit_task_data, 1, - __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th)->thread_num); } __ompt_lw_taskteam_unlink(master_th); @@ -1762,6 +1766,8 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th), &(task_info->task_data), 1, __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th) + ->thread_num = __kmp_tid_from_gtid(gtid); } /* OMPT state */ @@ -1789,7 +1795,7 @@ if (ompt_enabled.ompt_callback_implicit_task) { ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_end, NULL, &(task_info->task_data), 1, - __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th)->thread_num); } __ompt_lw_taskteam_unlink(master_th); @@ -1865,6 +1871,8 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, OMPT_CUR_TEAM_DATA(master_th), implicit_task_data, 1, __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th) + ->thread_num = __kmp_tid_from_gtid(gtid); } /* OMPT state */ @@ -1891,7 +1899,7 @@ if (ompt_enabled.ompt_callback_implicit_task) { ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_end, NULL, &(task_info->task_data), 1, - __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th)->thread_num); } ompt_parallel_data = *OMPT_CUR_TEAM_DATA(master_th); @@ -2494,7 +2502,7 @@ int ompt_team_size = team->t.t_nproc; ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_end, NULL, &(task_info->task_data), ompt_team_size, - __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(master_th)->thread_num); } task_info->frame.exit_frame = NULL; @@ -6919,6 +6927,7 @@ ompt_callbacks.ompt_callback(ompt_callback_implicit_task)( ompt_scope_begin, my_parallel_data, my_task_data, ompt_team_size, __kmp_tid_from_gtid(gtid)); + OMPT_CUR_TASK_INFO(this_thr)->thread_num = __kmp_tid_from_gtid(gtid); } #endif Index: runtime/src/ompt-internal.h =================================================================== --- runtime/src/ompt-internal.h +++ runtime/src/ompt-internal.h @@ -56,6 +56,7 @@ ompt_frame_t frame; ompt_data_t task_data; struct kmp_taskdata *scheduling_parent; + int thread_num; #if OMP_40_ENABLED int ndeps; ompt_task_dependence_t *deps; Index: runtime/test/ompt/parallel/nested_threadnum.c =================================================================== --- /dev/null +++ runtime/test/ompt/parallel/nested_threadnum.c @@ -0,0 +1,61 @@ +// RUN: %libomp-compile-and-run | %sort-threads | FileCheck %s +// REQUIRES: ompt +#include +#include "callback.h" + +int main() { + omp_set_nested(1); +#pragma omp parallel num_threads(2) + { +#pragma omp parallel num_threads(2) + { print_frame(0); } + } + + // CHECK: 0: NULL_POINTER=[[NULL:.*$]] + + // CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_parallel_begin: + // CHECK-SAME: parallel_id=[[PARALLEL_ID:[0-9]+]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_begin: + // CHECK-SAME: parallel_id=[[PARALLEL_ID]] + // CHECK-SAME: thread_num=[[OUTER_THREAD_NUM1:[0-9]+]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID1:[0-9]+]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_begin: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID1]] + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM1:[0-9]+]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM1]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_end: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID1]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[OUTER_THREAD_NUM1]] + // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_end: + // CHECK-SAME: parallel_id=[[PARALLEL_ID]] + + // CHECK: {{^}}[[WORKER_ID1:[0-9]+]]: ompt_event_implicit_task_begin: + // CHECK-SAME: parallel_id=[[PARALLEL_ID]] + // CHECK-SAME: thread_num=[[OUTER_THREAD_NUM2:[0-9]+]] + // CHECK: {{^}}[[WORKER_ID1]]: ompt_event_parallel_begin: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID2:[0-9]+]] + // CHECK: {{^}}[[WORKER_ID1]]: ompt_event_implicit_task_begin: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID2]] + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM2:[0-9]+]] + // CHECK: {{^}}[[WORKER_ID1]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM2]] + // CHECK: {{^}}[[WORKER_ID1]]: ompt_event_parallel_end: + // CHECK-SAME: parallel_id=[[INNER_PARALLEL_ID2]] + // CHECK: {{^}}[[WORKER_ID1]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[OUTER_THREAD_NUM2]] + + // CHECK: {{^}}[[WORKER_ID2:[0-9]+]]: ompt_event_implicit_task_begin: + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM3:[0-9]+]] + // CHECK: {{^}}[[WORKER_ID2]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM3]] + + // CHECK: {{^}}[[WORKER_ID3:[0-9]+]]: ompt_event_implicit_task_begin: + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM4:[0-9]+]] + // CHECK: {{^}}[[WORKER_ID3]]: ompt_event_implicit_task_end + // CHECK-SAME: thread_num=[[INNER_THREAD_NUM4]] + + return 0; +}