Index: runtime/src/ompt-general.cpp =================================================================== --- runtime/src/ompt-general.cpp +++ runtime/src/ompt-general.cpp @@ -523,8 +523,7 @@ OMPT_API_ROUTINE int ompt_get_task_memory(void **addr, size_t *size, int block) { - // stub - return 0; + return __ompt_get_task_memory_internal(addr, size, block); } /***************************************************************************** @@ -699,9 +698,7 @@ return __ompt_get_unique_id_internal(); } -OMPT_API_ROUTINE void ompt_finalize_tool(void) { - // stub -} +OMPT_API_ROUTINE void ompt_finalize_tool(void) { __kmp_internal_end_atexit(); } /***************************************************************************** * Target Index: runtime/src/ompt-specific.cpp =================================================================== --- runtime/src/ompt-specific.cpp +++ runtime/src/ompt-specific.cpp @@ -427,6 +427,35 @@ return 0; } +int __ompt_get_task_memory_internal(void **addr, size_t *size, int blocknum) { + if (blocknum != 0) + return 0; // support only a single block + + kmp_info_t *thr = ompt_get_thread(); + kmp_taskdata_t *taskdata = thr->th.th_current_task; + kmp_task_t *task = KMP_TASKDATA_TO_TASK(taskdata); + + if (taskdata->td_flags.tasktype != TASK_EXPLICIT) + return 0; // support only explicit task + + void *ret_addr; + int64_t ret_size = taskdata->td_size_alloc - sizeof(kmp_taskdata_t); + + // kmp_task_t->data1 is an optional member + if (taskdata->td_flags.destructors_thunk) + ret_addr = &task->data1 + 1; + else + ret_addr = &task->part_id + 1; + + ret_size -= (char *)(ret_addr) - (char *)(task); + if (ret_size < 0) + return 0; + + *addr = ret_addr; + *size = ret_size; + return 1; +} + //---------------------------------------------------------- // team support //----------------------------------------------------------