xref: /llvm-project/openmp/runtime/test/ompt/tasks/task_memory.c (revision 35ab6d6390ecd285041590c00bac71a00e86aede)
13057c3a0SJonathan Peyton // RUN: %libomp-compile-and-run | FileCheck %s
23057c3a0SJonathan Peyton // REQUIRES: ompt
33057c3a0SJonathan Peyton // UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7
43057c3a0SJonathan Peyton #define USE_PRIVATE_TOOL 1
53057c3a0SJonathan Peyton #include "callback.h"
63057c3a0SJonathan Peyton #include <omp.h>
73057c3a0SJonathan Peyton 
main()83057c3a0SJonathan Peyton int main() {
93057c3a0SJonathan Peyton   int x;
103057c3a0SJonathan Peyton #pragma omp parallel num_threads(2)
113057c3a0SJonathan Peyton   {
123057c3a0SJonathan Peyton #pragma omp master
133057c3a0SJonathan Peyton     {
143057c3a0SJonathan Peyton #pragma omp task
153057c3a0SJonathan Peyton       { x++; }
163057c3a0SJonathan Peyton #pragma omp task firstprivate(x)
173057c3a0SJonathan Peyton       { x++; }
183057c3a0SJonathan Peyton     }
193057c3a0SJonathan Peyton   }
203057c3a0SJonathan Peyton 
213057c3a0SJonathan Peyton   return 0;
223057c3a0SJonathan Peyton }
233057c3a0SJonathan Peyton 
on_ompt_callback_implicit_task(ompt_scope_endpoint_t endpoint,ompt_data_t * parallel_data,ompt_data_t * task_data,unsigned int team_size,unsigned int thread_num,int flag)243057c3a0SJonathan Peyton static void on_ompt_callback_implicit_task(ompt_scope_endpoint_t endpoint,
253057c3a0SJonathan Peyton                                            ompt_data_t *parallel_data,
263057c3a0SJonathan Peyton                                            ompt_data_t *task_data,
273057c3a0SJonathan Peyton                                            unsigned int team_size,
283057c3a0SJonathan Peyton                                            unsigned int thread_num, int flag) {
293057c3a0SJonathan Peyton   void *addr = NULL;
303057c3a0SJonathan Peyton   size_t size = 0;
313057c3a0SJonathan Peyton   int result = ompt_get_task_memory(&addr, &size, 0);
323057c3a0SJonathan Peyton   switch (endpoint) {
333057c3a0SJonathan Peyton   case ompt_scope_begin:
343057c3a0SJonathan Peyton     task_data->value = ompt_get_unique_id();
353057c3a0SJonathan Peyton     printf("ompt_event_implicit_task_begin: task_id=%" PRIu64
363057c3a0SJonathan Peyton            ", memory_addr=%p, memory_size=%lu, result=%d \n",
373057c3a0SJonathan Peyton            task_data->value, addr, size, result);
383057c3a0SJonathan Peyton     break;
393057c3a0SJonathan Peyton   case ompt_scope_end:
403057c3a0SJonathan Peyton     printf("ompt_event_implicit_task_end: task_id=%" PRIu64
413057c3a0SJonathan Peyton            ", memory_addr=%p, memory_size=%lu, result=%d \n",
423057c3a0SJonathan Peyton            task_data->value, addr, size, result);
433057c3a0SJonathan Peyton     break;
446213ed06SJoachim Protze   case ompt_scope_beginend:
456213ed06SJoachim Protze     printf("ompt_scope_beginend should never be passed to %s\n", __func__);
466213ed06SJoachim Protze     exit(-1);
473057c3a0SJonathan Peyton   }
483057c3a0SJonathan Peyton }
493057c3a0SJonathan Peyton 
503057c3a0SJonathan Peyton static void
on_ompt_callback_task_create(ompt_data_t * encountering_task_data,const ompt_frame_t * encountering_task_frame,ompt_data_t * new_task_data,int flags,int has_dependences,const void * codeptr_ra)513057c3a0SJonathan Peyton on_ompt_callback_task_create(ompt_data_t *encountering_task_data,
523057c3a0SJonathan Peyton                              const ompt_frame_t *encountering_task_frame,
533057c3a0SJonathan Peyton                              ompt_data_t *new_task_data, int flags,
543057c3a0SJonathan Peyton                              int has_dependences, const void *codeptr_ra) {
553057c3a0SJonathan Peyton   if (flags & ompt_task_initial)
563057c3a0SJonathan Peyton     return; // not interested in the initial task
573057c3a0SJonathan Peyton   new_task_data->value = ompt_get_unique_id();
583057c3a0SJonathan Peyton   void *addr = NULL;
593057c3a0SJonathan Peyton   size_t size = 0;
603057c3a0SJonathan Peyton   printf("ompt_event_task_create: task_id=%" PRIu64 "\n", new_task_data->value);
613057c3a0SJonathan Peyton }
623057c3a0SJonathan Peyton 
on_ompt_callback_task_schedule(ompt_data_t * first_task_data,ompt_task_status_t prior_task_status,ompt_data_t * second_task_data)633057c3a0SJonathan Peyton static void on_ompt_callback_task_schedule(ompt_data_t *first_task_data,
643057c3a0SJonathan Peyton                                            ompt_task_status_t prior_task_status,
653057c3a0SJonathan Peyton                                            ompt_data_t *second_task_data) {
663057c3a0SJonathan Peyton   void *addr = NULL;
673057c3a0SJonathan Peyton   size_t size = 0;
683057c3a0SJonathan Peyton   int result = ompt_get_task_memory(&addr, &size, 0);
693057c3a0SJonathan Peyton   printf("ompt_event_task_schedule: task_id=%" PRIu64
703057c3a0SJonathan Peyton          ", memory_addr=%p, memory_size=%lu, result=%d\n",
713057c3a0SJonathan Peyton          first_task_data->value, addr, size, result);
723057c3a0SJonathan Peyton }
733057c3a0SJonathan Peyton 
ompt_initialize(ompt_function_lookup_t lookup,int initial_device_num,ompt_data_t * tool_data)743057c3a0SJonathan Peyton int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
753057c3a0SJonathan Peyton                     ompt_data_t *tool_data) {
763057c3a0SJonathan Peyton   ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
773057c3a0SJonathan Peyton   ompt_get_unique_id = (ompt_get_unique_id_t)lookup("ompt_get_unique_id");
783057c3a0SJonathan Peyton   ompt_get_task_memory = (ompt_get_task_memory_t)lookup("ompt_get_task_memory");
793057c3a0SJonathan Peyton 
80*35ab6d63SJoachim Protze   register_ompt_callback(ompt_callback_implicit_task);
81*35ab6d63SJoachim Protze   register_ompt_callback(ompt_callback_task_create);
82*35ab6d63SJoachim Protze   register_ompt_callback(ompt_callback_task_schedule);
833057c3a0SJonathan Peyton   printf("0: NULL_POINTER=%p\n", (void *)NULL);
843057c3a0SJonathan Peyton   return 1; // success
853057c3a0SJonathan Peyton }
863057c3a0SJonathan Peyton 
ompt_finalize(ompt_data_t * tool_data)873057c3a0SJonathan Peyton void ompt_finalize(ompt_data_t *tool_data) {}
883057c3a0SJonathan Peyton 
ompt_start_tool(unsigned int omp_version,const char * runtime_version)893057c3a0SJonathan Peyton ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
903057c3a0SJonathan Peyton                                           const char *runtime_version) {
913057c3a0SJonathan Peyton   static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
923057c3a0SJonathan Peyton                                                             &ompt_finalize, 0};
933057c3a0SJonathan Peyton   return &ompt_start_tool_result;
943057c3a0SJonathan Peyton }
953057c3a0SJonathan Peyton 
963057c3a0SJonathan Peyton // CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]
973057c3a0SJonathan Peyton 
983057c3a0SJonathan Peyton // CHECK: ompt_event_implicit_task_begin: task_id=[[TASK_ID:[0-9]+]]
993057c3a0SJonathan Peyton // CHECK-SAME: memory_addr=[[NULL]], memory_size=0, result=0
1003057c3a0SJonathan Peyton 
1013057c3a0SJonathan Peyton // CHECK: ompt_event_task_create: task_id=[[TASK_ID_0:[0-9]+]]
10234b34e90SJoachim Protze // CHECK-DAG: ompt_event_task_create: task_id=[[TASK_ID_1:[0-9]+]]
1033057c3a0SJonathan Peyton 
1043057c3a0SJonathan Peyton // Expects non-zero address, size, and result
1053057c3a0SJonathan Peyton // CHECK-DAG: ompt_event_task_schedule: task_id=[[TASK_ID_0]],
1063057c3a0SJonathan Peyton // memory_addr=0x{{[0-f]+}}, memory_size={{[1-9][0-9]*}}, result=1
1073057c3a0SJonathan Peyton // CHECK-DAG: ompt_event_task_schedule: task_id=[[TASK_ID_1]],
1083057c3a0SJonathan Peyton // memory_addr=0x{{[0-f]+}}, memory_size={{[1-9][0-9]*}}, result=1
1093057c3a0SJonathan Peyton 
1103057c3a0SJonathan Peyton // CHECK: ompt_event_implicit_task_end: task_id=[[TASK_ID]]
1113057c3a0SJonathan Peyton // CHECK-SAME: memory_addr=[[NULL]], memory_size=0, result=0
112