@@ -45,21 +45,60 @@ class OMPTInvokeWrapper {
45
45
public:
46
46
OMPTInvokeWrapper ()
47
47
: IsNullOpt(true ), CodePtr(nullptr ), ReturnFramePtr(nullptr ),
48
- DeviceId (-1 ), Kind(ompt_target), ScopeKind(ompt_scope_begin) {}
48
+ DeviceId (-1 ), Kind(ompt_target) {}
49
49
OMPTInvokeWrapper (void *CodePtr, void *ReturnFramePtr, int64_t DeviceId,
50
- ompt_target_t Kind, ompt_scope_endpoint_t ScopeKind )
50
+ ompt_target_t Kind)
51
51
: IsNullOpt(false ), CodePtr(CodePtr), ReturnFramePtr(ReturnFramePtr),
52
- DeviceId(DeviceId), Kind(Kind), ScopeKind(ScopeKind) {}
52
+ DeviceId(DeviceId), Kind(Kind) {}
53
53
54
54
void setDeviceId (int64_t DevId) { DeviceId = DevId; }
55
55
56
- void invoke () {
56
+ void invokeBegin () {
57
57
if (IsNullOpt)
58
58
return ;
59
59
60
60
ompt_interface.ompt_state_set (ReturnFramePtr, CodePtr);
61
- ompt_interface.target_data_enter_begin (DeviceId, CodePtr);
62
- ompt_interface.target_trace_record_gen (DeviceId, Kind, ScopeKind, CodePtr);
61
+ switch (Kind) {
62
+ case ompt_target_enter_data:
63
+ case ompt_target_enter_data_nowait:
64
+ ompt_interface.target_data_enter_begin (DeviceId, CodePtr);
65
+ break ;
66
+ case ompt_target_exit_data:
67
+ case ompt_target_exit_data_nowait:
68
+ ompt_interface.target_data_exit_begin (DeviceId, CodePtr);
69
+ break ;
70
+ case ompt_target_update:
71
+ case ompt_target_update_nowait:
72
+ ompt_interface.target_update_begin (DeviceId, CodePtr);
73
+ break ;
74
+ }
75
+ ompt_interface.target_trace_record_gen (DeviceId, Kind, ompt_scope_begin,
76
+ CodePtr);
77
+ }
78
+
79
+ void invokeEnd () {
80
+ if (IsNullOpt)
81
+ return ;
82
+
83
+ ompt_interface.ompt_state_set (ReturnFramePtr, CodePtr);
84
+ // The trace record must be written out before invoking the callback
85
+ // interface. This is because the end-callback interface resets metadata.
86
+ ompt_interface.target_trace_record_gen (DeviceId, Kind, ompt_scope_end,
87
+ CodePtr);
88
+ switch (Kind) {
89
+ case ompt_target_enter_data:
90
+ case ompt_target_enter_data_nowait:
91
+ ompt_interface.target_data_enter_end (DeviceId, CodePtr);
92
+ break ;
93
+ case ompt_target_exit_data:
94
+ case ompt_target_exit_data_nowait:
95
+ ompt_interface.target_data_exit_end (DeviceId, CodePtr);
96
+ break ;
97
+ case ompt_target_update:
98
+ case ompt_target_update_nowait:
99
+ ompt_interface.target_update_end (DeviceId, CodePtr);
100
+ break ;
101
+ }
63
102
}
64
103
65
104
private:
@@ -68,7 +107,6 @@ class OMPTInvokeWrapper {
68
107
void *ReturnFramePtr;
69
108
int64_t DeviceId;
70
109
ompt_target_t Kind;
71
- ompt_scope_endpoint_t ScopeKind;
72
110
};
73
111
74
112
// //////////////////////////////////////////////////////////////////////////////
@@ -113,21 +151,6 @@ EXTERN void __tgt_unregister_lib(__tgt_bin_desc *Desc) {
113
151
}
114
152
}
115
153
116
- template <typename TargetAsyncInfoTy>
117
- static inline void
118
- targetDataMapper (ident_t *Loc, int64_t DeviceId, int32_t ArgNum,
119
- void **ArgsBase, void **Args, int64_t *ArgSizes,
120
- int64_t *ArgTypes, map_var_info_t *ArgNames, void **ArgMappers,
121
- TargetDataFuncPtrTy TargetDataFunction,
122
- const char *RegionTypeMsg, const char *RegionName) {
123
-
124
- OMPTInvokeWrapper IWrapper;
125
-
126
- targetDataMapper<TargetAsyncInfoTy>(
127
- Loc, DeviceId, ArgNum, ArgsBase, Args, ArgSizes, ArgTypes, ArgNames,
128
- ArgMappers, TargetDataFunction, RegionTypeMsg, RegionName, &IWrapper);
129
- }
130
-
131
154
template <typename TargetAsyncInfoTy>
132
155
static inline void
133
156
targetDataMapper (ident_t *Loc, int64_t DeviceId, int32_t ArgNum,
@@ -167,13 +190,16 @@ targetDataMapper(ident_t *Loc, int64_t DeviceId, int32_t ArgNum,
167
190
168
191
// DeviceId is only valid after the call to checkDeviceAndCtors, so we update
169
192
// the DevicId in the Wrapper object before invoking OMPT
170
- OMPT_IF_ENABLED (OMPTInvoker->setDeviceId (DeviceId); OMPTInvoker->invoke (););
193
+ OMPT_IF_ENABLED (OMPTInvoker->setDeviceId (DeviceId);
194
+ OMPTInvoker->invokeBegin (););
171
195
172
196
int Rc = OFFLOAD_SUCCESS;
173
197
Rc = TargetDataFunction (Loc, Device, ArgNum, ArgsBase, Args, ArgSizes,
174
198
ArgTypes, ArgNames, ArgMappers, AsyncInfo,
175
199
false /* FromMapper */ );
176
200
201
+ OMPT_IF_ENABLED (OMPTInvoker->invokeEnd (););
202
+
177
203
if (Rc == OFFLOAD_SUCCESS)
178
204
Rc = AsyncInfo.synchronize ();
179
205
@@ -194,7 +220,7 @@ EXTERN void __tgt_target_data_begin_mapper(ident_t *Loc, int64_t DeviceId,
194
220
#ifdef OMPT_SUPPORT
195
221
OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
196
222
OMPT_GET_FRAME_ADDRESS (0 ), -1 ,
197
- ompt_target_enter_data, ompt_scope_begin );
223
+ ompt_target_enter_data);
198
224
#else
199
225
OMPTInvokeWrapper IWrapper;
200
226
#endif
@@ -211,9 +237,19 @@ EXTERN void __tgt_target_data_begin_nowait_mapper(
211
237
void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
212
238
void *NoAliasDepList) {
213
239
TIMESCOPE_WITH_IDENT (Loc);
240
+
241
+ #ifdef OMPT_SUPPORT
242
+ OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
243
+ OMPT_GET_FRAME_ADDRESS (0 ), -1 ,
244
+ ompt_target_enter_data_nowait);
245
+ #else
246
+ OMPTInvokeWrapper IWrapper;
247
+ #endif
248
+
214
249
targetDataMapper<TaskAsyncInfoWrapperTy>(
215
250
Loc, DeviceId, ArgNum, ArgsBase, Args, ArgSizes, ArgTypes, ArgNames,
216
- ArgMappers, targetDataBegin, " Entering OpenMP data region" , " begin" );
251
+ ArgMappers, targetDataBegin, " Entering OpenMP data region" , " begin" ,
252
+ &IWrapper);
217
253
}
218
254
219
255
// / passes data from the target, releases target memory and destroys
@@ -230,7 +266,7 @@ EXTERN void __tgt_target_data_end_mapper(ident_t *Loc, int64_t DeviceId,
230
266
#ifdef OMPT_SUPPORT
231
267
OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
232
268
OMPT_GET_FRAME_ADDRESS (0 ), -1 ,
233
- ompt_target_exit_data, ompt_scope_begin );
269
+ ompt_target_exit_data);
234
270
#else
235
271
OMPTInvokeWrapper IWrapper;
236
272
#endif
@@ -246,9 +282,19 @@ EXTERN void __tgt_target_data_end_nowait_mapper(
246
282
void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
247
283
void *NoAliasDepList) {
248
284
TIMESCOPE_WITH_IDENT (Loc);
285
+
286
+ #ifdef OMPT_SUPPORT
287
+ OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
288
+ OMPT_GET_FRAME_ADDRESS (0 ), -1 ,
289
+ ompt_target_exit_data_nowait);
290
+ #else
291
+ OMPTInvokeWrapper IWrapper;
292
+ #endif
293
+
249
294
targetDataMapper<TaskAsyncInfoWrapperTy>(
250
295
Loc, DeviceId, ArgNum, ArgsBase, Args, ArgSizes, ArgTypes, ArgNames,
251
- ArgMappers, targetDataEnd, " Exiting OpenMP data region" , " end" );
296
+ ArgMappers, targetDataEnd, " Exiting OpenMP data region" , " end" ,
297
+ &IWrapper);
252
298
}
253
299
254
300
EXTERN void __tgt_target_data_update_mapper (ident_t *Loc, int64_t DeviceId,
@@ -262,8 +308,7 @@ EXTERN void __tgt_target_data_update_mapper(ident_t *Loc, int64_t DeviceId,
262
308
263
309
#ifdef OMPT_SUPPORT
264
310
OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
265
- OMPT_GET_FRAME_ADDRESS (0 ), -1 , ompt_target_update,
266
- ompt_scope_begin);
311
+ OMPT_GET_FRAME_ADDRESS (0 ), -1 , ompt_target_update);
267
312
#else
268
313
OMPTInvokeWrapper IWrapper;
269
314
#endif
@@ -280,9 +325,19 @@ EXTERN void __tgt_target_data_update_nowait_mapper(
280
325
void **ArgMappers, int32_t DepNum, void *DepList, int32_t NoAliasDepNum,
281
326
void *NoAliasDepList) {
282
327
TIMESCOPE_WITH_IDENT (Loc);
328
+
329
+ #ifdef OMPT_SUPPORT
330
+ OMPTInvokeWrapper IWrapper (OMPT_GET_RETURN_ADDRESS (0 ),
331
+ OMPT_GET_FRAME_ADDRESS (0 ), -1 ,
332
+ ompt_target_update_nowait);
333
+ #else
334
+ OMPTInvokeWrapper IWrapper;
335
+ #endif
336
+
283
337
targetDataMapper<TaskAsyncInfoWrapperTy>(
284
338
Loc, DeviceId, ArgNum, ArgsBase, Args, ArgSizes, ArgTypes, ArgNames,
285
- ArgMappers, targetDataUpdate, " Updating OpenMP data" , " update" );
339
+ ArgMappers, targetDataUpdate, " Updating OpenMP data" , " update" ,
340
+ &IWrapper);
286
341
}
287
342
288
343
static KernelArgsTy *upgradeKernelArgs (KernelArgsTy *KernelArgs,
0 commit comments