diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index 69a6963373aa1..5bb86dd8a1eb5 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -824,10 +824,11 @@ pi_result _pi_queue::resetCommandList(pi_command_list_ptr_t CommandList, CommandList->second.InUse = false; // Finally release/cleanup all the events in this command list. + // Note, we don't need to synchronize the events since the fence + // synchronized above already does that. auto &EventList = CommandList->second.EventList; for (auto &Event : EventList) { if (!Event->CleanedUp) { - ZE_CALL(zeHostSynchronize, (Event->ZeEvent)); Event->cleanup(this); } Event->ZeCommandList = nullptr; @@ -1349,10 +1350,10 @@ pi_result _pi_ze_event_list_t::createAndRetainPiZeEventList( PI_ASSERT(EventList[I] != nullptr, PI_INVALID_VALUE); auto ZeEvent = EventList[I]->ZeEvent; - // Avoid polling of the device-scope events. - // TODO: be more fine-grain and check individual events. - if (FilterEventWaitList && ZeAllHostVisibleEvents) { - auto Res = ZE_CALL_NOCHECK(zeEventQueryStatus, (ZeEvent)); + // Poll of the host-visible events. + auto ZeEventHostVisible = EventList[I]->getHostVisibleEvent(); + if (FilterEventWaitList && ZeEventHostVisible) { + auto Res = ZE_CALL_NOCHECK(zeEventQueryStatus, (ZeEventHostVisible)); if (Res == ZE_RESULT_SUCCESS) { // Event has already completed, don't put it into the list continue; @@ -4507,7 +4508,7 @@ ze_event_handle_t _pi_event::getHostVisibleEvent() const { } else if (ZeHostVisibleEvent) { return ZeHostVisibleEvent; } else { - die("The host-visible proxy event missing"); + return nullptr; } } @@ -4642,17 +4643,19 @@ pi_result piEventGetInfo(pi_event Event, pi_event_info ParamName, } } - // Make sure that we query the host-visible event. - ze_event_handle_t ZeHostVisibleEvent; - if (auto Res = Event->getOrCreateHostVisibleEvent(ZeHostVisibleEvent)) - return Res; - - ze_result_t ZeResult; - ZeResult = ZE_CALL_NOCHECK(zeEventQueryStatus, (ZeHostVisibleEvent)); - if (ZeResult == ZE_RESULT_SUCCESS) { - return getInfo(ParamValueSize, ParamValue, ParamValueSizeRet, - pi_int32{CL_COMPLETE}); // Untie from OpenCL + // Make sure that we query a host-visible event only. + // If one wasn't yet created then don't create it here as well, and + // just conservatively return that event is not yet completed. + auto ZeHostVisibleEvent = Event->getHostVisibleEvent(); + if (ZeHostVisibleEvent) { + ze_result_t ZeResult; + ZeResult = ZE_CALL_NOCHECK(zeEventQueryStatus, (ZeHostVisibleEvent)); + if (ZeResult == ZE_RESULT_SUCCESS) { + return getInfo(ParamValueSize, ParamValue, ParamValueSizeRet, + pi_int32{CL_COMPLETE}); // Untie from OpenCL + } } + // TODO: We don't know if the status is queued, submitted or running. // For now return "running", as others are unlikely to be of // interest. @@ -4883,6 +4886,9 @@ pi_result piEventsWait(pi_uint32 NumEvents, const pi_event *EventList) { for (uint32_t I = 0; I < NumEvents; I++) { ze_event_handle_t ZeEvent = EventList[I]->getHostVisibleEvent(); + if (!ZeEvent) + die("The host-visible proxy event missing"); + zePrint("ZeEvent = %#lx\n", pi_cast(ZeEvent)); ZE_CALL(zeHostSynchronize, (ZeEvent)); diff --git a/sycl/plugins/level_zero/pi_level_zero.hpp b/sycl/plugins/level_zero/pi_level_zero.hpp index b7e948cc7e471..2c07a46be85dd 100644 --- a/sycl/plugins/level_zero/pi_level_zero.hpp +++ b/sycl/plugins/level_zero/pi_level_zero.hpp @@ -909,7 +909,7 @@ struct _pi_event : _pi_object { ze_event_pool_handle_t ZeHostVisibleEventPool = {nullptr}; // Get the host-visible event or create one and enqueue its signal. pi_result getOrCreateHostVisibleEvent(ze_event_handle_t &HostVisibleEvent); - // Get the host-visible event ensuring that one was already created before. + // Return the host-visible event if one was already created before, or null. ze_event_handle_t getHostVisibleEvent() const; // Level Zero command list where the command signaling this event was appended