@@ -493,18 +493,11 @@ ur_result_t urEnqueueDeviceGlobalVariableWrite(
493493 // /< this particular kernel execution instance.
494494) {
495495 std::scoped_lock<ur_shared_mutex> lock (Queue->Mutex );
496-
497- ze_module_handle_t ZeModule{};
498- auto It = Program->ZeModuleMap .find (Queue->Device ->ZeDevice );
499- if (It != Program->ZeModuleMap .end ()) {
500- ZeModule = It->second ;
501- } else {
502- ZeModule = Program->ZeModule ;
503- }
504-
505496 // Find global variable pointer
506497 size_t GlobalVarSize = 0 ;
507498 void *GlobalVarPtr = nullptr ;
499+ ze_module_handle_t ZeModule =
500+ Program->getZeModuleHandle (Queue->Device ->ZeDevice );
508501 ZE2UR_CALL (zeModuleGetGlobalPointer,
509502 (ZeModule, Name, &GlobalVarSize, &GlobalVarPtr));
510503 if (GlobalVarSize < Offset + Count) {
@@ -555,15 +548,8 @@ ur_result_t urEnqueueDeviceGlobalVariableRead(
555548 // /< this particular kernel execution instance.
556549) {
557550 std::scoped_lock<ur_shared_mutex> lock (Queue->Mutex );
558-
559- ze_module_handle_t ZeModule{};
560- auto It = Program->ZeModuleMap .find (Queue->Device ->ZeDevice );
561- if (It != Program->ZeModuleMap .end ()) {
562- ZeModule = It->second ;
563- } else {
564- ZeModule = Program->ZeModule ;
565- }
566-
551+ ze_module_handle_t ZeModule =
552+ Program->getZeModuleHandle (Queue->Device ->ZeDevice );
567553 // Find global variable pointer
568554 size_t GlobalVarSize = 0 ;
569555 void *GlobalVarPtr = nullptr ;
@@ -601,10 +587,6 @@ ur_result_t urKernelCreate(
601587 *RetKernel // /< [out] pointer to handle of kernel object created.
602588) {
603589 std::shared_lock<ur_shared_mutex> Guard (Program->Mutex );
604- if (Program->State != ur_program_handle_t_::state::Exe) {
605- return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE;
606- }
607-
608590 try {
609591 ur_kernel_handle_t_ *UrKernel = new ur_kernel_handle_t_ (true , Program);
610592 *RetKernel = reinterpret_cast <ur_kernel_handle_t >(UrKernel);
@@ -614,8 +596,13 @@ ur_result_t urKernelCreate(
614596 return UR_RESULT_ERROR_UNKNOWN;
615597 }
616598
617- for (auto It : Program->ZeModuleMap ) {
618- auto ZeModule = It.second ;
599+ for (auto &Dev : Program->AssociatedDevices ) {
600+ auto ZeDevice = Dev->ZeDevice ;
601+ // Program may be associated with all devices from the context but built only for subset of devices.
602+ if (Program->getState (ZeDevice) != ur_program_handle_t_::state::Exe)
603+ continue ;
604+
605+ auto ZeModule = Program->getZeModuleHandle (ZeDevice);
619606 ZeStruct<ze_kernel_desc_t > ZeKernelDesc;
620607 ZeKernelDesc.flags = 0 ;
621608 ZeKernelDesc.pKernelName = KernelName;
@@ -630,8 +617,6 @@ ur_result_t urKernelCreate(
630617 return ze2urResult (ZeResult);
631618 }
632619
633- auto ZeDevice = It.first ;
634-
635620 // Store the kernel in the ZeKernelMap so the correct
636621 // kernel can be retrieved later for a specific device
637622 // where a queue is being submitted.
@@ -648,7 +633,10 @@ ur_result_t urKernelCreate(
648633 for (auto ZeSubDevice : ZeSubDevices) {
649634 (*RetKernel)->ZeKernelMap [ZeSubDevice] = ZeKernel;
650635 }
651- }
636+ }
637+ // There is no any successfully built executable for program.
638+ if ((*RetKernel)->ZeKernelMap .empty ())
639+ return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE;
652640
653641 (*RetKernel)->ZeKernel = (*RetKernel)->ZeKernelMap .begin ()->second ;
654642
0 commit comments