17 kernel_id::kernel_id(
const char *Name)
18 : impl(
std::make_shared<detail::kernel_id_impl>(Name)) {}
20 const char *kernel_id::get_name() const noexcept {
return impl->get_name(); }
28 bool device_image_plain::has_kernel(
const kernel_id &KernelID)
const noexcept {
29 return impl->has_kernel(KernelID);
32 bool device_image_plain::has_kernel(
const kernel_id &KernelID,
33 const device &Dev)
const noexcept {
34 return impl->has_kernel(KernelID, Dev);
38 return impl->getNative();
45 bool kernel_bundle_plain::empty() const noexcept {
return impl->empty(); }
47 backend kernel_bundle_plain::get_backend() const noexcept {
48 return impl->get_backend();
51 context kernel_bundle_plain::get_context() const noexcept {
52 return impl->get_context();
55 std::vector<device> kernel_bundle_plain::get_devices() const noexcept {
60 return impl->get_kernel_ids();
63 bool kernel_bundle_plain::contains_specialization_constants() const noexcept {
64 return impl->contains_specialization_constants();
67 bool kernel_bundle_plain::native_specialization_constant() const noexcept {
68 return impl->native_specialization_constant();
72 return impl->get_kernel(KernelID, impl);
83 bool kernel_bundle_plain::has_kernel(
const kernel_id &KernelID)
const noexcept {
87 bool kernel_bundle_plain::has_kernel(
const kernel_id &KernelID,
88 const device &Dev)
const noexcept {
89 return impl->has_kernel(KernelID, Dev);
92 bool kernel_bundle_plain::has_specialization_constant_impl(
93 const char *SpecName)
const noexcept {
94 return impl->has_specialization_constant(SpecName);
97 void kernel_bundle_plain::set_specialization_constant_impl(
98 const char *SpecName,
void *Value,
size_t Size) noexcept {
99 impl->set_specialization_constant_raw_value(SpecName, Value, Size);
102 void kernel_bundle_plain::get_specialization_constant_impl(
103 const char *SpecName,
void *Value)
const noexcept {
104 impl->get_specialization_constant_raw_value(SpecName, Value);
107 bool kernel_bundle_plain::is_specialization_constant_set(
108 const char *SpecName)
const noexcept {
109 return impl->is_specialization_constant_set(SpecName);
117 return detail::ProgramManager::getInstance().getSYCLKernelID(KernelName);
123 return std::make_shared<detail::kernel_bundle_impl>(Ctx, Devs, State);
128 const std::vector<kernel_id> &KernelIDs,
130 return std::make_shared<detail::kernel_bundle_impl>(Ctx, Devs, KernelIDs,
137 return std::make_shared<detail::kernel_bundle_impl>(Ctx, Devs, Selector,
143 const std::vector<device> &Devs) {
144 return std::make_shared<detail::kernel_bundle_impl>(Ctx, Devs);
147 std::shared_ptr<detail::kernel_bundle_impl>
148 join_impl(
const std::vector<detail::KernelBundleImplPtr> &Bundles) {
149 return std::make_shared<detail::kernel_bundle_impl>(Bundles,
150 bundle_state::input);
153 std::shared_ptr<detail::kernel_bundle_impl>
154 join_impl(
const std::vector<detail::KernelBundleImplPtr> &Bundles,
156 return std::make_shared<detail::kernel_bundle_impl>(Bundles, State);
163 if (Devs.empty() || !AllDevicesInTheContext)
165 "Not all devices are associated with the context or "
166 "vector of devices is empty");
168 if (bundle_state::input == State &&
171 if (bundle_state::object == State &&
175 const std::vector<device_image_plain> DeviceImages =
176 detail::ProgramManager::getInstance()
177 .getSYCLDeviceImagesWithCompatibleState(Ctx, Devs, State);
182 return (
bool)DeviceImages.size();
186 const std::vector<kernel_id> &KernelIds,
191 if (Devs.empty() || !AllDevicesInTheContext)
193 "Not all devices are associated with the context or "
194 "vector of devices is empty");
196 bool DeviceHasRequireAspectForState =
true;
197 if (bundle_state::input == State) {
198 DeviceHasRequireAspectForState =
200 return Dev.has(aspect::online_compiler);
202 }
else if (bundle_state::object == State) {
203 DeviceHasRequireAspectForState =
205 return Dev.has(aspect::online_linker);
209 if (!DeviceHasRequireAspectForState)
212 const std::vector<device_image_plain> DeviceImages =
213 detail::ProgramManager::getInstance()
214 .getSYCLDeviceImagesWithCompatibleState(Ctx, Devs, State);
216 std::set<kernel_id, LessByNameComp> CombinedKernelIDs;
218 const std::shared_ptr<device_image_impl> &DeviceImageImpl =
221 CombinedKernelIDs.insert(DeviceImageImpl->get_kernel_ids_ptr()->begin(),
222 DeviceImageImpl->get_kernel_ids_ptr()->end());
225 const bool AllKernelIDsRepresented =
227 [&CombinedKernelIDs](
const kernel_id &KernelID) {
228 return CombinedKernelIDs.count(KernelID);
234 return AllKernelIDsRepresented;
237 std::shared_ptr<detail::kernel_bundle_impl>
239 const std::vector<device> &Devs,
const property_list &PropList) {
240 return std::make_shared<detail::kernel_bundle_impl>(
241 InputBundle, Devs, PropList, bundle_state::object);
244 std::shared_ptr<detail::kernel_bundle_impl>
246 const std::vector<device> &Devs,
const property_list &PropList) {
247 return std::make_shared<detail::kernel_bundle_impl>(ObjectBundles, Devs,
251 std::shared_ptr<detail::kernel_bundle_impl>
253 const std::vector<device> &Devs,
const property_list &PropList) {
254 return std::make_shared<detail::kernel_bundle_impl>(
255 InputBundle, Devs, PropList, bundle_state::executable);
262 std::vector<sycl::device> IntersectDevices;
263 std::vector<unsigned int> DevsCounters;
264 std::map<device, unsigned int, LessByHash<device>> DevCounters;
273 for (
const std::pair<const device, unsigned int> &It : DevCounters)
274 if (ObjectBundles.size() == It.second)
275 IntersectDevices.push_back(It.first);
277 return IntersectDevices;
287 return detail::ProgramManager::getInstance().getAllSYCLKernelIDs();