Skip to content

Commit 2b58c60

Browse files
[Offload][OMPT] Change handling of target_data and target_task_data
- store target_data and target_task_data in OMP runtime - redefine ompt_task_info_t from libomp with only first two fields - target_task_data and target_data - replace get_target_task_data with ompt_get_task_info_target - define macro for transparent handling of task_data and target_task_data - provide a local ompt_task_info_t struct for merged target regions - provide tests to ensure correct values of target_data and target_task_data
1 parent 8bcdbcf commit 2b58c60

18 files changed

+805
-287
lines changed

offload/include/OpenMP/OMPT/Interface.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,22 @@
2525

2626
#define OMPT_IF_BUILT(stmt) stmt
2727

28+
#define TargetTaskData \
29+
((OmptTaskInfoPtr == &OmptTaskInfo) ? nullptr \
30+
: (&(OmptTaskInfoPtr->task_data)))
31+
#define TargetData (OmptTaskInfoPtr->target_data)
32+
33+
typedef struct ompt_task_info_t {
34+
ompt_data_t task_data;
35+
ompt_data_t target_data;
36+
} ompt_task_info_t;
37+
2838
/// Callbacks for target regions require task_data representing the
2939
/// encountering task.
3040
/// Callbacks for target regions and target data ops require
3141
/// target_task_data representing the target task region.
3242
typedef ompt_data_t *(*ompt_get_task_data_t)();
33-
typedef ompt_data_t *(*ompt_get_target_task_data_t)();
43+
typedef ompt_task_info_t *(*ompt_get_task_info_target_t)();
3444

3545
namespace llvm {
3646
namespace omp {
@@ -40,7 +50,7 @@ namespace ompt {
4050
/// Function pointers that will be used to track task_data and
4151
/// target_task_data.
4252
static ompt_get_task_data_t ompt_get_task_data_fn;
43-
static ompt_get_target_task_data_t ompt_get_target_task_data_fn;
53+
static ompt_get_task_info_target_t ompt_get_task_info_target_fn;
4454

4555
/// Used to maintain execution state for this thread
4656
class Interface {
@@ -216,16 +226,16 @@ class Interface {
216226

217227
private:
218228
/// Target operations id
219-
ompt_id_t HostOpId = 0;
220-
221-
/// Target region data
222-
ompt_data_t TargetData = ompt_data_none;
229+
ompt_id_t HostOpId{0};
223230

224231
/// Task data representing the encountering task
225-
ompt_data_t *TaskData = nullptr;
232+
ompt_data_t *TaskData{nullptr};
233+
234+
/// TaskInfo contains target_data and task_data
235+
ompt_task_info_t OmptTaskInfo{ompt_data_none, ompt_data_none};
226236

227-
/// Target task data representing the target task region
228-
ompt_data_t *TargetTaskData = nullptr;
237+
/// Ptr to TaskInfo in OpenMP runtime in case of deferred target tasks
238+
ompt_task_info_t *OmptTaskInfoPtr{&OmptTaskInfo};
229239

230240
/// Used for marking begin of a data operation
231241
void beginTargetDataOperation();

offload/libomptarget/OpenMP/OMPT/Callback.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ bool llvm::omp::target::ompt::Initialized = false;
5050

5151
ompt_get_callback_t llvm::omp::target::ompt::lookupCallbackByCode = nullptr;
5252
ompt_function_lookup_t llvm::omp::target::ompt::lookupCallbackByName = nullptr;
53-
ompt_get_target_task_data_t ompt_get_target_task_data_fn = nullptr;
5453
ompt_get_task_data_t ompt_get_task_data_fn = nullptr;
54+
ompt_get_task_info_target_t ompt_get_task_info_target_fn = nullptr;
5555

5656
/// Unique correlation id
5757
static std::atomic<uint64_t> IdCounter(1);
@@ -421,18 +421,17 @@ void Interface::beginTargetRegion() {
421421
// Set up task state
422422
assert(ompt_get_task_data_fn && "Calling a null task data function");
423423
TaskData = ompt_get_task_data_fn();
424-
// Set up target task state
425-
assert(ompt_get_target_task_data_fn &&
426-
"Calling a null target task data function");
427-
TargetTaskData = ompt_get_target_task_data_fn();
428-
// Target state will be set later
429-
TargetData = ompt_data_none;
424+
// Set up target task and target state
425+
assert(ompt_get_task_info_target_fn &&
426+
"Calling a null target task info function");
427+
if (ompt_task_info_t *TempTaskInfo = ompt_get_task_info_target_fn())
428+
OmptTaskInfoPtr = TempTaskInfo;
430429
}
431430

432431
void Interface::endTargetRegion() {
433432
TaskData = 0;
434-
TargetTaskData = 0;
435-
TargetData = ompt_data_none;
433+
OmptTaskInfo = {ompt_data_none, ompt_data_none};
434+
OmptTaskInfoPtr = &OmptTaskInfo;
436435
}
437436

438437
/// Used to maintain the finalization functions that are received
@@ -471,7 +470,7 @@ int llvm::omp::target::ompt::initializeLibrary(ompt_function_lookup_t lookup,
471470

472471
bindOmptFunctionName(ompt_get_callback, lookupCallbackByCode);
473472
bindOmptFunctionName(ompt_get_task_data, ompt_get_task_data_fn);
474-
bindOmptFunctionName(ompt_get_target_task_data, ompt_get_target_task_data_fn);
473+
bindOmptFunctionName(ompt_get_task_info_target, ompt_get_task_info_target_fn);
475474
#undef bindOmptFunctionName
476475

477476
// Store pointer of 'ompt_libomp_target_fn_lookup' for use by libomptarget
@@ -480,8 +479,6 @@ int llvm::omp::target::ompt::initializeLibrary(ompt_function_lookup_t lookup,
480479
assert(lookupCallbackByCode && "lookupCallbackByCode should be non-null");
481480
assert(lookupCallbackByName && "lookupCallbackByName should be non-null");
482481
assert(ompt_get_task_data_fn && "ompt_get_task_data_fn should be non-null");
483-
assert(ompt_get_target_task_data_fn &&
484-
"ompt_get_target_task_data_fn should be non-null");
485482
assert(LibraryFinalizer == nullptr &&
486483
"LibraryFinalizer should not be initialized yet");
487484

offload/test/ompt/callbacks.h

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,37 @@
55
// Tool related code below
66
#include <omp-tools.h>
77

8+
static const char *ompt_target_data_op_t_values[] = {
9+
"",
10+
"ompt_target_data_alloc",
11+
"ompt_target_data_transfer_to_device",
12+
"ompt_target_data_transfer_from_device",
13+
"ompt_target_data_delete",
14+
"ompt_target_data_associate",
15+
"ompt_target_data_disassociate",
16+
"ompt_target_data_alloc_async",
17+
"ompt_target_data_transfer_to_device_async",
18+
"ompt_target_data_transfer_from_device_async",
19+
"ompt_target_data_delete_async"};
20+
21+
static const char *ompt_scope_endpoint_t_values[] = {
22+
"", "ompt_scope_begin", "ompt_scope_end", "ompt_scope_beginend"};
23+
24+
static const char *ompt_target_t_values[] = {"",
25+
"ompt_target",
26+
"ompt_target_enter_data",
27+
"ompt_target_exit_data",
28+
"ompt_target_update",
29+
"",
30+
"",
31+
"",
32+
"",
33+
"",
34+
"ompt_target_nowait",
35+
"ompt_target_enter_data_nowait",
36+
"ompt_target_exit_data_nowait",
37+
"ompt_target_update_nowait"};
38+
839
// For EMI callbacks
940
ompt_id_t next_op_id = 0x8000000000000001;
1041

@@ -38,11 +69,11 @@ static void on_ompt_callback_target_data_op(
3869
void *src_addr, int src_device_num, void *dest_addr, int dest_device_num,
3970
size_t bytes, const void *codeptr_ra) {
4071
assert(codeptr_ra != 0 && "Unexpected null codeptr");
41-
printf(" Callback DataOp: target_id=%lu host_op_id=%lu optype=%d src=%p "
72+
printf(" Callback DataOp: target_id=%lu host_op_id=%lu optype=%s src=%p "
4273
"src_device_num=%d "
4374
"dest=%p dest_device_num=%d bytes=%lu code=%p\n",
44-
target_id, host_op_id, optype, src_addr, src_device_num, dest_addr,
45-
dest_device_num, bytes, codeptr_ra);
75+
target_id, host_op_id, ompt_target_data_op_t_values[optype], src_addr,
76+
src_device_num, dest_addr, dest_device_num, bytes, codeptr_ra);
4677
}
4778

4879
static void on_ompt_callback_target(ompt_target_t kind,
@@ -51,9 +82,10 @@ static void on_ompt_callback_target(ompt_target_t kind,
5182
ompt_id_t target_id,
5283
const void *codeptr_ra) {
5384
assert(codeptr_ra != 0 && "Unexpected null codeptr");
54-
printf("Callback Target: target_id=%lu kind=%d endpoint=%d device_num=%d "
85+
printf("Callback Target: target_id=%lu kind=%s endpoint=%s device_num=%d "
5586
"code=%p\n",
56-
target_id, kind, endpoint, device_num, codeptr_ra);
87+
target_id, ompt_target_t_values[kind],
88+
ompt_scope_endpoint_t_values[endpoint], device_num, codeptr_ra);
5789
}
5890

5991
static void on_ompt_callback_target_submit(ompt_id_t target_id,
@@ -84,13 +116,15 @@ static void on_ompt_callback_target_data_op_emi(
84116
// target_task_data may be null, avoid dereferencing it
85117
uint64_t target_task_data_value =
86118
(target_task_data) ? target_task_data->value : 0;
87-
printf(" Callback DataOp EMI: endpoint=%d optype=%d target_task_data=%p "
119+
printf(" Callback DataOp EMI: endpoint=%s optype=%s target_task_data=%p "
88120
"(0x%lx) target_data=%p (0x%lx) host_op_id=%p (0x%lx) src=%p "
89121
"src_device_num=%d "
90122
"dest=%p dest_device_num=%d bytes=%lu code=%p\n",
91-
endpoint, optype, target_task_data, target_task_data_value,
92-
target_data, target_data->value, host_op_id, *host_op_id, src_addr,
93-
src_device_num, dest_addr, dest_device_num, bytes, codeptr_ra);
123+
ompt_scope_endpoint_t_values[endpoint],
124+
ompt_target_data_op_t_values[optype], target_task_data,
125+
target_task_data_value, target_data, target_data->value, host_op_id,
126+
*host_op_id, src_addr, src_device_num, dest_addr, dest_device_num,
127+
bytes, codeptr_ra);
94128
}
95129

96130
static void on_ompt_callback_target_emi(ompt_target_t kind,
@@ -102,20 +136,21 @@ static void on_ompt_callback_target_emi(ompt_target_t kind,
102136
assert(codeptr_ra != 0 && "Unexpected null codeptr");
103137
if (endpoint == ompt_scope_begin)
104138
target_data->value = next_op_id++;
105-
printf("Callback Target EMI: kind=%d endpoint=%d device_num=%d task_data=%p "
139+
printf("Callback Target EMI: kind=%s endpoint=%s device_num=%d task_data=%p "
106140
"(0x%lx) target_task_data=%p (0x%lx) target_data=%p (0x%lx) code=%p\n",
107-
kind, endpoint, device_num, task_data, task_data->value,
108-
target_task_data, target_task_data->value, target_data,
109-
target_data->value, codeptr_ra);
141+
ompt_target_t_values[kind], ompt_scope_endpoint_t_values[endpoint],
142+
device_num, task_data, task_data ? task_data->value : 0,
143+
target_task_data, target_task_data ? target_task_data->value : 0,
144+
target_data, target_data->value, codeptr_ra);
110145
}
111146

112147
static void on_ompt_callback_target_submit_emi(
113148
ompt_scope_endpoint_t endpoint, ompt_data_t *target_data,
114149
ompt_id_t *host_op_id, unsigned int requested_num_teams) {
115-
printf(" Callback Submit EMI: endpoint=%d req_num_teams=%d target_data=%p "
150+
printf(" Callback Submit EMI: endpoint=%s req_num_teams=%d target_data=%p "
116151
"(0x%lx) host_op_id=%p (0x%lx)\n",
117-
endpoint, requested_num_teams, target_data, target_data->value,
118-
host_op_id, *host_op_id);
152+
ompt_scope_endpoint_t_values[endpoint], requested_num_teams,
153+
target_data, target_data->value, host_op_id, *host_op_id);
119154
}
120155

121156
static void on_ompt_callback_target_map_emi(ompt_data_t *target_data,

offload/test/ompt/omp_api.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
// clang-format off
12
// RUN: %libomptarget-compile-run-and-check-generic
23
// REQUIRES: ompt
34
// REQUIRES: gpu
5+
// clang-format on
46

57
#include "omp.h"
68
#include <stdlib.h>
@@ -32,8 +34,8 @@ int main(int argc, char **argv) {
3234

3335
// clang-format off
3436
/// CHECK: Callback Init:
35-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=1
36-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=5
37-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=6
38-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=4
37+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_alloc
38+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_associate
39+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_disassociate
40+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_delete
3941
/// CHECK: Callback Fini:
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#define SKIP_CALLBACK_REGISTRATION 1
2+
3+
#include "../../../openmp/runtime/test/ompt/callback.h"
4+
#include "callbacks.h"
5+
#include <omp-tools.h>
6+
7+
// From openmp/runtime/test/ompt/callback.h
8+
#define register_ompt_callback_t(name, type) \
9+
do { \
10+
type f_##name = &on_##name; \
11+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
12+
printf("0: Could not register callback '" #name "'\n"); \
13+
} while (0)
14+
15+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
16+
17+
// Init functions
18+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
19+
ompt_data_t *tool_data) {
20+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
21+
22+
if (!ompt_set_callback)
23+
return 0; // failed
24+
25+
// host runtime functions
26+
ompt_get_unique_id = (ompt_get_unique_id_t)lookup("ompt_get_unique_id");
27+
ompt_get_thread_data = (ompt_get_thread_data_t)lookup("ompt_get_thread_data");
28+
ompt_get_task_info = (ompt_get_task_info_t)lookup("ompt_get_task_info");
29+
30+
ompt_get_unique_id();
31+
32+
// host callbacks
33+
register_ompt_callback(ompt_callback_sync_region);
34+
register_ompt_callback_t(ompt_callback_sync_region_wait,
35+
ompt_callback_sync_region_t);
36+
register_ompt_callback_t(ompt_callback_reduction,
37+
ompt_callback_sync_region_t);
38+
register_ompt_callback(ompt_callback_implicit_task);
39+
register_ompt_callback(ompt_callback_parallel_begin);
40+
register_ompt_callback(ompt_callback_parallel_end);
41+
register_ompt_callback(ompt_callback_task_create);
42+
register_ompt_callback(ompt_callback_task_schedule);
43+
44+
// device callbacks
45+
register_ompt_callback(ompt_callback_device_initialize);
46+
register_ompt_callback(ompt_callback_device_finalize);
47+
register_ompt_callback(ompt_callback_device_load);
48+
register_ompt_callback(ompt_callback_target_data_op_emi);
49+
register_ompt_callback(ompt_callback_target_emi);
50+
register_ompt_callback(ompt_callback_target_submit_emi);
51+
52+
return 1; // success
53+
}
54+
55+
void ompt_finalize(ompt_data_t *tool_data) {}
56+
57+
#ifdef __cplusplus
58+
extern "C" {
59+
#endif
60+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
61+
const char *runtime_version) {
62+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
63+
&ompt_finalize, 0};
64+
return &ompt_start_tool_result;
65+
}
66+
#ifdef __cplusplus
67+
}
68+
#endif

offload/test/ompt/target_memcpy.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
// clang-format off
12
// RUN: %libomptarget-compile-run-and-check-generic
23
// REQUIRES: ompt
34
// REQUIRES: gpu
5+
// clang-format on
46

57
/*
68
* Verify that for the target OpenMP APIs, the return address is non-null and
@@ -46,26 +48,26 @@ int main() {
4648
}
4749

4850
// clang-format off
49-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=1
51+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_alloc
5052
/// CHECK-SAME: src_device_num=[[HOST:[0-9]+]]
5153
/// CHECK-SAME: dest_device_num=[[DEVICE:[0-9]+]]
5254
/// CHECK-NOT: code=(nil)
5355
/// CHECK: code=[[CODE1:0x[0-f]+]]
54-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=2
56+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_transfer_to_device
5557
/// CHECK-SAME: src_device_num=[[HOST]] {{.+}} dest_device_num=[[DEVICE]]
5658
/// CHECK-NOT: code=(nil)
5759
/// CHECK-NOT: code=[[CODE1]]
5860
/// CHECK: code=[[CODE2:0x[0-f]+]]
59-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=3
61+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_transfer_from_device
6062
/// CHECK-SAME: src_device_num=[[DEVICE]] {{.+}} dest_device_num=[[DEVICE]]
6163
/// CHECK-NOT: code=(nil)
6264
/// CHECK-NOT: code=[[CODE2]]
6365
/// CHECK: code=[[CODE3:0x[0-f]+]]
64-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=3
66+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_transfer_from_device
6567
/// CHECK-SAME: src_device_num=[[DEVICE]] {{.+}} dest_device_num=[[HOST]]
6668
/// CHECK-NOT: code=(nil)
6769
/// CHECK-NOT: code=[[CODE3]]
6870
/// CHECK: code=[[CODE4:0x[0-f]+]]
69-
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=4
71+
/// CHECK: Callback DataOp: target_id=[[TARGET_ID:[0-9]+]] host_op_id=[[HOST_OP_ID:[0-9]+]] optype=ompt_target_data_delete
7072
/// CHECK-NOT: code=(nil)
7173
/// CHECK-NOT: code=[[CODE4]]

0 commit comments

Comments
 (0)