@@ -495,18 +495,11 @@ ur_result_t urEnqueueDeviceGlobalVariableWrite(
495495 // /< this particular kernel execution instance.
496496) {
497497 std::scoped_lock<ur_shared_mutex> lock (Queue->Mutex );
498-
499- ze_module_handle_t ZeModule{};
500- auto It = Program->ZeModuleMap .find (Queue->Device ->ZeDevice );
501- if (It != Program->ZeModuleMap .end ()) {
502- ZeModule = It->second ;
503- } else {
504- ZeModule = Program->ZeModule ;
505- }
506-
507498 // Find global variable pointer
508499 size_t GlobalVarSize = 0 ;
509500 void *GlobalVarPtr = nullptr ;
501+ ze_module_handle_t ZeModule =
502+ Program->getZeModuleHandle (Queue->Device ->ZeDevice );
510503 ZE2UR_CALL (zeModuleGetGlobalPointer,
511504 (ZeModule, Name, &GlobalVarSize, &GlobalVarPtr));
512505 if (GlobalVarSize < Offset + Count) {
@@ -557,15 +550,8 @@ ur_result_t urEnqueueDeviceGlobalVariableRead(
557550 // /< this particular kernel execution instance.
558551) {
559552 std::scoped_lock<ur_shared_mutex> lock (Queue->Mutex );
560-
561- ze_module_handle_t ZeModule{};
562- auto It = Program->ZeModuleMap .find (Queue->Device ->ZeDevice );
563- if (It != Program->ZeModuleMap .end ()) {
564- ZeModule = It->second ;
565- } else {
566- ZeModule = Program->ZeModule ;
567- }
568-
553+ ze_module_handle_t ZeModule =
554+ Program->getZeModuleHandle (Queue->Device ->ZeDevice );
569555 // Find global variable pointer
570556 size_t GlobalVarSize = 0 ;
571557 void *GlobalVarPtr = nullptr ;
@@ -603,10 +589,6 @@ ur_result_t urKernelCreate(
603589 *RetKernel // /< [out] pointer to handle of kernel object created.
604590) {
605591 std::shared_lock<ur_shared_mutex> Guard (Program->Mutex );
606- if (Program->State != ur_program_handle_t_::state::Exe) {
607- return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE;
608- }
609-
610592 try {
611593 ur_kernel_handle_t_ *UrKernel = new ur_kernel_handle_t_ (true , Program);
612594 *RetKernel = reinterpret_cast <ur_kernel_handle_t >(UrKernel);
@@ -616,8 +598,13 @@ ur_result_t urKernelCreate(
616598 return UR_RESULT_ERROR_UNKNOWN;
617599 }
618600
619- for (auto It : Program->ZeModuleMap ) {
620- auto ZeModule = It.second ;
601+ for (auto &Dev : Program->AssociatedDevices ) {
602+ auto ZeDevice = Dev->ZeDevice ;
603+ // Program may be associated with all devices from the context but built only for subset of devices.
604+ if (Program->getState (ZeDevice) != ur_program_handle_t_::state::Exe)
605+ continue ;
606+
607+ auto ZeModule = Program->getZeModuleHandle (ZeDevice);
621608 ZeStruct<ze_kernel_desc_t > ZeKernelDesc;
622609 ZeKernelDesc.flags = 0 ;
623610 ZeKernelDesc.pKernelName = KernelName;
@@ -632,8 +619,6 @@ ur_result_t urKernelCreate(
632619 return ze2urResult (ZeResult);
633620 }
634621
635- auto ZeDevice = It.first ;
636-
637622 // Store the kernel in the ZeKernelMap so the correct
638623 // kernel can be retrieved later for a specific device
639624 // where a queue is being submitted.
@@ -650,7 +635,10 @@ ur_result_t urKernelCreate(
650635 for (auto ZeSubDevice : ZeSubDevices) {
651636 (*RetKernel)->ZeKernelMap [ZeSubDevice] = ZeKernel;
652637 }
653- }
638+ }
639+ // There is no any successfully built executable for program.
640+ if ((*RetKernel)->ZeKernelMap .empty ())
641+ return UR_RESULT_ERROR_INVALID_PROGRAM_EXECUTABLE;
654642
655643 (*RetKernel)->ZeKernel = (*RetKernel)->ZeKernelMap .begin ()->second ;
656644
0 commit comments