@@ -49,24 +49,40 @@ handler::handler(std::shared_ptr<detail::queue_impl> Queue,
49
49
MSharedPtrStorage.push_back (std::move (ExtendedMembers));
50
50
}
51
51
52
+ static detail::ExtendedMemberT &getHandlerImplMember (
53
+ std::vector<std::shared_ptr<const void >> &SharedPtrStorage) {
54
+ assert (!SharedPtrStorage.empty ());
55
+ std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
56
+ detail::convertToExtendedMembers (SharedPtrStorage[0 ]);
57
+ assert (ExtendedMembersVec->size () > 0 );
58
+ auto &HandlerImplMember = (*ExtendedMembersVec)[0 ];
59
+ assert (detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType );
60
+ return HandlerImplMember;
61
+ }
62
+
52
63
// / Gets the handler_impl at the start of the extended members.
53
64
std::shared_ptr<detail::handler_impl> handler::getHandlerImpl () const {
54
65
std::lock_guard<std::mutex> Lock (
55
66
detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
67
+ return std::static_pointer_cast<detail::handler_impl>(
68
+ getHandlerImplMember (MSharedPtrStorage).MData );
69
+ }
56
70
57
- assert (!MSharedPtrStorage.empty ());
58
-
59
- std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
60
- detail::convertToExtendedMembers (MSharedPtrStorage[0 ]);
61
-
62
- assert (ExtendedMembersVec->size () > 0 );
63
-
64
- auto HandlerImplMember = (*ExtendedMembersVec)[0 ];
71
+ // / Gets the handler_impl at the start of the extended members and removes it.
72
+ std::shared_ptr<detail::handler_impl> handler::evictHandlerImpl () const {
73
+ std::lock_guard<std::mutex> Lock (
74
+ detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
75
+ auto &HandlerImplMember = getHandlerImplMember (MSharedPtrStorage);
76
+ auto Impl =
77
+ std::static_pointer_cast<detail::handler_impl>(HandlerImplMember.MData );
65
78
66
- assert (detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType );
79
+ // Reset the data of the member.
80
+ // NOTE: We let it stay because removing the front can be expensive. This will
81
+ // be improved when the impl is made a member of handler. In fact eviction is
82
+ // likely to not be needed when that happens.
83
+ HandlerImplMember.MData .reset ();
67
84
68
- return std::static_pointer_cast<detail::handler_impl>(
69
- HandlerImplMember.MData );
85
+ return Impl;
70
86
}
71
87
72
88
// Sets the submission state to indicate that an explicit kernel bundle has been
@@ -281,6 +297,10 @@ event handler::finalize() {
281
297
return MLastEvent;
282
298
}
283
299
300
+ // Evict handler_impl from extended members to make sure the command group
301
+ // does not keep it alive.
302
+ std::shared_ptr<detail::handler_impl> Impl = evictHandlerImpl ();
303
+
284
304
std::unique_ptr<detail::CG> CommandGroup;
285
305
switch (type) {
286
306
case detail::CG::Kernel:
@@ -293,7 +313,8 @@ event handler::finalize() {
293
313
std::move (MArgsStorage), std::move (MAccStorage),
294
314
std::move (MSharedPtrStorage), std::move (MRequirements),
295
315
std::move (MEvents), std::move (MArgs), MKernelName, MOSModuleHandle,
296
- std::move (MStreamStorage), MCGType, MCodeLoc));
316
+ std::move (MStreamStorage), std::move (Impl->MAuxiliaryResources ),
317
+ MCGType, MCodeLoc));
297
318
break ;
298
319
}
299
320
case detail::CG::CodeplayInteropTask:
@@ -382,6 +403,10 @@ event handler::finalize() {
382
403
return MLastEvent;
383
404
}
384
405
406
+ void handler::addReduction (const std::shared_ptr<const void > &ReduObj) {
407
+ getHandlerImpl ()->MAuxiliaryResources .push_back (ReduObj);
408
+ }
409
+
385
410
void handler::associateWithHandler (detail::AccessorBaseHost *AccBase,
386
411
access::target AccTarget) {
387
412
detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl (*AccBase);
0 commit comments