@@ -35,139 +35,51 @@ handler::handler(std::shared_ptr<detail::queue_impl> Queue,
3535 std::shared_ptr<detail::queue_impl> PrimaryQueue,
3636 std::shared_ptr<detail::queue_impl> SecondaryQueue,
3737 bool IsHost)
38- : MQueue (std::move (Queue)), MIsHost (IsHost) {
38+ : MImpl (std::make_shared<detail::handler_impl>(std::move (PrimaryQueue),
39+ std::move (SecondaryQueue))),
40+ MQueue (std::move (Queue)), MIsHost (IsHost) {
3941 // Create extended members and insert handler_impl
40- // TODO: When allowed to break ABI the handler_impl should be made a member
41- // of the handler class.
4242 auto ExtendedMembers =
4343 std::make_shared<std::vector<detail::ExtendedMemberT>>();
44- detail::ExtendedMemberT HandlerImplMember = {
45- detail::ExtendedMembersType::HANDLER_IMPL,
46- std::make_shared<detail::handler_impl>(std::move (PrimaryQueue),
47- std::move (SecondaryQueue))};
48- ExtendedMembers->push_back (std::move (HandlerImplMember));
4944 MSharedPtrStorage.push_back (std::move (ExtendedMembers));
5045}
5146
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-
63- // / Gets the handler_impl at the start of the extended members.
64- std::shared_ptr<detail::handler_impl> handler::getHandlerImpl () const {
65- std::lock_guard<std::mutex> Lock (
66- detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
67- return std::static_pointer_cast<detail::handler_impl>(
68- getHandlerImplMember (MSharedPtrStorage).MData );
69- }
70-
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 );
78-
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 ();
84-
85- return Impl;
86- }
87-
8847// Sets the submission state to indicate that an explicit kernel bundle has been
8948// set. Throws a sycl::exception with errc::invalid if the current state
9049// indicates that a specialization constant has been set.
9150void handler::setStateExplicitKernelBundle () {
92- getHandlerImpl () ->setStateExplicitKernelBundle ();
51+ MImpl ->setStateExplicitKernelBundle ();
9352}
9453
9554// Sets the submission state to indicate that a specialization constant has been
9655// set. Throws a sycl::exception with errc::invalid if the current state
9756// indicates that an explicit kernel bundle has been set.
98- void handler::setStateSpecConstSet () {
99- getHandlerImpl ()->setStateSpecConstSet ();
100- }
57+ void handler::setStateSpecConstSet () { MImpl->setStateSpecConstSet (); }
10158
10259// Returns true if the submission state is EXPLICIT_KERNEL_BUNDLE_STATE and
10360// false otherwise.
10461bool handler::isStateExplicitKernelBundle () const {
105- return getHandlerImpl () ->isStateExplicitKernelBundle ();
62+ return MImpl ->isStateExplicitKernelBundle ();
10663}
10764
108- // Returns a shared_ptr to kernel_bundle stored in the extended members vector .
65+ // Returns a shared_ptr to the kernel_bundle .
10966// If there is no kernel_bundle created:
11067// returns newly created kernel_bundle if Insert is true
11168// returns shared_ptr(nullptr) if Insert is false
11269std::shared_ptr<detail::kernel_bundle_impl>
11370handler::getOrInsertHandlerKernelBundle (bool Insert) const {
114-
115- std::lock_guard<std::mutex> Lock (
116- detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
117-
118- assert (!MSharedPtrStorage.empty ());
119-
120- std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
121- detail::convertToExtendedMembers (MSharedPtrStorage[0 ]);
122- // Look for the kernel bundle in extended members
123- std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr;
124- for (const detail::ExtendedMemberT &EMember : *ExtendedMembersVec)
125- if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType ) {
126- KernelBundleImpPtr =
127- std::static_pointer_cast<detail::kernel_bundle_impl>(EMember.MData );
128- break ;
129- }
130-
131- // No kernel bundle yet, create one
132- if (!KernelBundleImpPtr && Insert) {
133- // Create an empty kernel bundle to add kernels to later
134- KernelBundleImpPtr =
71+ if (!MImpl->MKernelBundle && Insert) {
72+ MImpl->MKernelBundle =
13573 detail::getSyclObjImpl (get_kernel_bundle<bundle_state::input>(
13674 MQueue->get_context (), {MQueue->get_device ()}, {}));
137-
138- detail::ExtendedMemberT EMember = {
139- detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, KernelBundleImpPtr};
140- ExtendedMembersVec->push_back (EMember);
14175 }
142-
143- return KernelBundleImpPtr;
76+ return MImpl->MKernelBundle ;
14477}
14578
146- // Sets kernel bundle to the provided one. Either replaces existing one or
147- // create a new entry in the extended members vector.
79+ // Sets kernel bundle to the provided one.
14880void handler::setHandlerKernelBundle (
14981 const std::shared_ptr<detail::kernel_bundle_impl> &NewKernelBundleImpPtr) {
150- assert (!MSharedPtrStorage.empty ());
151-
152- std::lock_guard<std::mutex> Lock (
153- detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
154-
155- std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec =
156- detail::convertToExtendedMembers (MSharedPtrStorage[0 ]);
157-
158- // Look for kernel bundle in extended members and overwrite it.
159- for (detail::ExtendedMemberT &EMember : *ExendedMembersVec) {
160- if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType ) {
161- EMember.MData = NewKernelBundleImpPtr;
162- return ;
163- }
164- }
165-
166- // Kernel bundle was set found so we add it.
167- detail::ExtendedMemberT EMember = {
168- detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE,
169- NewKernelBundleImpPtr};
170- ExendedMembersVec->push_back (EMember);
82+ MImpl->MKernelBundle = NewKernelBundleImpPtr;
17183}
17284
17385event handler::finalize () {
@@ -186,7 +98,7 @@ event handler::finalize() {
18698 if (KernelBundleImpPtr) {
18799 // Make sure implicit non-interop kernel bundles have the kernel
188100 if (!KernelBundleImpPtr->isInterop () &&
189- !getHandlerImpl () ->isStateExplicitKernelBundle ()) {
101+ !MImpl ->isStateExplicitKernelBundle ()) {
190102 kernel_id KernelID =
191103 detail::ProgramManager::getInstance ().getSYCLKernelID (MKernelName);
192104 bool KernelInserted =
@@ -299,10 +211,6 @@ event handler::finalize() {
299211 return MLastEvent;
300212 }
301213
302- // Evict handler_impl from extended members to make sure the command group
303- // does not keep it alive.
304- std::shared_ptr<detail::handler_impl> Impl = evictHandlerImpl ();
305-
306214 std::unique_ptr<detail::CG> CommandGroup;
307215 switch (type) {
308216 case detail::CG::Kernel:
@@ -312,11 +220,11 @@ event handler::finalize() {
312220 // assert feature to check if kernel uses assertions
313221 CommandGroup.reset (new detail::CGExecKernel (
314222 std::move (MNDRDesc), std::move (MHostKernel), std::move (MKernel),
315- std::move (MArgsStorage ), std::move (MAccStorage ),
316- std::move (MSharedPtrStorage ), std::move (MRequirements ),
317- std::move (MEvents ), std::move (MArgs ), MKernelName, MOSModuleHandle ,
318- std::move (MStreamStorage), std::move (Impl-> MAuxiliaryResources ),
319- MCGType, MCodeLoc));
223+ std::move (MImpl-> MKernelBundle ), std::move (MArgsStorage ),
224+ std::move (MAccStorage ), std::move (MSharedPtrStorage ),
225+ std::move (MRequirements ), std::move (MEvents ), std::move (MArgs) ,
226+ MKernelName, MOSModuleHandle, std::move (MStreamStorage ),
227+ std::move (MImpl-> MAuxiliaryResources ), MCGType, MCodeLoc));
320228 break ;
321229 }
322230 case detail::CG::CodeplayInteropTask:
@@ -365,9 +273,9 @@ event handler::finalize() {
365273 break ;
366274 case detail::CG::AdviseUSM:
367275 CommandGroup.reset (new detail::CGAdviseUSM (
368- MDstPtr, MLength, std::move (MArgsStorage) , std::move (MAccStorage ),
369- std::move (MSharedPtrStorage ), std::move (MRequirements ),
370- std::move (MEvents), MCGType, MCodeLoc));
276+ MDstPtr, MLength, MImpl-> MAdvice , std::move (MArgsStorage ),
277+ std::move (MAccStorage ), std::move (MSharedPtrStorage ),
278+ std::move (MRequirements), std::move ( MEvents), MCGType, MCodeLoc));
371279 break ;
372280 case detail::CG::CodeplayHostTask:
373281 CommandGroup.reset (new detail::CGHostTask (
@@ -405,7 +313,7 @@ event handler::finalize() {
405313}
406314
407315void handler::addReduction (const std::shared_ptr<const void > &ReduObj) {
408- getHandlerImpl () ->MAuxiliaryResources .push_back (ReduObj);
316+ MImpl ->MAuxiliaryResources .push_back (ReduObj);
409317}
410318
411319void handler::associateWithHandler (detail::AccessorBaseHost *AccBase,
@@ -674,7 +582,7 @@ void handler::verifyUsedKernelBundle(const std::string &KernelName) {
674582 return ;
675583
676584 // Implicit kernel bundles are populated late so we ignore them
677- if (!getHandlerImpl () ->isStateExplicitKernelBundle ())
585+ if (!MImpl ->isStateExplicitKernelBundle ())
678586 return ;
679587
680588 kernel_id KernelID = detail::get_kernel_id_impl (KernelName);
@@ -741,36 +649,23 @@ void handler::mem_advise(const void *Ptr, size_t Count, int Advice) {
741649 throwIfActionIsCreated ();
742650 MDstPtr = const_cast <void *>(Ptr);
743651 MLength = Count;
652+ MImpl->MAdvice = static_cast <pi_mem_advice>(Advice);
744653 setType (detail::CG::AdviseUSM);
745-
746- assert (!MSharedPtrStorage.empty ());
747-
748- std::lock_guard<std::mutex> Lock (
749- detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
750-
751- std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
752- detail::convertToExtendedMembers (MSharedPtrStorage[0 ]);
753-
754- detail::ExtendedMemberT EMember = {
755- detail::ExtendedMembersType::HANDLER_MEM_ADVICE,
756- std::make_shared<pi_mem_advice>(pi_mem_advice (Advice))};
757-
758- ExtendedMembersVec->push_back (EMember);
759654}
760655
761656void handler::use_kernel_bundle (
762657 const kernel_bundle<bundle_state::executable> &ExecBundle) {
763658
764659 std::shared_ptr<detail::queue_impl> PrimaryQueue =
765- getHandlerImpl () ->MSubmissionPrimaryQueue ;
660+ MImpl ->MSubmissionPrimaryQueue ;
766661 if (PrimaryQueue->get_context () != ExecBundle.get_context ())
767662 throw sycl::exception (
768663 make_error_code (errc::invalid),
769664 " Context associated with the primary queue is different from the "
770665 " context associated with the kernel bundle" );
771666
772667 std::shared_ptr<detail::queue_impl> SecondaryQueue =
773- getHandlerImpl () ->MSubmissionSecondaryQueue ;
668+ MImpl ->MSubmissionSecondaryQueue ;
774669 if (SecondaryQueue &&
775670 SecondaryQueue->get_context () != ExecBundle.get_context ())
776671 throw sycl::exception (
0 commit comments