@@ -35,139 +35,51 @@ handler::handler(std::shared_ptr<detail::queue_impl> Queue,
35
35
std::shared_ptr<detail::queue_impl> PrimaryQueue,
36
36
std::shared_ptr<detail::queue_impl> SecondaryQueue,
37
37
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) {
39
41
// 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.
42
42
auto ExtendedMembers =
43
43
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));
49
44
MSharedPtrStorage.push_back (std::move (ExtendedMembers));
50
45
}
51
46
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
-
88
47
// Sets the submission state to indicate that an explicit kernel bundle has been
89
48
// set. Throws a sycl::exception with errc::invalid if the current state
90
49
// indicates that a specialization constant has been set.
91
50
void handler::setStateExplicitKernelBundle () {
92
- getHandlerImpl () ->setStateExplicitKernelBundle ();
51
+ MImpl ->setStateExplicitKernelBundle ();
93
52
}
94
53
95
54
// Sets the submission state to indicate that a specialization constant has been
96
55
// set. Throws a sycl::exception with errc::invalid if the current state
97
56
// indicates that an explicit kernel bundle has been set.
98
- void handler::setStateSpecConstSet () {
99
- getHandlerImpl ()->setStateSpecConstSet ();
100
- }
57
+ void handler::setStateSpecConstSet () { MImpl->setStateSpecConstSet (); }
101
58
102
59
// Returns true if the submission state is EXPLICIT_KERNEL_BUNDLE_STATE and
103
60
// false otherwise.
104
61
bool handler::isStateExplicitKernelBundle () const {
105
- return getHandlerImpl () ->isStateExplicitKernelBundle ();
62
+ return MImpl ->isStateExplicitKernelBundle ();
106
63
}
107
64
108
- // Returns a shared_ptr to kernel_bundle stored in the extended members vector .
65
+ // Returns a shared_ptr to the kernel_bundle .
109
66
// If there is no kernel_bundle created:
110
67
// returns newly created kernel_bundle if Insert is true
111
68
// returns shared_ptr(nullptr) if Insert is false
112
69
std::shared_ptr<detail::kernel_bundle_impl>
113
70
handler::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 =
135
73
detail::getSyclObjImpl (get_kernel_bundle<bundle_state::input>(
136
74
MQueue->get_context (), {MQueue->get_device ()}, {}));
137
-
138
- detail::ExtendedMemberT EMember = {
139
- detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, KernelBundleImpPtr};
140
- ExtendedMembersVec->push_back (EMember);
141
75
}
142
-
143
- return KernelBundleImpPtr;
76
+ return MImpl->MKernelBundle ;
144
77
}
145
78
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.
148
80
void handler::setHandlerKernelBundle (
149
81
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;
171
83
}
172
84
173
85
event handler::finalize () {
@@ -186,7 +98,7 @@ event handler::finalize() {
186
98
if (KernelBundleImpPtr) {
187
99
// Make sure implicit non-interop kernel bundles have the kernel
188
100
if (!KernelBundleImpPtr->isInterop () &&
189
- !getHandlerImpl () ->isStateExplicitKernelBundle ()) {
101
+ !MImpl ->isStateExplicitKernelBundle ()) {
190
102
kernel_id KernelID =
191
103
detail::ProgramManager::getInstance ().getSYCLKernelID (MKernelName);
192
104
bool KernelInserted =
@@ -299,10 +211,6 @@ event handler::finalize() {
299
211
return MLastEvent;
300
212
}
301
213
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
-
306
214
std::unique_ptr<detail::CG> CommandGroup;
307
215
switch (type) {
308
216
case detail::CG::Kernel:
@@ -312,11 +220,11 @@ event handler::finalize() {
312
220
// assert feature to check if kernel uses assertions
313
221
CommandGroup.reset (new detail::CGExecKernel (
314
222
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));
320
228
break ;
321
229
}
322
230
case detail::CG::CodeplayInteropTask:
@@ -365,9 +273,9 @@ event handler::finalize() {
365
273
break ;
366
274
case detail::CG::AdviseUSM:
367
275
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));
371
279
break ;
372
280
case detail::CG::CodeplayHostTask:
373
281
CommandGroup.reset (new detail::CGHostTask (
@@ -405,7 +313,7 @@ event handler::finalize() {
405
313
}
406
314
407
315
void handler::addReduction (const std::shared_ptr<const void > &ReduObj) {
408
- getHandlerImpl () ->MAuxiliaryResources .push_back (ReduObj);
316
+ MImpl ->MAuxiliaryResources .push_back (ReduObj);
409
317
}
410
318
411
319
void handler::associateWithHandler (detail::AccessorBaseHost *AccBase,
@@ -674,7 +582,7 @@ void handler::verifyUsedKernelBundle(const std::string &KernelName) {
674
582
return ;
675
583
676
584
// Implicit kernel bundles are populated late so we ignore them
677
- if (!getHandlerImpl () ->isStateExplicitKernelBundle ())
585
+ if (!MImpl ->isStateExplicitKernelBundle ())
678
586
return ;
679
587
680
588
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) {
741
649
throwIfActionIsCreated ();
742
650
MDstPtr = const_cast <void *>(Ptr);
743
651
MLength = Count;
652
+ MImpl->MAdvice = static_cast <pi_mem_advice>(Advice);
744
653
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);
759
654
}
760
655
761
656
void handler::use_kernel_bundle (
762
657
const kernel_bundle<bundle_state::executable> &ExecBundle) {
763
658
764
659
std::shared_ptr<detail::queue_impl> PrimaryQueue =
765
- getHandlerImpl () ->MSubmissionPrimaryQueue ;
660
+ MImpl ->MSubmissionPrimaryQueue ;
766
661
if (PrimaryQueue->get_context () != ExecBundle.get_context ())
767
662
throw sycl::exception (
768
663
make_error_code (errc::invalid),
769
664
" Context associated with the primary queue is different from the "
770
665
" context associated with the kernel bundle" );
771
666
772
667
std::shared_ptr<detail::queue_impl> SecondaryQueue =
773
- getHandlerImpl () ->MSubmissionSecondaryQueue ;
668
+ MImpl ->MSubmissionSecondaryQueue ;
774
669
if (SecondaryQueue &&
775
670
SecondaryQueue->get_context () != ExecBundle.get_context ())
776
671
throw sycl::exception (
0 commit comments