Skip to content

Commit b47af04

Browse files
jplehryuxuanchen1997
authored andcommitted
[Offload][OMPT] Add callbacks for (dis)associate_ptr (#99046)
Summary: This adds the OMPT callbacks for the API functions disassociate_ptr and associate_ptr. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60250852
1 parent 88e33c0 commit b47af04

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed

offload/include/OpenMP/OMPT/Interface.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,25 @@ class Interface {
109109
/// Top-level function for invoking callback after target update construct
110110
void endTargetUpdate(int64_t DeviceId, void *Code);
111111

112+
/// Top-level function for invoking callback before target associate API
113+
void beginTargetAssociatePointer(int64_t DeviceId, void *HstPtrBegin,
114+
void *TgtPtrBegin, size_t Size, void *Code);
115+
116+
/// Top-level function for invoking callback after target associate API
117+
void endTargetAssociatePointer(int64_t DeviceId, void *HstPtrBegin,
118+
void *TgtPtrBegin, size_t Size, void *Code);
119+
120+
/// Top-level function for invoking callback before target disassociate API
121+
void beginTargetDisassociatePointer(int64_t DeviceId, void *HstPtrBegin,
122+
void *TgtPtrBegin, size_t Size,
123+
void *Code);
124+
125+
/// Top-level function for invoking callback after target disassociate API
126+
void endTargetDisassociatePointer(int64_t DeviceId, void *HstPtrBegin,
127+
void *TgtPtrBegin, size_t Size, void *Code);
128+
129+
// Target kernel callbacks
130+
112131
/// Top-level function for invoking callback before target construct
113132
void beginTarget(int64_t DeviceId, void *Code);
114133

@@ -137,6 +156,16 @@ class Interface {
137156
return std::make_pair(std::mem_fn(&Interface::beginTargetDataRetrieve),
138157
std::mem_fn(&Interface::endTargetDataRetrieve));
139158

159+
if constexpr (OpType == ompt_target_data_associate)
160+
return std::make_pair(
161+
std::mem_fn(&Interface::beginTargetAssociatePointer),
162+
std::mem_fn(&Interface::endTargetAssociatePointer));
163+
164+
if constexpr (OpType == ompt_target_data_disassociate)
165+
return std::make_pair(
166+
std::mem_fn(&Interface::beginTargetDisassociatePointer),
167+
std::mem_fn(&Interface::endTargetDisassociatePointer));
168+
140169
llvm_unreachable("Unhandled target data operation type!");
141170
}
142171

offload/src/OpenMP/API.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,12 @@ EXTERN int omp_target_associate_ptr(const void *HostPtr, const void *DevicePtr,
597597
FATAL_MESSAGE(DeviceNum, "%s", toString(DeviceOrErr.takeError()).c_str());
598598

599599
void *DeviceAddr = (void *)((uint64_t)DevicePtr + (uint64_t)DeviceOffset);
600+
601+
OMPT_IF_BUILT(InterfaceRAII(
602+
RegionInterface.getCallbacks<ompt_target_data_associate>(), DeviceNum,
603+
const_cast<void *>(HostPtr), const_cast<void *>(DevicePtr), Size,
604+
__builtin_return_address(0)));
605+
600606
int Rc = DeviceOrErr->getMappingInfo().associatePtr(
601607
const_cast<void *>(HostPtr), const_cast<void *>(DeviceAddr), Size);
602608
DP("omp_target_associate_ptr returns %d\n", Rc);
@@ -625,6 +631,11 @@ EXTERN int omp_target_disassociate_ptr(const void *HostPtr, int DeviceNum) {
625631
if (!DeviceOrErr)
626632
FATAL_MESSAGE(DeviceNum, "%s", toString(DeviceOrErr.takeError()).c_str());
627633

634+
OMPT_IF_BUILT(InterfaceRAII(
635+
RegionInterface.getCallbacks<ompt_target_data_disassociate>(), DeviceNum,
636+
const_cast<void *>(HostPtr),
637+
/*DevicePtr=*/nullptr, /*Size=*/0, __builtin_return_address(0)));
638+
628639
int Rc = DeviceOrErr->getMappingInfo().disassociatePtr(
629640
const_cast<void *>(HostPtr));
630641
DP("omp_target_disassociate_ptr returns %d\n", Rc);

offload/src/OpenMP/OMPT/Callback.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,63 @@ void Interface::endTargetUpdate(int64_t DeviceId, void *Code) {
332332
endTargetRegion();
333333
}
334334

335+
void Interface::beginTargetAssociatePointer(int64_t DeviceId, void *HstPtrBegin,
336+
void *TgtPtrBegin, size_t Size,
337+
void *Code) {
338+
beginTargetDataOperation();
339+
if (ompt_callback_target_data_op_emi_fn) {
340+
ompt_callback_target_data_op_emi_fn(
341+
ompt_scope_begin, TargetTaskData, &TargetData, &HostOpId,
342+
ompt_target_data_associate, HstPtrBegin, omp_get_initial_device(),
343+
TgtPtrBegin, DeviceId, Size, Code);
344+
} else if (ompt_callback_target_data_op_fn) {
345+
HostOpId = createOpId();
346+
ompt_callback_target_data_op_fn(
347+
TargetData.value, HostOpId, ompt_target_data_associate, HstPtrBegin,
348+
omp_get_initial_device(), TgtPtrBegin, DeviceId, Size, Code);
349+
}
350+
}
351+
352+
void Interface::endTargetAssociatePointer(int64_t DeviceId, void *HstPtrBegin,
353+
void *TgtPtrBegin, size_t Size,
354+
void *Code) {
355+
if (ompt_callback_target_data_op_emi_fn) {
356+
ompt_callback_target_data_op_emi_fn(
357+
ompt_scope_end, TargetTaskData, &TargetData, &HostOpId,
358+
ompt_target_data_associate, HstPtrBegin, omp_get_initial_device(),
359+
TgtPtrBegin, DeviceId, Size, Code);
360+
}
361+
}
362+
363+
void Interface::beginTargetDisassociatePointer(int64_t DeviceId,
364+
void *HstPtrBegin,
365+
void *TgtPtrBegin, size_t Size,
366+
void *Code) {
367+
beginTargetDataOperation();
368+
if (ompt_callback_target_data_op_emi_fn) {
369+
ompt_callback_target_data_op_emi_fn(
370+
ompt_scope_begin, TargetTaskData, &TargetData, &HostOpId,
371+
ompt_target_data_disassociate, HstPtrBegin, omp_get_initial_device(),
372+
TgtPtrBegin, DeviceId, Size, Code);
373+
} else if (ompt_callback_target_data_op_fn) {
374+
HostOpId = createOpId();
375+
ompt_callback_target_data_op_fn(
376+
TargetData.value, HostOpId, ompt_target_data_disassociate, HstPtrBegin,
377+
omp_get_initial_device(), TgtPtrBegin, DeviceId, Size, Code);
378+
}
379+
}
380+
void Interface::endTargetDisassociatePointer(int64_t DeviceId,
381+
void *HstPtrBegin,
382+
void *TgtPtrBegin, size_t Size,
383+
void *Code) {
384+
if (ompt_callback_target_data_op_emi_fn) {
385+
ompt_callback_target_data_op_emi_fn(
386+
ompt_scope_end, TargetTaskData, &TargetData, &HostOpId,
387+
ompt_target_data_disassociate, HstPtrBegin, omp_get_initial_device(),
388+
TgtPtrBegin, DeviceId, Size, Code);
389+
}
390+
}
391+
335392
void Interface::beginTarget(int64_t DeviceId, void *Code) {
336393
beginTargetRegion();
337394
if (ompt_callback_target_emi_fn) {

offload/test/ompt/omp_api.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %libomptarget-compile-run-and-check-generic
2+
// REQUIRES: ompt
3+
// REQUIRES: gpu
4+
5+
#include "omp.h"
6+
#include <stdlib.h>
7+
#include <string.h>
8+
9+
#include "callbacks.h"
10+
#include "register_non_emi.h"
11+
12+
#define N 1024
13+
14+
int main(int argc, char **argv) {
15+
int *h_a;
16+
int *d_a;
17+
18+
h_a = (int *)malloc(N * sizeof(int));
19+
memset(h_a, 0, N);
20+
21+
d_a = (int *)omp_target_alloc(N * sizeof(int), omp_get_default_device());
22+
23+
omp_target_associate_ptr(h_a, d_a, N * sizeof(int), 0,
24+
omp_get_default_device());
25+
omp_target_disassociate_ptr(h_a, omp_get_default_device());
26+
27+
omp_target_free(d_a, omp_get_default_device());
28+
free(h_a);
29+
30+
return 0;
31+
}
32+
33+
// clang-format off
34+
/// 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
39+
/// CHECK: Callback Fini:

0 commit comments

Comments
 (0)