@@ -549,13 +549,14 @@ RT::PiProgram ProgramManager::getBuiltPIProgram(
549
549
// FIXME: on CPU we can't re-use results unless "Dev" is a root device already
550
550
// due to Intel OpenCL CPU bug(?). This solution is tested only on Intel GPU
551
551
// implementation.
552
- if (Dev->is_gpu ())
553
- while (!Dev->isRootDevice ()) {
554
- auto ParentDev =
555
- detail::getSyclObjImpl (Dev->get_info <info::device::parent_device>());
556
- Dev = ParentDev;
552
+ DeviceImplPtr KeyDev = Dev;
553
+ if (KeyDev->is_gpu ())
554
+ while (!KeyDev->isRootDevice ()) {
555
+ auto ParentDev = detail::getSyclObjImpl (
556
+ KeyDev->get_info <info::device::parent_device>());
557
+ KeyDev = ParentDev;
557
558
}
558
- const RT::PiDevice PiDevice = Dev ->getHandleRef ();
559
+ const RT::PiDevice PiDevice = KeyDev ->getHandleRef ();
559
560
560
561
auto BuildResult = getOrBuild<PiProgramT, compile_program_error>(
561
562
Cache,
@@ -592,7 +593,17 @@ ProgramManager::getOrCreateKernel(OSModuleHandle M,
592
593
Prg->stableSerializeSpecConstRegistry (SpecConsts);
593
594
}
594
595
applyOptionsFromEnvironment (CompileOpts, LinkOpts);
595
- const RT::PiDevice PiDevice = DeviceImpl->getHandleRef ();
596
+
597
+ auto Dev = DeviceImpl;
598
+ bool IsGPUDevice = Dev->is_gpu ();
599
+ while (!Dev->isRootDevice ()) {
600
+ auto ParentDev =
601
+ detail::getSyclObjImpl (Dev->get_info <info::device::parent_device>());
602
+ if (!ContextImpl->hasDevice (ParentDev) && !IsGPUDevice)
603
+ break ;
604
+ Dev = ParentDev;
605
+ }
606
+ const RT::PiDevice PiDevice = Dev->getHandleRef ();
596
607
597
608
auto key = std::make_tuple (std::move (SpecConsts), M, PiDevice,
598
609
CompileOpts + LinkOpts, KernelName);
0 commit comments