@@ -93,122 +93,126 @@ event handler::finalize() {
93
93
return MLastEvent;
94
94
MIsFinalized = true ;
95
95
96
- std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr = nullptr ;
97
- // If there were uses of set_specialization_constant build the kernel_bundle
98
- KernelBundleImpPtr = getOrInsertHandlerKernelBundle (/* Insert=*/ false );
99
- if (KernelBundleImpPtr) {
100
- // Make sure implicit non-interop kernel bundles have the kernel
101
- if (!KernelBundleImpPtr->isInterop () &&
102
- !MImpl->isStateExplicitKernelBundle ()) {
103
- kernel_id KernelID =
104
- detail::ProgramManager::getInstance ().getSYCLKernelID (MKernelName);
105
- bool KernelInserted =
106
- KernelBundleImpPtr->add_kernel (KernelID, MQueue->get_device ());
107
- // If kernel was not inserted and the bundle is in input mode we try
108
- // building it and trying to find the kernel in executable mode
109
- if (!KernelInserted &&
110
- KernelBundleImpPtr->get_bundle_state () == bundle_state::input) {
111
- auto KernelBundle =
96
+ const auto &type = getType ();
97
+ if (type == detail::CG::Kernel) {
98
+ // If there were uses of set_specialization_constant build the kernel_bundle
99
+ std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr =
100
+ getOrInsertHandlerKernelBundle (/* Insert=*/ false );
101
+ if (KernelBundleImpPtr) {
102
+ // Make sure implicit non-interop kernel bundles have the kernel
103
+ if (!KernelBundleImpPtr->isInterop () &&
104
+ !MImpl->isStateExplicitKernelBundle ()) {
105
+ kernel_id KernelID =
106
+ detail::ProgramManager::getInstance ().getSYCLKernelID (MKernelName);
107
+ bool KernelInserted =
108
+ KernelBundleImpPtr->add_kernel (KernelID, MQueue->get_device ());
109
+ // If kernel was not inserted and the bundle is in input mode we try
110
+ // building it and trying to find the kernel in executable mode
111
+ if (!KernelInserted &&
112
+ KernelBundleImpPtr->get_bundle_state () == bundle_state::input) {
113
+ auto KernelBundle =
114
+ detail::createSyclObjFromImpl<kernel_bundle<bundle_state::input>>(
115
+ KernelBundleImpPtr);
116
+ kernel_bundle<bundle_state::executable> ExecKernelBundle =
117
+ build (KernelBundle);
118
+ KernelBundleImpPtr = detail::getSyclObjImpl (ExecKernelBundle);
119
+ setHandlerKernelBundle (KernelBundleImpPtr);
120
+ KernelInserted =
121
+ KernelBundleImpPtr->add_kernel (KernelID, MQueue->get_device ());
122
+ }
123
+ // If the kernel was not found in executable mode we throw an exception
124
+ if (!KernelInserted)
125
+ throw sycl::exception (make_error_code (errc::runtime),
126
+ " Failed to add kernel to kernel bundle." );
127
+ }
128
+
129
+ switch (KernelBundleImpPtr->get_bundle_state ()) {
130
+ case bundle_state::input: {
131
+ // Underlying level expects kernel_bundle to be in executable state
132
+ kernel_bundle<bundle_state::executable> ExecBundle = build (
112
133
detail::createSyclObjFromImpl<kernel_bundle<bundle_state::input>>(
113
- KernelBundleImpPtr);
114
- kernel_bundle<bundle_state::executable> ExecKernelBundle =
115
- build (KernelBundle);
116
- KernelBundleImpPtr = detail::getSyclObjImpl (ExecKernelBundle);
134
+ KernelBundleImpPtr));
135
+ KernelBundleImpPtr = detail::getSyclObjImpl (ExecBundle);
117
136
setHandlerKernelBundle (KernelBundleImpPtr);
118
- KernelInserted =
119
- KernelBundleImpPtr->add_kernel (KernelID, MQueue->get_device ());
137
+ break ;
138
+ }
139
+ case bundle_state::executable:
140
+ // Nothing to do
141
+ break ;
142
+ case bundle_state::object:
143
+ assert (0 && " Expected that the bundle is either in input or executable "
144
+ " states." );
145
+ break ;
120
146
}
121
- // If the kernel was not found in executable mode we throw an exception
122
- if (!KernelInserted)
123
- throw sycl::exception (make_error_code (errc::runtime),
124
- " Failed to add kernel to kernel bundle." );
125
147
}
126
148
127
- switch (KernelBundleImpPtr->get_bundle_state ()) {
128
- case bundle_state::input: {
129
- // Underlying level expects kernel_bundle to be in executable state
130
- kernel_bundle<bundle_state::executable> ExecBundle = build (
131
- detail::createSyclObjFromImpl<kernel_bundle<bundle_state::input>>(
132
- KernelBundleImpPtr));
133
- KernelBundleImpPtr = detail::getSyclObjImpl (ExecBundle);
134
- setHandlerKernelBundle (KernelBundleImpPtr);
135
- break ;
136
- }
137
- case bundle_state::executable:
138
- // Nothing to do
139
- break ;
140
- case bundle_state::object:
141
- assert (0 && " Expected that the bundle is either in input or executable "
142
- " states." );
143
- break ;
144
- }
145
- }
149
+ if (MRequirements.size () + MEvents.size () + MStreamStorage.size () == 0 ) {
150
+ // if user does not add a new dependency to the dependency graph, i.e.
151
+ // the graph is not changed, then this faster path is used to submit
152
+ // kernel bypassing scheduler and avoiding CommandGroup, Command objects
153
+ // creation.
146
154
147
- const auto &type = getType ();
148
- if (type == detail::CG::Kernel &&
149
- MRequirements.size () + MEvents.size () + MStreamStorage.size () == 0 ) {
150
- // if user does not add a new dependency to the dependency graph, i.e.
151
- // the graph is not changed, then this faster path is used to submit kernel
152
- // bypassing scheduler and avoiding CommandGroup, Command objects creation.
153
-
154
- std::vector<RT::PiEvent> RawEvents;
155
- detail::EventImplPtr NewEvent;
156
- RT::PiEvent *OutEvent = nullptr ;
157
-
158
- auto EnqueueKernel = [&]() {
159
- // 'Result' for single point of return
160
- pi_int32 Result = PI_ERROR_INVALID_VALUE;
161
-
162
- if (MQueue->is_host ()) {
163
- MHostKernel->call (
164
- MNDRDesc, (NewEvent) ? NewEvent->getHostProfilingInfo () : nullptr );
165
- Result = PI_SUCCESS;
166
- } else {
167
- if (MQueue->getPlugin ().getBackend () ==
168
- backend::ext_intel_esimd_emulator) {
169
- MQueue->getPlugin ().call <detail::PiApiKind::piEnqueueKernelLaunch>(
170
- nullptr , reinterpret_cast <pi_kernel>(MHostKernel->getPtr ()),
171
- MNDRDesc.Dims , &MNDRDesc.GlobalOffset [0 ], &MNDRDesc.GlobalSize [0 ],
172
- &MNDRDesc.LocalSize [0 ], 0 , nullptr , nullptr );
155
+ std::vector<RT::PiEvent> RawEvents;
156
+ detail::EventImplPtr NewEvent;
157
+ RT::PiEvent *OutEvent = nullptr ;
158
+
159
+ auto EnqueueKernel = [&]() {
160
+ // 'Result' for single point of return
161
+ pi_int32 Result = PI_ERROR_INVALID_VALUE;
162
+
163
+ if (MQueue->is_host ()) {
164
+ MHostKernel->call (MNDRDesc, (NewEvent)
165
+ ? NewEvent->getHostProfilingInfo ()
166
+ : nullptr );
173
167
Result = PI_SUCCESS;
174
168
} else {
175
- Result = enqueueImpKernel (MQueue, MNDRDesc, MArgs, KernelBundleImpPtr,
176
- MKernel, MKernelName, MOSModuleHandle,
177
- RawEvents, OutEvent, nullptr );
169
+ if (MQueue->getPlugin ().getBackend () ==
170
+ backend::ext_intel_esimd_emulator) {
171
+ MQueue->getPlugin ().call <detail::PiApiKind::piEnqueueKernelLaunch>(
172
+ nullptr , reinterpret_cast <pi_kernel>(MHostKernel->getPtr ()),
173
+ MNDRDesc.Dims , &MNDRDesc.GlobalOffset [0 ],
174
+ &MNDRDesc.GlobalSize [0 ], &MNDRDesc.LocalSize [0 ], 0 , nullptr ,
175
+ nullptr );
176
+ Result = PI_SUCCESS;
177
+ } else {
178
+ Result = enqueueImpKernel (
179
+ MQueue, MNDRDesc, MArgs, KernelBundleImpPtr, MKernel,
180
+ MKernelName, MOSModuleHandle, RawEvents, OutEvent, nullptr );
181
+ }
178
182
}
183
+ return Result;
184
+ };
185
+
186
+ bool DiscardEvent = false ;
187
+ if (MQueue->has_discard_events_support ()) {
188
+ // Kernel only uses assert if it's non interop one
189
+ bool KernelUsesAssert =
190
+ !(MKernel && MKernel->isInterop ()) &&
191
+ detail::ProgramManager::getInstance ().kernelUsesAssert (
192
+ MOSModuleHandle, MKernelName);
193
+ DiscardEvent = !KernelUsesAssert;
179
194
}
180
- return Result;
181
- };
182
-
183
- bool DiscardEvent = false ;
184
- if (MQueue->has_discard_events_support ()) {
185
- // Kernel only uses assert if it's non interop one
186
- bool KernelUsesAssert =
187
- !(MKernel && MKernel->isInterop ()) &&
188
- detail::ProgramManager::getInstance ().kernelUsesAssert (
189
- MOSModuleHandle, MKernelName);
190
- DiscardEvent = !KernelUsesAssert;
191
- }
192
195
193
- if (DiscardEvent) {
194
- if (PI_SUCCESS != EnqueueKernel ())
195
- throw runtime_error (" Enqueue process failed." ,
196
- PI_ERROR_INVALID_OPERATION);
197
- } else {
198
- NewEvent = std::make_shared<detail::event_impl>(MQueue);
199
- NewEvent->setContextImpl (MQueue->getContextImplPtr ());
200
- NewEvent->setStateIncomplete ();
201
- OutEvent = &NewEvent->getHandleRef ();
202
-
203
- if (PI_SUCCESS != EnqueueKernel ())
204
- throw runtime_error (" Enqueue process failed." ,
205
- PI_ERROR_INVALID_OPERATION);
206
- else if (NewEvent->is_host () || NewEvent->getHandleRef () == nullptr )
207
- NewEvent->setComplete ();
208
-
209
- MLastEvent = detail::createSyclObjFromImpl<event>(NewEvent);
196
+ if (DiscardEvent) {
197
+ if (PI_SUCCESS != EnqueueKernel ())
198
+ throw runtime_error (" Enqueue process failed." ,
199
+ PI_ERROR_INVALID_OPERATION);
200
+ } else {
201
+ NewEvent = std::make_shared<detail::event_impl>(MQueue);
202
+ NewEvent->setContextImpl (MQueue->getContextImplPtr ());
203
+ NewEvent->setStateIncomplete ();
204
+ OutEvent = &NewEvent->getHandleRef ();
205
+
206
+ if (PI_SUCCESS != EnqueueKernel ())
207
+ throw runtime_error (" Enqueue process failed." ,
208
+ PI_ERROR_INVALID_OPERATION);
209
+ else if (NewEvent->is_host () || NewEvent->getHandleRef () == nullptr )
210
+ NewEvent->setComplete ();
211
+
212
+ MLastEvent = detail::createSyclObjFromImpl<event>(NewEvent);
213
+ }
214
+ return MLastEvent;
210
215
}
211
- return MLastEvent;
212
216
}
213
217
214
218
std::unique_ptr<detail::CG> CommandGroup;
0 commit comments