Skip to content

Commit acdb199

Browse files
dhruvachakmhalk
authored andcommitted
[OpenMP] [OMPT] [8/8] Added lit tests for OMPT target callbacks
Added a new target ompt mode that depends on libomptarget OMPT support. Added tests that verify callbacks for target regions, kernel launch, and data transfer operations. All of them should pass on amdgpu using make check-libomptarget. Reviewed By: jplehr Differential Revision: https://reviews.llvm.org/D127372
1 parent a524248 commit acdb199

17 files changed

+934
-0
lines changed

openmp/libomptarget/test/lit.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ for feature in config.test_compiler_features:
8080
if config.libomptarget_debug:
8181
config.available_features.add('libomptarget-debug')
8282

83+
if config.has_libomptarget_ompt:
84+
config.available_features.add('ompt')
85+
8386
config.available_features.add(config.libomptarget_current_target)
8487

8588
# Determine whether the test system supports unified memory.

openmp/libomptarget/test/lit.site.cfg.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ config.libomptarget_current_target = "@CURRENT_TARGET@"
1919
config.libomptarget_filecheck = "@OPENMP_FILECHECK_EXECUTABLE@"
2020
config.libomptarget_not = "@OPENMP_NOT_EXECUTABLE@"
2121
config.libomptarget_debug = @LIBOMPTARGET_DEBUG@
22+
config.has_libomptarget_ompt = @LIBOMPTARGET_OMPT_SUPPORT@
2223

2324
# Let the main config do the real work.
2425
lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/lit.cfg")
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#include <assert.h>
2+
#include <stdlib.h>
3+
4+
// Tool related code below
5+
#include <omp-tools.h>
6+
7+
// For EMI callbacks
8+
ompt_id_t next_op_id = 0x8000000000000001;
9+
10+
// OMPT callbacks
11+
12+
// Synchronous callbacks
13+
static void on_ompt_callback_device_initialize(int device_num, const char *type,
14+
ompt_device_t *device,
15+
ompt_function_lookup_t lookup,
16+
const char *documentation) {
17+
printf("Callback Init: device_num=%d type=%s device=%p lookup=%p doc=%p\n",
18+
device_num, type, device, lookup, documentation);
19+
}
20+
21+
static void on_ompt_callback_device_finalize(int device_num) {
22+
printf("Callback Fini: device_num=%d\n", device_num);
23+
}
24+
25+
static void on_ompt_callback_device_load(int device_num, const char *filename,
26+
int64_t offset_in_file,
27+
void *vma_in_file, size_t bytes,
28+
void *host_addr, void *device_addr,
29+
uint64_t module_id) {
30+
printf("Callback Load: device_num:%d module_id:%lu filename:%s host_adddr:%p "
31+
"device_addr:%p bytes:%lu\n",
32+
device_num, module_id, filename, host_addr, device_addr, bytes);
33+
}
34+
35+
static void on_ompt_callback_target_data_op(
36+
ompt_id_t target_id, ompt_id_t host_op_id, ompt_target_data_op_t optype,
37+
void *src_addr, int src_device_num, void *dest_addr, int dest_device_num,
38+
size_t bytes, const void *codeptr_ra) {
39+
assert(codeptr_ra != 0 && "Unexpected null codeptr");
40+
// Both src and dest must not be null
41+
assert((src_addr != 0 || dest_addr != 0) && "Both src and dest addr null");
42+
printf(" Callback DataOp: target_id=%lu host_op_id=%lu optype=%d src=%p "
43+
"src_device_num=%d "
44+
"dest=%p dest_device_num=%d bytes=%lu code=%p\n",
45+
target_id, host_op_id, optype, src_addr, src_device_num, dest_addr,
46+
dest_device_num, bytes, codeptr_ra);
47+
}
48+
49+
static void on_ompt_callback_target(ompt_target_t kind,
50+
ompt_scope_endpoint_t endpoint,
51+
int device_num, ompt_data_t *task_data,
52+
ompt_id_t target_id,
53+
const void *codeptr_ra) {
54+
assert(codeptr_ra != 0 && "Unexpected null codeptr");
55+
printf("Callback Target: target_id=%lu kind=%d endpoint=%d device_num=%d "
56+
"code=%p\n",
57+
target_id, kind, endpoint, device_num, codeptr_ra);
58+
}
59+
60+
static void on_ompt_callback_target_submit(ompt_id_t target_id,
61+
ompt_id_t host_op_id,
62+
unsigned int requested_num_teams) {
63+
printf(" Callback Submit: target_id=%lu host_op_id=%lu req_num_teams=%d\n",
64+
target_id, host_op_id, requested_num_teams);
65+
}
66+
67+
static void on_ompt_callback_target_map(ompt_id_t target_id,
68+
unsigned int nitems, void **host_addr,
69+
void **device_addr, size_t *bytes,
70+
unsigned int *mapping_flags,
71+
const void *codeptr_ra) {
72+
printf("Target map callback is unimplemented\n");
73+
abort();
74+
}
75+
76+
static void on_ompt_callback_target_data_op_emi(
77+
ompt_scope_endpoint_t endpoint, ompt_data_t *target_task_data,
78+
ompt_data_t *target_data, ompt_id_t *host_op_id,
79+
ompt_target_data_op_t optype, void *src_addr, int src_device_num,
80+
void *dest_addr, int dest_device_num, size_t bytes,
81+
const void *codeptr_ra) {
82+
assert(codeptr_ra != 0 && "Unexpected null codeptr");
83+
// Both src and dest must not be null
84+
assert((src_addr != 0 || dest_addr != 0) && "Both src and dest addr null");
85+
if (endpoint == ompt_scope_begin)
86+
*host_op_id = next_op_id++;
87+
printf(" Callback DataOp EMI: endpoint=%d optype=%d target_task_data=%p "
88+
"(0x%lx) target_data=%p (0x%lx) host_op_id=%p (0x%lx) src=%p "
89+
"src_device_num=%d "
90+
"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);
94+
}
95+
96+
static void on_ompt_callback_target_emi(ompt_target_t kind,
97+
ompt_scope_endpoint_t endpoint,
98+
int device_num, ompt_data_t *task_data,
99+
ompt_data_t *target_task_data,
100+
ompt_data_t *target_data,
101+
const void *codeptr_ra) {
102+
assert(codeptr_ra != 0 && "Unexpected null codeptr");
103+
if (endpoint == ompt_scope_begin)
104+
target_data->value = next_op_id++;
105+
printf("Callback Target EMI: kind=%d endpoint=%d device_num=%d task_data=%p "
106+
"(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);
110+
}
111+
112+
static void on_ompt_callback_target_submit_emi(
113+
ompt_scope_endpoint_t endpoint, ompt_data_t *target_data,
114+
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 "
116+
"(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);
119+
}
120+
121+
static void on_ompt_callback_target_map_emi(ompt_data_t *target_data,
122+
unsigned int nitems,
123+
void **host_addr,
124+
void **device_addr, size_t *bytes,
125+
unsigned int *mapping_flags,
126+
const void *codeptr_ra) {
127+
printf("Target map emi callback is unimplemented\n");
128+
abort();
129+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <omp-tools.h>
2+
3+
// From openmp/runtime/test/ompt/callback.h
4+
#define register_ompt_callback_t(name, type) \
5+
do { \
6+
type f_##name = &on_##name; \
7+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
8+
printf("0: Could not register callback '" #name "'\n"); \
9+
} while (0)
10+
11+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
12+
13+
// OMPT entry point handles
14+
static ompt_set_callback_t ompt_set_callback = 0;
15+
16+
// Init functions
17+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
18+
ompt_data_t *tool_data) {
19+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
20+
21+
if (!ompt_set_callback)
22+
return 0; // failed
23+
24+
register_ompt_callback(ompt_callback_device_initialize);
25+
register_ompt_callback(ompt_callback_device_finalize);
26+
register_ompt_callback(ompt_callback_device_load);
27+
register_ompt_callback(ompt_callback_target_data_op_emi);
28+
register_ompt_callback(ompt_callback_target_data_op);
29+
register_ompt_callback(ompt_callback_target);
30+
register_ompt_callback(ompt_callback_target_emi);
31+
register_ompt_callback(ompt_callback_target_submit);
32+
33+
return 1; // success
34+
}
35+
36+
void ompt_finalize(ompt_data_t *tool_data) {}
37+
38+
#ifdef __cplusplus
39+
extern "C" {
40+
#endif
41+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
42+
const char *runtime_version) {
43+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
44+
&ompt_finalize, 0};
45+
return &ompt_start_tool_result;
46+
}
47+
#ifdef __cplusplus
48+
}
49+
#endif
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <omp-tools.h>
2+
3+
// From openmp/runtime/test/ompt/callback.h
4+
#define register_ompt_callback_t(name, type) \
5+
do { \
6+
type f_##name = &on_##name; \
7+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
8+
printf("0: Could not register callback '" #name "'\n"); \
9+
} while (0)
10+
11+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
12+
13+
// OMPT entry point handles
14+
static ompt_set_callback_t ompt_set_callback = 0;
15+
16+
// Init functions
17+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
18+
ompt_data_t *tool_data) {
19+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
20+
21+
if (!ompt_set_callback)
22+
return 0; // failed
23+
24+
register_ompt_callback(ompt_callback_device_initialize);
25+
register_ompt_callback(ompt_callback_device_finalize);
26+
register_ompt_callback(ompt_callback_device_load);
27+
register_ompt_callback(ompt_callback_target_data_op_emi);
28+
register_ompt_callback(ompt_callback_target_emi);
29+
register_ompt_callback(ompt_callback_target_submit_emi);
30+
31+
return 1; // success
32+
}
33+
34+
void ompt_finalize(ompt_data_t *tool_data) {}
35+
36+
#ifdef __cplusplus
37+
extern "C" {
38+
#endif
39+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
40+
const char *runtime_version) {
41+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
42+
&ompt_finalize, 0};
43+
return &ompt_start_tool_result;
44+
}
45+
#ifdef __cplusplus
46+
}
47+
#endif
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <omp-tools.h>
2+
3+
// From openmp/runtime/test/ompt/callback.h
4+
#define register_ompt_callback_t(name, type) \
5+
do { \
6+
type f_##name = &on_##name; \
7+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
8+
printf("0: Could not register callback '" #name "'\n"); \
9+
} while (0)
10+
11+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
12+
13+
// OMPT entry point handles
14+
static ompt_set_callback_t ompt_set_callback = 0;
15+
16+
// Init functions
17+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
18+
ompt_data_t *tool_data) {
19+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
20+
21+
if (!ompt_set_callback)
22+
return 0; // failed
23+
24+
register_ompt_callback(ompt_callback_device_initialize);
25+
register_ompt_callback(ompt_callback_device_finalize);
26+
register_ompt_callback(ompt_callback_device_load);
27+
register_ompt_callback(ompt_callback_target_data_op_emi);
28+
register_ompt_callback(ompt_callback_target_emi);
29+
register_ompt_callback(ompt_callback_target_submit_emi);
30+
register_ompt_callback(ompt_callback_target_map_emi);
31+
32+
return 1; // success
33+
}
34+
35+
void ompt_finalize(ompt_data_t *tool_data) {}
36+
37+
#ifdef __cplusplus
38+
extern "C" {
39+
#endif
40+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
41+
const char *runtime_version) {
42+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
43+
&ompt_finalize, 0};
44+
return &ompt_start_tool_result;
45+
}
46+
#ifdef __cplusplus
47+
}
48+
#endif
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <omp-tools.h>
2+
3+
// From openmp/runtime/test/ompt/callback.h
4+
#define register_ompt_callback_t(name, type) \
5+
do { \
6+
type f_##name = &on_##name; \
7+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
8+
printf("0: Could not register callback '" #name "'\n"); \
9+
} while (0)
10+
11+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
12+
13+
// OMPT entry point handles
14+
static ompt_set_callback_t ompt_set_callback = 0;
15+
16+
// Init functions
17+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
18+
ompt_data_t *tool_data) {
19+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
20+
21+
if (!ompt_set_callback)
22+
return 0; // failed
23+
24+
// If no device init callback is registered, the other callbacks won't be
25+
// activated.
26+
register_ompt_callback(ompt_callback_device_load);
27+
register_ompt_callback(ompt_callback_target_data_op);
28+
register_ompt_callback(ompt_callback_target);
29+
register_ompt_callback(ompt_callback_target_submit);
30+
31+
return 1; // success
32+
}
33+
34+
void ompt_finalize(ompt_data_t *tool_data) {}
35+
36+
#ifdef __cplusplus
37+
extern "C" {
38+
#endif
39+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
40+
const char *runtime_version) {
41+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
42+
&ompt_finalize, 0};
43+
return &ompt_start_tool_result;
44+
}
45+
#ifdef __cplusplus
46+
}
47+
#endif
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <omp-tools.h>
2+
3+
// From openmp/runtime/test/ompt/callback.h
4+
#define register_ompt_callback_t(name, type) \
5+
do { \
6+
type f_##name = &on_##name; \
7+
if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
8+
printf("0: Could not register callback '" #name "'\n"); \
9+
} while (0)
10+
11+
#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
12+
13+
// OMPT entry point handles
14+
static ompt_set_callback_t ompt_set_callback = 0;
15+
16+
// Init functions
17+
int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
18+
ompt_data_t *tool_data) {
19+
ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback");
20+
21+
if (!ompt_set_callback)
22+
return 0; // failed
23+
24+
register_ompt_callback(ompt_callback_device_initialize);
25+
register_ompt_callback(ompt_callback_device_finalize);
26+
register_ompt_callback(ompt_callback_device_load);
27+
register_ompt_callback(ompt_callback_target_data_op);
28+
register_ompt_callback(ompt_callback_target);
29+
register_ompt_callback(ompt_callback_target_submit);
30+
31+
return 1; // success
32+
}
33+
34+
void ompt_finalize(ompt_data_t *tool_data) {}
35+
36+
#ifdef __cplusplus
37+
extern "C" {
38+
#endif
39+
ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version,
40+
const char *runtime_version) {
41+
static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,
42+
&ompt_finalize, 0};
43+
return &ompt_start_tool_result;
44+
}
45+
#ifdef __cplusplus
46+
}
47+
#endif

0 commit comments

Comments
 (0)