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