Issue 80982
Summary [OMPT] Ident wrong ident flags with distributed parallel for
Labels new issue
Assignees
Reporter mikaoP
    ```c
// t1.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        #pragma omp teams
        {
                #pragma omp distribute parallel for
                for (volatile int i = 0; i < 100; i++);
 }
}
```

```c
// tool.c
#include <omp-tools.h>
#include <stdio.h>
#include <stdlib.h>
static ompt_set_callback_t ompt_set_callback;

#define register_ompt_callback_t(name, type) \
  do { \
    type f_##name = &on_##name; \
    if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
      printf("0: Could not register callback '" #name "'\n"); \
  } while (0)

#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
static void
on_ompt_callback_work(
  ompt_work_t wstype,
 ompt_scope_endpoint_t endpoint,
  ompt_data_t *parallel_data,
 ompt_data_t *task_data,
  uint64_t count,
  const void *codeptr_ra)
{
  switch(endpoint)
  {
    case ompt_scope_begin:
      printf("begin ");
      switch(wstype)
 {
        case ompt_work_loop:
 printf("ompt_work_loop\n");
          break;
        case ompt_work_loop_static:
          printf("ompt_work_loop_static\n");
 break;
        case ompt_work_loop_dynamic:
 printf("ompt_work_loop_dynamic\n");
          break;
        case ompt_work_loop_guided:
          printf("ompt_work_loop_guided\n");
 break;
        case ompt_work_loop_other:
 printf("ompt_work_loop_other\n");
          break;
        case ompt_work_sections:
          printf("ompt_work_sections\n");
 break;
        case ompt_work_single_executor:
 printf("ompt_work_single_executor\n");
          break;
        case ompt_work_single_other:
 printf("ompt_work_single_other\n");
          break;
        case ompt_work_workshare:
          printf("ompt_work_workshare\n");
 break;
        case ompt_work_distribute:
 printf("ompt_work_distribute\n");
          break;
        case ompt_work_taskloop:
          printf("ompt_work_taskloop\n");
 break;
        case ompt_work_scope:
 printf("ompt_work_scope\n");
          break;
      }
 break;
    case ompt_scope_end:
      printf("end ");
 switch(wstype)
      {
        case ompt_work_loop:
 printf("ompt_work_loop\n");
          break;
        case ompt_work_loop_static:
          printf("ompt_work_loop_static\n");
 break;
        case ompt_work_loop_dynamic:
 printf("ompt_work_loop_dynamic\n");
          break;
        case ompt_work_loop_guided:
          printf("ompt_work_loop_guided\n");
 break;
        case ompt_work_loop_other:
 printf("ompt_work_loop_other\n");
          break;
        case ompt_work_sections:
          printf("ompt_work_sections\n");
 break;
        case ompt_work_single_executor:
 printf("ompt_work_single_executor\n");
          break;
        case ompt_work_single_other:
 printf("ompt_work_single_other\n");
          break;
        case ompt_work_workshare:
          printf("ompt_work_workshare\n");
 break;
        case ompt_work_distribute:
 printf("ompt_work_distribute\n");
          break;
        case ompt_work_taskloop:
          printf("ompt_work_taskloop\n");
 break;
        case ompt_work_scope:
 printf("ompt_work_scope\n");
          break;
      }
 break;
    case ompt_scope_beginend:
      printf("ompt_scope_beginend should never be passed to %s\n", __func__);
      exit(-1);
 }
}

void ompt_finalize(ompt_data_t *tool_data)
{
 printf("0: ompt_event_runtime_shutdown\n");
}

int ompt_initialize(
  ompt_function_lookup_t lookup,
  int initial_device_num,
  ompt_data_t *tool_data)
{
  ompt_set_callback = (ompt_set_callback_t) lookup("ompt_set_callback");

 register_ompt_callback(ompt_callback_work);
  printf("0: NULL_POINTER=%p\n", (void*)NULL);
  return 1; //success
}
ompt_start_tool_result_t *ompt_start_tool(
unsigned int omp_version,
const char *runtime_version
){
  static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,&ompt_finalize, 0};
  return &ompt_start_tool_result;
}
```

Compile and run: `clang -fopenmp t1.c && clang -fopenmp tool.c -shared -fPIC -o libtool.so && OMP_NUM_THREADS=2 OMP_TOOL_LIBRARIES=$PWD/libtool.so ./a.out`

Gives the following output
```
begin ompt_work_distribute
begin ompt_work_loop
end ompt_work_distribute
begin ompt_work_loop
end ompt_work_distribute
end ompt_work_distribute
```
There is a mismatch between the `work_loop` and the `work_distribute` flag. The reason is that in clang's codegen it is not possible to determine which of the to worksharings are being built in the `emitForStaticFinish` function. Since `work_distribute` has preference in a combined pragma, all events show it.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to