Skip to content

[offload][ompt] Added lookup function for device callbacks #110007

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions offload/include/OpenMP/OMPT/Callback.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ namespace omp {
namespace target {
namespace ompt {

extern ompt_interface_fn_t ompt_device_fn_lookup(const char *s);

#define declareOmptCallback(Name, Type, Code) extern Name##_t Name##_fn;
FOREACH_OMPT_NOEMI_EVENT(declareOmptCallback)
FOREACH_OMPT_EMI_EVENT(declareOmptCallback)
Expand Down
2 changes: 1 addition & 1 deletion offload/plugins-nextgen/common/src/PluginInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ Error GenericDeviceTy::init(GenericPluginTy &Plugin) {
performOmptCallback(device_initialize, Plugin.getUserId(DeviceId),
/*type=*/getComputeUnitKind().c_str(),
/*device=*/reinterpret_cast<ompt_device_t *>(this),
/*lookup=*/ompt::lookupCallbackByName,
/*lookup=*/ompt::ompt_device_fn_lookup,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/*documentation=*/nullptr);
}
#endif
Expand Down
65 changes: 64 additions & 1 deletion offload/src/OpenMP/OMPT/Callback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,77 @@
#undef DEBUG_PREFIX
#define DEBUG_PREFIX "OMPT"

using namespace llvm::omp::target::ompt;

// Define OMPT callback functions (bound to actual callbacks later on)
#define defineOmptCallback(Name, Type, Code) \
Name##_t llvm::omp::target::ompt::Name##_fn = nullptr;
FOREACH_OMPT_NOEMI_EVENT(defineOmptCallback)
FOREACH_OMPT_EMI_EVENT(defineOmptCallback)
#undef defineOmptCallback

using namespace llvm::omp::target::ompt;
int ompt_get_device_num_procs(ompt_device_t *device) { return 0; }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

format

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to clang-format this seems to be fine


ompt_device_time_t ompt_get_device_time(ompt_device_t *device) { return 0; }
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe use ompt_time_none instead? See 19.4.4.6 in the OpenMP 5.2 spec.


double ompt_translate_time(ompt_device_t *device, ompt_device_time_t time) {
return 0;
}

ompt_set_result_t ompt_set_trace_ompt(ompt_device_t *device,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unsigned int enable, unsigned int etype) {
return ompt_set_error;
Copy link

@Thyre Thyre Sep 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would not choose ompt_set_error, as tools could think they did something wrong (e.g. tried to use target_emi and target at the same time, which is not allowed).
We should return ompt_set_never instead.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ompt_set_error could still be used when trying to call this function outside of the ompt_callback_device_initialize callback, see the OpenMP 5.2 spec.

If the ompt_set_trace_native or the ompt_set_trace_ompt runtime entry point is called outside a device initializer, registration of supported callbacks may fail with a return code of ompt_set_error.

}

ompt_set_result_t ompt_set_trace_native(ompt_device_t *device, int enable,
int flags) {
return ompt_set_error;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as ompt_set_trace_ompt

}

int ompt_start_trace(ompt_device_t *device,
ompt_callback_buffer_request_t request,
ompt_callback_buffer_complete_t complete) {
return 0;
}

int ompt_pause_trace(ompt_device_t *device, int begin_pause) { return 0; }

int ompt_flush_trace(ompt_device_t *device) { return 0; }

int ompt_stop_trace(ompt_device_t *device) { return 0; }

int ompt_advance_buffer_cursor(ompt_device_t *device, ompt_buffer_t *buffer,
size_t size, ompt_buffer_cursor_t current,
ompt_buffer_cursor_t *next) {
return 0;
}

ompt_record_t ompt_get_record_type(ompt_buffer_t *buffer,
ompt_buffer_cursor_t current) {
return ompt_record_ompt;
}

void *ompt_get_record_native(ompt_buffer_t *buffer,
ompt_buffer_cursor_t current,
ompt_id_t *host_op_id) {
return NULL;
}

ompt_record_abstract_t *ompt_get_record_abstract(void *native_record) {
return NULL;
}

ompt_interface_fn_t
llvm::omp::target::ompt::ompt_device_fn_lookup(const char *s) {
#define ompt_interface_fn(fn) \
if (strcmp(s, #fn) == 0) { \
fn##_t fn##_f = fn; \
return (ompt_interface_fn_t)fn##_f; \
}
FOREACH_OMPT_DEVICE_INQUIRY_FN(ompt_interface_fn)
#undef ompt_interface_fn
return NULL;
}

/// Forward declaration
class LibomptargetRtlFinalizer;
Expand Down
17 changes: 17 additions & 0 deletions openmp/runtime/src/include/omp-tools.h.var
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,23 @@
macro(ompt_get_target_info) \
macro(ompt_get_num_devices)

#define FOREACH_OMPT_DEVICE_INQUIRY_FN(macro) \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

format

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately, clang-format does not format this file

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can call it manually, but it might change a lot of unrelated stuff.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can push a NFC first

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Downstream examples (e.g. here I like this location way better):
https://github.com/ROCm/llvm-project/blob/amd-staging/offload/include/OmptCommonDefs.h#L26-L46

macro (ompt_get_device_num_procs) \
macro (ompt_get_device_time) \
macro (ompt_translate_time) \
macro (ompt_set_trace_ompt) \
macro (ompt_set_trace_native) \
/* macro (ompt_get_buffer_limits) */ \
macro (ompt_start_trace) \
macro (ompt_pause_trace) \
macro (ompt_flush_trace) \
macro (ompt_stop_trace) \
macro (ompt_advance_buffer_cursor) \
macro (ompt_get_record_type) \
/* macro (ompt_get_record_ompt) */ \
macro (ompt_get_record_native) \
macro (ompt_get_record_abstract)

#define FOREACH_OMPT_STATE(macro) \
\
/* first available state */ \
Expand Down
2 changes: 2 additions & 0 deletions openmp/runtime/src/ompt-general.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ static ompt_start_tool_result_t *libomptarget_ompt_result = NULL;

static ompt_interface_fn_t ompt_fn_lookup(const char *s);

static ompt_interface_fn_t ompt_device_fn_lookup(const char *s);

OMPT_API_ROUTINE ompt_data_t *ompt_get_thread_data(void);

/*****************************************************************************
Expand Down
Loading