13865c69bSJoachim Protze /*
23865c69bSJoachim Protze * ompt-specific.cpp -- OMPT internal functions
33865c69bSJoachim Protze */
43865c69bSJoachim Protze
53865c69bSJoachim Protze //===----------------------------------------------------------------------===//
63865c69bSJoachim Protze //
757b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
857b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
957b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
103865c69bSJoachim Protze //
113865c69bSJoachim Protze //===----------------------------------------------------------------------===//
123865c69bSJoachim Protze
137cc577a4SJonathan Peyton //******************************************************************************
147cc577a4SJonathan Peyton // include files
157cc577a4SJonathan Peyton //******************************************************************************
167cc577a4SJonathan Peyton
177cc577a4SJonathan Peyton #include "kmp.h"
187cc577a4SJonathan Peyton #include "ompt-specific.h"
197cc577a4SJonathan Peyton
2082e94a59SJoachim Protze #if KMP_OS_UNIX
2182e94a59SJoachim Protze #include <dlfcn.h>
2282e94a59SJoachim Protze #endif
2382e94a59SJoachim Protze
2482e94a59SJoachim Protze #if KMP_OS_WINDOWS
2582e94a59SJoachim Protze #define THREAD_LOCAL __declspec(thread)
2682e94a59SJoachim Protze #else
2782e94a59SJoachim Protze #define THREAD_LOCAL __thread
2882e94a59SJoachim Protze #endif
2982e94a59SJoachim Protze
3003116a9fSJoachim Protze #define OMPT_WEAK_ATTRIBUTE KMP_WEAK_ATTRIBUTE_INTERNAL
3140039ac9SJonathan Peyton
327cc577a4SJonathan Peyton //******************************************************************************
337cc577a4SJonathan Peyton // macros
347cc577a4SJonathan Peyton //******************************************************************************
357cc577a4SJonathan Peyton
3682e94a59SJoachim Protze #define LWT_FROM_TEAM(team) (team)->t.ompt_serialized_team_info
377cc577a4SJonathan Peyton
387cc577a4SJonathan Peyton #define OMPT_THREAD_ID_BITS 16
397cc577a4SJonathan Peyton
407cc577a4SJonathan Peyton //******************************************************************************
417cc577a4SJonathan Peyton // private operations
427cc577a4SJonathan Peyton //******************************************************************************
437cc577a4SJonathan Peyton
447cc577a4SJonathan Peyton //----------------------------------------------------------
457cc577a4SJonathan Peyton // traverse the team and task hierarchy
4682e94a59SJoachim Protze // note: __ompt_get_teaminfo and __ompt_get_task_info_object
477cc577a4SJonathan Peyton // traverse the hierarchy similarly and need to be
487cc577a4SJonathan Peyton // kept consistent
497cc577a4SJonathan Peyton //----------------------------------------------------------
507cc577a4SJonathan Peyton
__ompt_get_teaminfo(int depth,int * size)513041982dSJonathan Peyton ompt_team_info_t *__ompt_get_teaminfo(int depth, int *size) {
527cc577a4SJonathan Peyton kmp_info_t *thr = ompt_get_thread();
537cc577a4SJonathan Peyton
547cc577a4SJonathan Peyton if (thr) {
557cc577a4SJonathan Peyton kmp_team *team = thr->th.th_team;
563041982dSJonathan Peyton if (team == NULL)
573041982dSJonathan Peyton return NULL;
587cc577a4SJonathan Peyton
5982e94a59SJoachim Protze ompt_lw_taskteam_t *next_lwt = LWT_FROM_TEAM(team), *lwt = NULL;
607cc577a4SJonathan Peyton
617cc577a4SJonathan Peyton while (depth > 0) {
627cc577a4SJonathan Peyton // next lightweight team (if any)
633041982dSJonathan Peyton if (lwt)
643041982dSJonathan Peyton lwt = lwt->parent;
657cc577a4SJonathan Peyton
667cc577a4SJonathan Peyton // next heavyweight team (if any) after
677cc577a4SJonathan Peyton // lightweight teams are exhausted
687cc577a4SJonathan Peyton if (!lwt && team) {
6982e94a59SJoachim Protze if (next_lwt) {
7082e94a59SJoachim Protze lwt = next_lwt;
7182e94a59SJoachim Protze next_lwt = NULL;
7282e94a59SJoachim Protze } else {
737cc577a4SJonathan Peyton team = team->t.t_parent;
747cc577a4SJonathan Peyton if (team) {
7582e94a59SJoachim Protze next_lwt = LWT_FROM_TEAM(team);
7682e94a59SJoachim Protze }
777cc577a4SJonathan Peyton }
787cc577a4SJonathan Peyton }
797cc577a4SJonathan Peyton
807cc577a4SJonathan Peyton depth--;
817cc577a4SJonathan Peyton }
827cc577a4SJonathan Peyton
837cc577a4SJonathan Peyton if (lwt) {
847cc577a4SJonathan Peyton // lightweight teams have one task
853041982dSJonathan Peyton if (size)
863041982dSJonathan Peyton *size = 1;
877cc577a4SJonathan Peyton
887cc577a4SJonathan Peyton // return team info for lightweight team
897cc577a4SJonathan Peyton return &lwt->ompt_team_info;
907cc577a4SJonathan Peyton } else if (team) {
917cc577a4SJonathan Peyton // extract size from heavyweight team
923041982dSJonathan Peyton if (size)
933041982dSJonathan Peyton *size = team->t.t_nproc;
947cc577a4SJonathan Peyton
957cc577a4SJonathan Peyton // return team info for heavyweight team
967cc577a4SJonathan Peyton return &team->t.ompt_team_info;
977cc577a4SJonathan Peyton }
987cc577a4SJonathan Peyton }
997cc577a4SJonathan Peyton
1007cc577a4SJonathan Peyton return NULL;
1017cc577a4SJonathan Peyton }
1027cc577a4SJonathan Peyton
__ompt_get_task_info_object(int depth)10382e94a59SJoachim Protze ompt_task_info_t *__ompt_get_task_info_object(int depth) {
1047cc577a4SJonathan Peyton ompt_task_info_t *info = NULL;
1057cc577a4SJonathan Peyton kmp_info_t *thr = ompt_get_thread();
1067cc577a4SJonathan Peyton
1077cc577a4SJonathan Peyton if (thr) {
1087cc577a4SJonathan Peyton kmp_taskdata_t *taskdata = thr->th.th_current_task;
10982e94a59SJoachim Protze ompt_lw_taskteam_t *lwt = NULL,
11082e94a59SJoachim Protze *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
1117cc577a4SJonathan Peyton
1127cc577a4SJonathan Peyton while (depth > 0) {
1137cc577a4SJonathan Peyton // next lightweight team (if any)
1143041982dSJonathan Peyton if (lwt)
1153041982dSJonathan Peyton lwt = lwt->parent;
1167cc577a4SJonathan Peyton
1177cc577a4SJonathan Peyton // next heavyweight team (if any) after
1187cc577a4SJonathan Peyton // lightweight teams are exhausted
1197cc577a4SJonathan Peyton if (!lwt && taskdata) {
12082e94a59SJoachim Protze if (next_lwt) {
12182e94a59SJoachim Protze lwt = next_lwt;
12282e94a59SJoachim Protze next_lwt = NULL;
12382e94a59SJoachim Protze } else {
1247cc577a4SJonathan Peyton taskdata = taskdata->td_parent;
1257cc577a4SJonathan Peyton if (taskdata) {
12682e94a59SJoachim Protze next_lwt = LWT_FROM_TEAM(taskdata->td_team);
12782e94a59SJoachim Protze }
12882e94a59SJoachim Protze }
12982e94a59SJoachim Protze }
13082e94a59SJoachim Protze depth--;
13182e94a59SJoachim Protze }
13282e94a59SJoachim Protze
13382e94a59SJoachim Protze if (lwt) {
13482e94a59SJoachim Protze info = &lwt->ompt_task_info;
13582e94a59SJoachim Protze } else if (taskdata) {
13682e94a59SJoachim Protze info = &taskdata->ompt_task_info;
13782e94a59SJoachim Protze }
13882e94a59SJoachim Protze }
13982e94a59SJoachim Protze
14082e94a59SJoachim Protze return info;
14182e94a59SJoachim Protze }
14282e94a59SJoachim Protze
__ompt_get_scheduling_taskinfo(int depth)14382e94a59SJoachim Protze ompt_task_info_t *__ompt_get_scheduling_taskinfo(int depth) {
14482e94a59SJoachim Protze ompt_task_info_t *info = NULL;
14582e94a59SJoachim Protze kmp_info_t *thr = ompt_get_thread();
14682e94a59SJoachim Protze
14782e94a59SJoachim Protze if (thr) {
14882e94a59SJoachim Protze kmp_taskdata_t *taskdata = thr->th.th_current_task;
14982e94a59SJoachim Protze
15082e94a59SJoachim Protze ompt_lw_taskteam_t *lwt = NULL,
15182e94a59SJoachim Protze *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
15282e94a59SJoachim Protze
15382e94a59SJoachim Protze while (depth > 0) {
15482e94a59SJoachim Protze // next lightweight team (if any)
15582e94a59SJoachim Protze if (lwt)
15682e94a59SJoachim Protze lwt = lwt->parent;
15782e94a59SJoachim Protze
15882e94a59SJoachim Protze // next heavyweight team (if any) after
15982e94a59SJoachim Protze // lightweight teams are exhausted
16082e94a59SJoachim Protze if (!lwt && taskdata) {
16182e94a59SJoachim Protze // first try scheduling parent (for explicit task scheduling)
16282e94a59SJoachim Protze if (taskdata->ompt_task_info.scheduling_parent) {
16382e94a59SJoachim Protze taskdata = taskdata->ompt_task_info.scheduling_parent;
16482e94a59SJoachim Protze } else if (next_lwt) {
16582e94a59SJoachim Protze lwt = next_lwt;
16682e94a59SJoachim Protze next_lwt = NULL;
16782e94a59SJoachim Protze } else {
16882e94a59SJoachim Protze // then go for implicit tasks
16982e94a59SJoachim Protze taskdata = taskdata->td_parent;
17082e94a59SJoachim Protze if (taskdata) {
17182e94a59SJoachim Protze next_lwt = LWT_FROM_TEAM(taskdata->td_team);
17282e94a59SJoachim Protze }
1737cc577a4SJonathan Peyton }
1747cc577a4SJonathan Peyton }
1757cc577a4SJonathan Peyton depth--;
1767cc577a4SJonathan Peyton }
1777cc577a4SJonathan Peyton
1787cc577a4SJonathan Peyton if (lwt) {
1797cc577a4SJonathan Peyton info = &lwt->ompt_task_info;
1807cc577a4SJonathan Peyton } else if (taskdata) {
1817cc577a4SJonathan Peyton info = &taskdata->ompt_task_info;
1827cc577a4SJonathan Peyton }
1837cc577a4SJonathan Peyton }
1847cc577a4SJonathan Peyton
1857cc577a4SJonathan Peyton return info;
1867cc577a4SJonathan Peyton }
1877cc577a4SJonathan Peyton
1887cc577a4SJonathan Peyton //******************************************************************************
1897cc577a4SJonathan Peyton // interface operations
1907cc577a4SJonathan Peyton //******************************************************************************
1917cc577a4SJonathan Peyton
1927cc577a4SJonathan Peyton //----------------------------------------------------------
1937cc577a4SJonathan Peyton // thread support
1947cc577a4SJonathan Peyton //----------------------------------------------------------
1957cc577a4SJonathan Peyton
__ompt_get_thread_data_internal()19682e94a59SJoachim Protze ompt_data_t *__ompt_get_thread_data_internal() {
19782e94a59SJoachim Protze if (__kmp_get_gtid() >= 0) {
19882e94a59SJoachim Protze kmp_info_t *thread = ompt_get_thread();
19982e94a59SJoachim Protze if (thread == NULL)
20082e94a59SJoachim Protze return NULL;
20182e94a59SJoachim Protze return &(thread->th.ompt_thread_info.thread_data);
2027cc577a4SJonathan Peyton }
20382e94a59SJoachim Protze return NULL;
2047cc577a4SJonathan Peyton }
2057cc577a4SJonathan Peyton
2067cc577a4SJonathan Peyton //----------------------------------------------------------
2077cc577a4SJonathan Peyton // state support
2087cc577a4SJonathan Peyton //----------------------------------------------------------
2097cc577a4SJonathan Peyton
__ompt_thread_assign_wait_id(void * variable)2103041982dSJonathan Peyton void __ompt_thread_assign_wait_id(void *variable) {
21182e94a59SJoachim Protze kmp_info_t *ti = ompt_get_thread();
2127cc577a4SJonathan Peyton
2137c75ac0cSHansang Bae if (ti)
2144109d560SJoachim Protze ti->th.ompt_thread_info.wait_id = (ompt_wait_id_t)(uintptr_t)variable;
2157cc577a4SJonathan Peyton }
2167cc577a4SJonathan Peyton
__ompt_get_state_internal(ompt_wait_id_t * omp_wait_id)2172b46d30fSJoachim Protze int __ompt_get_state_internal(ompt_wait_id_t *omp_wait_id) {
2187cc577a4SJonathan Peyton kmp_info_t *ti = ompt_get_thread();
2197cc577a4SJonathan Peyton
2207cc577a4SJonathan Peyton if (ti) {
22140636133SJoachim Protze if (omp_wait_id)
22240636133SJoachim Protze *omp_wait_id = ti->th.ompt_thread_info.wait_id;
2237cc577a4SJonathan Peyton return ti->th.ompt_thread_info.state;
2247cc577a4SJonathan Peyton }
2250e0d6cddSJoachim Protze return ompt_state_undefined;
2267cc577a4SJonathan Peyton }
2277cc577a4SJonathan Peyton
2287cc577a4SJonathan Peyton //----------------------------------------------------------
2297cc577a4SJonathan Peyton // parallel region support
2307cc577a4SJonathan Peyton //----------------------------------------------------------
2317cc577a4SJonathan Peyton
__ompt_get_parallel_info_internal(int ancestor_level,ompt_data_t ** parallel_data,int * team_size)23282e94a59SJoachim Protze int __ompt_get_parallel_info_internal(int ancestor_level,
23382e94a59SJoachim Protze ompt_data_t **parallel_data,
23482e94a59SJoachim Protze int *team_size) {
2351dc2afdcSJoachim Protze if (__kmp_get_gtid() >= 0) {
23682e94a59SJoachim Protze ompt_team_info_t *info;
23782e94a59SJoachim Protze if (team_size) {
23882e94a59SJoachim Protze info = __ompt_get_teaminfo(ancestor_level, team_size);
23982e94a59SJoachim Protze } else {
24082e94a59SJoachim Protze info = __ompt_get_teaminfo(ancestor_level, NULL);
2417cc577a4SJonathan Peyton }
24282e94a59SJoachim Protze if (parallel_data) {
24382e94a59SJoachim Protze *parallel_data = info ? &(info->parallel_data) : NULL;
2447cc577a4SJonathan Peyton }
24582e94a59SJoachim Protze return info ? 2 : 0;
2461dc2afdcSJoachim Protze } else {
2471dc2afdcSJoachim Protze return 0;
2481dc2afdcSJoachim Protze }
2497cc577a4SJonathan Peyton }
2507cc577a4SJonathan Peyton
2517cc577a4SJonathan Peyton //----------------------------------------------------------
2527cc577a4SJonathan Peyton // lightweight task team support
2537cc577a4SJonathan Peyton //----------------------------------------------------------
2547cc577a4SJonathan Peyton
__ompt_lw_taskteam_init(ompt_lw_taskteam_t * lwt,kmp_info_t * thr,int gtid,ompt_data_t * ompt_pid,void * codeptr)2553041982dSJonathan Peyton void __ompt_lw_taskteam_init(ompt_lw_taskteam_t *lwt, kmp_info_t *thr, int gtid,
25682e94a59SJoachim Protze ompt_data_t *ompt_pid, void *codeptr) {
25782e94a59SJoachim Protze // initialize parallel_data with input, return address to parallel_data on
25882e94a59SJoachim Protze // exit
25982e94a59SJoachim Protze lwt->ompt_team_info.parallel_data = *ompt_pid;
26082e94a59SJoachim Protze lwt->ompt_team_info.master_return_address = codeptr;
26182e94a59SJoachim Protze lwt->ompt_task_info.task_data.value = 0;
2620e0d6cddSJoachim Protze lwt->ompt_task_info.frame.enter_frame = ompt_data_none;
2630e0d6cddSJoachim Protze lwt->ompt_task_info.frame.exit_frame = ompt_data_none;
26482e94a59SJoachim Protze lwt->ompt_task_info.scheduling_parent = NULL;
26582e94a59SJoachim Protze lwt->heap = 0;
2667cc577a4SJonathan Peyton lwt->parent = 0;
2677cc577a4SJonathan Peyton }
2687cc577a4SJonathan Peyton
__ompt_lw_taskteam_link(ompt_lw_taskteam_t * lwt,kmp_info_t * thr,int on_heap,bool always)26982e94a59SJoachim Protze void __ompt_lw_taskteam_link(ompt_lw_taskteam_t *lwt, kmp_info_t *thr,
27067e93a1aSHansang Bae int on_heap, bool always) {
27182e94a59SJoachim Protze ompt_lw_taskteam_t *link_lwt = lwt;
27267e93a1aSHansang Bae if (always ||
27367e93a1aSHansang Bae thr->th.th_team->t.t_serialized >
27482e94a59SJoachim Protze 1) { // we already have a team, so link the new team and swap values
27582e94a59SJoachim Protze if (on_heap) { // the lw_taskteam cannot stay on stack, allocate it on heap
27682e94a59SJoachim Protze link_lwt =
27782e94a59SJoachim Protze (ompt_lw_taskteam_t *)__kmp_allocate(sizeof(ompt_lw_taskteam_t));
27882e94a59SJoachim Protze }
27982e94a59SJoachim Protze link_lwt->heap = on_heap;
28082e94a59SJoachim Protze
28182e94a59SJoachim Protze // would be swap in the (on_stack) case.
28282e94a59SJoachim Protze ompt_team_info_t tmp_team = lwt->ompt_team_info;
28382e94a59SJoachim Protze link_lwt->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr);
28482e94a59SJoachim Protze *OMPT_CUR_TEAM_INFO(thr) = tmp_team;
28582e94a59SJoachim Protze
28682e94a59SJoachim Protze // link the taskteam into the list of taskteams:
28782e94a59SJoachim Protze ompt_lw_taskteam_t *my_parent =
28882e94a59SJoachim Protze thr->th.th_team->t.ompt_serialized_team_info;
28982e94a59SJoachim Protze link_lwt->parent = my_parent;
29082e94a59SJoachim Protze thr->th.th_team->t.ompt_serialized_team_info = link_lwt;
291f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
292f61602b0SVignesh Balasubramanian if (ompd_state & OMPD_ENABLE_BP) {
293f61602b0SVignesh Balasubramanian ompd_bp_parallel_begin();
294f61602b0SVignesh Balasubramanian }
295f61602b0SVignesh Balasubramanian #endif
296589519b9SVignesh Balasubramanian
297589519b9SVignesh Balasubramanian ompt_task_info_t tmp_task = lwt->ompt_task_info;
298589519b9SVignesh Balasubramanian link_lwt->ompt_task_info = *OMPT_CUR_TASK_INFO(thr);
299589519b9SVignesh Balasubramanian *OMPT_CUR_TASK_INFO(thr) = tmp_task;
30082e94a59SJoachim Protze } else {
30182e94a59SJoachim Protze // this is the first serialized team, so we just store the values in the
30282e94a59SJoachim Protze // team and drop the taskteam-object
30382e94a59SJoachim Protze *OMPT_CUR_TEAM_INFO(thr) = lwt->ompt_team_info;
304f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
305f61602b0SVignesh Balasubramanian if (ompd_state & OMPD_ENABLE_BP) {
306f61602b0SVignesh Balasubramanian ompd_bp_parallel_begin();
307f61602b0SVignesh Balasubramanian }
308f61602b0SVignesh Balasubramanian #endif
30982e94a59SJoachim Protze *OMPT_CUR_TASK_INFO(thr) = lwt->ompt_task_info;
31082e94a59SJoachim Protze }
3117cc577a4SJonathan Peyton }
3127cc577a4SJonathan Peyton
__ompt_lw_taskteam_unlink(kmp_info_t * thr)31382e94a59SJoachim Protze void __ompt_lw_taskteam_unlink(kmp_info_t *thr) {
3147cc577a4SJonathan Peyton ompt_lw_taskteam_t *lwtask = thr->th.th_team->t.ompt_serialized_team_info;
31582e94a59SJoachim Protze if (lwtask) {
316589519b9SVignesh Balasubramanian ompt_task_info_t tmp_task = lwtask->ompt_task_info;
317589519b9SVignesh Balasubramanian lwtask->ompt_task_info = *OMPT_CUR_TASK_INFO(thr);
318589519b9SVignesh Balasubramanian *OMPT_CUR_TASK_INFO(thr) = tmp_task;
319f61602b0SVignesh Balasubramanian #if OMPD_SUPPORT
320f61602b0SVignesh Balasubramanian if (ompd_state & OMPD_ENABLE_BP) {
321f61602b0SVignesh Balasubramanian ompd_bp_parallel_end();
322f61602b0SVignesh Balasubramanian }
323f61602b0SVignesh Balasubramanian #endif
3243041982dSJonathan Peyton thr->th.th_team->t.ompt_serialized_team_info = lwtask->parent;
32582e94a59SJoachim Protze
32682e94a59SJoachim Protze ompt_team_info_t tmp_team = lwtask->ompt_team_info;
32782e94a59SJoachim Protze lwtask->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr);
32882e94a59SJoachim Protze *OMPT_CUR_TEAM_INFO(thr) = tmp_team;
32982e94a59SJoachim Protze
33082e94a59SJoachim Protze if (lwtask->heap) {
33182e94a59SJoachim Protze __kmp_free(lwtask);
33282e94a59SJoachim Protze lwtask = NULL;
33382e94a59SJoachim Protze }
33482e94a59SJoachim Protze }
33582e94a59SJoachim Protze // return lwtask;
3367cc577a4SJonathan Peyton }
3377cc577a4SJonathan Peyton
3387cc577a4SJonathan Peyton //----------------------------------------------------------
3397cc577a4SJonathan Peyton // task support
3407cc577a4SJonathan Peyton //----------------------------------------------------------
3417cc577a4SJonathan Peyton
__ompt_get_task_info_internal(int ancestor_level,int * type,ompt_data_t ** task_data,ompt_frame_t ** task_frame,ompt_data_t ** parallel_data,int * thread_num)34282e94a59SJoachim Protze int __ompt_get_task_info_internal(int ancestor_level, int *type,
34382e94a59SJoachim Protze ompt_data_t **task_data,
3440e0d6cddSJoachim Protze ompt_frame_t **task_frame,
34582e94a59SJoachim Protze ompt_data_t **parallel_data,
34682e94a59SJoachim Protze int *thread_num) {
3471dc2afdcSJoachim Protze if (__kmp_get_gtid() < 0)
3481dc2afdcSJoachim Protze return 0;
3491dc2afdcSJoachim Protze
35082e94a59SJoachim Protze if (ancestor_level < 0)
35182e94a59SJoachim Protze return 0;
35282e94a59SJoachim Protze
35382e94a59SJoachim Protze // copied from __ompt_get_scheduling_taskinfo
35482e94a59SJoachim Protze ompt_task_info_t *info = NULL;
35582e94a59SJoachim Protze ompt_team_info_t *team_info = NULL;
35682e94a59SJoachim Protze kmp_info_t *thr = ompt_get_thread();
3574a73ae16SJoachim Protze int level = ancestor_level;
35882e94a59SJoachim Protze
35982e94a59SJoachim Protze if (thr) {
36082e94a59SJoachim Protze kmp_taskdata_t *taskdata = thr->th.th_current_task;
36182e94a59SJoachim Protze if (taskdata == NULL)
36282e94a59SJoachim Protze return 0;
3634a73ae16SJoachim Protze kmp_team *team = thr->th.th_team, *prev_team = NULL;
36482e94a59SJoachim Protze if (team == NULL)
36582e94a59SJoachim Protze return 0;
36682e94a59SJoachim Protze ompt_lw_taskteam_t *lwt = NULL,
367*f41d0854SVladimir Inđić *next_lwt = LWT_FROM_TEAM(taskdata->td_team);
36882e94a59SJoachim Protze
36982e94a59SJoachim Protze while (ancestor_level > 0) {
37082e94a59SJoachim Protze // next lightweight team (if any)
37182e94a59SJoachim Protze if (lwt)
37282e94a59SJoachim Protze lwt = lwt->parent;
37382e94a59SJoachim Protze
37482e94a59SJoachim Protze // next heavyweight team (if any) after
37582e94a59SJoachim Protze // lightweight teams are exhausted
37682e94a59SJoachim Protze if (!lwt && taskdata) {
37782e94a59SJoachim Protze // first try scheduling parent (for explicit task scheduling)
37882e94a59SJoachim Protze if (taskdata->ompt_task_info.scheduling_parent) {
37982e94a59SJoachim Protze taskdata = taskdata->ompt_task_info.scheduling_parent;
38082e94a59SJoachim Protze } else if (next_lwt) {
38182e94a59SJoachim Protze lwt = next_lwt;
38282e94a59SJoachim Protze next_lwt = NULL;
38382e94a59SJoachim Protze } else {
38482e94a59SJoachim Protze // then go for implicit tasks
38582e94a59SJoachim Protze taskdata = taskdata->td_parent;
38682e94a59SJoachim Protze if (team == NULL)
38782e94a59SJoachim Protze return 0;
38859a994e8S@vladaindjic prev_team = team;
38982e94a59SJoachim Protze team = team->t.t_parent;
39082e94a59SJoachim Protze if (taskdata) {
39182e94a59SJoachim Protze next_lwt = LWT_FROM_TEAM(taskdata->td_team);
39282e94a59SJoachim Protze }
39382e94a59SJoachim Protze }
39482e94a59SJoachim Protze }
39582e94a59SJoachim Protze ancestor_level--;
3967cc577a4SJonathan Peyton }
3977cc577a4SJonathan Peyton
39882e94a59SJoachim Protze if (lwt) {
39982e94a59SJoachim Protze info = &lwt->ompt_task_info;
40082e94a59SJoachim Protze team_info = &lwt->ompt_team_info;
40182e94a59SJoachim Protze if (type) {
40282e94a59SJoachim Protze *type = ompt_task_implicit;
4037cc577a4SJonathan Peyton }
40482e94a59SJoachim Protze } else if (taskdata) {
40582e94a59SJoachim Protze info = &taskdata->ompt_task_info;
40682e94a59SJoachim Protze team_info = &team->t.ompt_team_info;
40782e94a59SJoachim Protze if (type) {
40882e94a59SJoachim Protze if (taskdata->td_parent) {
40982e94a59SJoachim Protze *type = (taskdata->td_flags.tasktype ? ompt_task_explicit
41082e94a59SJoachim Protze : ompt_task_implicit) |
41182e94a59SJoachim Protze TASK_TYPE_DETAILS_FORMAT(taskdata);
41282e94a59SJoachim Protze } else {
41382e94a59SJoachim Protze *type = ompt_task_initial;
4147cc577a4SJonathan Peyton }
41582e94a59SJoachim Protze }
41682e94a59SJoachim Protze }
41782e94a59SJoachim Protze if (task_data) {
41882e94a59SJoachim Protze *task_data = info ? &info->task_data : NULL;
41982e94a59SJoachim Protze }
42082e94a59SJoachim Protze if (task_frame) {
42182e94a59SJoachim Protze // OpenMP spec asks for the scheduling task to be returned.
42282e94a59SJoachim Protze *task_frame = info ? &info->frame : NULL;
42382e94a59SJoachim Protze }
42482e94a59SJoachim Protze if (parallel_data) {
42582e94a59SJoachim Protze *parallel_data = team_info ? &(team_info->parallel_data) : NULL;
42682e94a59SJoachim Protze }
427aa2022e7SJoachim Protze if (thread_num) {
4284a73ae16SJoachim Protze if (level == 0)
4294a73ae16SJoachim Protze *thread_num = __kmp_get_tid();
430*f41d0854SVladimir Inđić else if (lwt)
4314a73ae16SJoachim Protze *thread_num = 0;
43259a994e8S@vladaindjic else if (!prev_team) {
43359a994e8S@vladaindjic // The innermost parallel region contains at least one explicit task.
43459a994e8S@vladaindjic // The task at level > 0 is either an implicit task that
43559a994e8S@vladaindjic // corresponds to the mentioned region or one of the explicit tasks
43659a994e8S@vladaindjic // nested inside the same region. Note that the task isn't the
43759a994e8S@vladaindjic // innermost explicit tasks (because of condition level > 0).
43859a994e8S@vladaindjic // Since the task at this level still belongs to the innermost parallel
43959a994e8S@vladaindjic // region, thread_num is determined the same way as for level==0.
44059a994e8S@vladaindjic *thread_num = __kmp_get_tid();
44159a994e8S@vladaindjic } else
4424a73ae16SJoachim Protze *thread_num = prev_team->t.t_master_tid;
4434a73ae16SJoachim Protze // *thread_num = team->t.t_master_tid;
444aa2022e7SJoachim Protze }
44582e94a59SJoachim Protze return info ? 2 : 0;
44682e94a59SJoachim Protze }
44782e94a59SJoachim Protze return 0;
4487cc577a4SJonathan Peyton }
4497cc577a4SJonathan Peyton
__ompt_get_task_memory_internal(void ** addr,size_t * size,int blocknum)4503057c3a0SJonathan Peyton int __ompt_get_task_memory_internal(void **addr, size_t *size, int blocknum) {
4513057c3a0SJonathan Peyton if (blocknum != 0)
4523057c3a0SJonathan Peyton return 0; // support only a single block
4533057c3a0SJonathan Peyton
4543057c3a0SJonathan Peyton kmp_info_t *thr = ompt_get_thread();
4557c75ac0cSHansang Bae if (!thr)
4567c75ac0cSHansang Bae return 0;
4577c75ac0cSHansang Bae
4583057c3a0SJonathan Peyton kmp_taskdata_t *taskdata = thr->th.th_current_task;
4593057c3a0SJonathan Peyton kmp_task_t *task = KMP_TASKDATA_TO_TASK(taskdata);
4603057c3a0SJonathan Peyton
4613057c3a0SJonathan Peyton if (taskdata->td_flags.tasktype != TASK_EXPLICIT)
4623057c3a0SJonathan Peyton return 0; // support only explicit task
4633057c3a0SJonathan Peyton
4643057c3a0SJonathan Peyton void *ret_addr;
4653057c3a0SJonathan Peyton int64_t ret_size = taskdata->td_size_alloc - sizeof(kmp_taskdata_t);
4663057c3a0SJonathan Peyton
4673057c3a0SJonathan Peyton // kmp_task_t->data1 is an optional member
4683057c3a0SJonathan Peyton if (taskdata->td_flags.destructors_thunk)
4693057c3a0SJonathan Peyton ret_addr = &task->data1 + 1;
4703057c3a0SJonathan Peyton else
4713057c3a0SJonathan Peyton ret_addr = &task->part_id + 1;
4723057c3a0SJonathan Peyton
4733057c3a0SJonathan Peyton ret_size -= (char *)(ret_addr) - (char *)(task);
4743057c3a0SJonathan Peyton if (ret_size < 0)
4753057c3a0SJonathan Peyton return 0;
4763057c3a0SJonathan Peyton
4773057c3a0SJonathan Peyton *addr = ret_addr;
4786b316febSTerry Wilmarth *size = (size_t)ret_size;
4793057c3a0SJonathan Peyton return 1;
4803057c3a0SJonathan Peyton }
4813057c3a0SJonathan Peyton
4827cc577a4SJonathan Peyton //----------------------------------------------------------
4837cc577a4SJonathan Peyton // team support
4847cc577a4SJonathan Peyton //----------------------------------------------------------
4857cc577a4SJonathan Peyton
__ompt_team_assign_id(kmp_team_t * team,ompt_data_t ompt_pid)48682e94a59SJoachim Protze void __ompt_team_assign_id(kmp_team_t *team, ompt_data_t ompt_pid) {
48782e94a59SJoachim Protze team->t.ompt_team_info.parallel_data = ompt_pid;
48882e94a59SJoachim Protze }
48982e94a59SJoachim Protze
49082e94a59SJoachim Protze //----------------------------------------------------------
49182e94a59SJoachim Protze // misc
49282e94a59SJoachim Protze //----------------------------------------------------------
49382e94a59SJoachim Protze
__ompt_get_unique_id_internal()49482e94a59SJoachim Protze static uint64_t __ompt_get_unique_id_internal() {
49582e94a59SJoachim Protze static uint64_t thread = 1;
49682e94a59SJoachim Protze static THREAD_LOCAL uint64_t ID = 0;
49782e94a59SJoachim Protze if (ID == 0) {
49882e94a59SJoachim Protze uint64_t new_thread = KMP_TEST_THEN_INC64((kmp_int64 *)&thread);
49982e94a59SJoachim Protze ID = new_thread << (sizeof(uint64_t) * 8 - OMPT_THREAD_ID_BITS);
50082e94a59SJoachim Protze }
50182e94a59SJoachim Protze return ++ID;
5027cc577a4SJonathan Peyton }
503ad1ad7aeSJonathan Peyton
__ompt_get_barrier_kind(enum barrier_type bt,kmp_info_t * thr)504ad1ad7aeSJonathan Peyton ompt_sync_region_t __ompt_get_barrier_kind(enum barrier_type bt,
505ad1ad7aeSJonathan Peyton kmp_info_t *thr) {
506ad1ad7aeSJonathan Peyton if (bt == bs_forkjoin_barrier)
507ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier_implicit;
508ad1ad7aeSJonathan Peyton
509ad1ad7aeSJonathan Peyton if (bt != bs_plain_barrier)
510ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier_implementation;
511ad1ad7aeSJonathan Peyton
512ad1ad7aeSJonathan Peyton if (!thr->th.th_ident)
513ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier;
514ad1ad7aeSJonathan Peyton
515ad1ad7aeSJonathan Peyton kmp_int32 flags = thr->th.th_ident->flags;
516ad1ad7aeSJonathan Peyton
517ad1ad7aeSJonathan Peyton if ((flags & KMP_IDENT_BARRIER_EXPL) != 0)
518ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier_explicit;
519ad1ad7aeSJonathan Peyton
520ad1ad7aeSJonathan Peyton if ((flags & KMP_IDENT_BARRIER_IMPL) != 0)
521ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier_implicit;
522ad1ad7aeSJonathan Peyton
523ad1ad7aeSJonathan Peyton return ompt_sync_region_barrier_implementation;
524ad1ad7aeSJonathan Peyton }
525