Skip to content
12 changes: 6 additions & 6 deletions sycl/source/handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -984,15 +984,15 @@ event handler::finalize() {
#endif
}

bool DiscardEvent = !impl->MEventNeeded && Queue &&
Queue->supportsDiscardingPiEvents() &&
CommandGroup->getRequirements().size() == 0;

// Regardless of whether an event has been requested, the scheduler
// needs to generate an event so the commands are properly ordered
// (for in-order queue) and synchronized with a barrier (for out-of-order
// queue)
detail::EventImplPtr Event = detail::Scheduler::getInstance().addCG(
std::move(CommandGroup), *Queue, !DiscardEvent);
std::move(CommandGroup), *Queue, true);

#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
return DiscardEvent ? nullptr : Event;
return Event;
#else
return detail::createSyclObjFromImpl<event>(Event);
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,40 +26,30 @@ inline ur_result_t after_urKernelGetInfo(void *pParams) {
static thread_local size_t counter_urEnqueueKernelLaunch = 0;
inline ur_result_t redefined_urEnqueueKernelLaunch(void *pParams) {
++counter_urEnqueueKernelLaunch;
auto params = *static_cast<ur_enqueue_kernel_launch_params_t *>(pParams);
EXPECT_EQ(*params.pphEvent, nullptr);
return UR_RESULT_SUCCESS;
}

static thread_local size_t counter_urUSMEnqueueMemcpy = 0;
inline ur_result_t redefined_urUSMEnqueueMemcpy(void *pParams) {
++counter_urUSMEnqueueMemcpy;
auto params = *static_cast<ur_enqueue_usm_memcpy_params_t *>(pParams);
EXPECT_EQ(*params.pphEvent, nullptr);
return UR_RESULT_SUCCESS;
}

static thread_local size_t counter_urUSMEnqueueFill = 0;
inline ur_result_t redefined_urUSMEnqueueFill(void *pParams) {
++counter_urUSMEnqueueFill;
auto params = *static_cast<ur_enqueue_usm_fill_params_t *>(pParams);
EXPECT_EQ(*params.pphEvent, nullptr);
return UR_RESULT_SUCCESS;
}

static thread_local size_t counter_urUSMEnqueuePrefetch = 0;
inline ur_result_t redefined_urUSMEnqueuePrefetch(void *pParams) {
++counter_urUSMEnqueuePrefetch;
auto params = *static_cast<ur_enqueue_usm_prefetch_params_t *>(pParams);
EXPECT_EQ(*params.pphEvent, nullptr);
return UR_RESULT_SUCCESS;
}

static thread_local size_t counter_urUSMEnqueueMemAdvise = 0;
inline ur_result_t redefined_urUSMEnqueueMemAdvise(void *pParams) {
++counter_urUSMEnqueueMemAdvise;
auto params = *static_cast<ur_enqueue_usm_advise_params_t *>(pParams);
EXPECT_EQ(*params.pphEvent, nullptr);
return UR_RESULT_SUCCESS;
}

Expand Down
77 changes: 65 additions & 12 deletions sycl/unittests/scheduler/InOrderQueueHostTaskDeps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

using namespace sycl;

namespace oneapiext = ext::oneapi::experimental;

size_t GEventsWaitCounter = 0;

inline ur_result_t redefinedEventsWaitWithBarrier(void *pParams) {
Expand Down Expand Up @@ -49,19 +51,19 @@ TEST_F(SchedulerTest, InOrderQueueHostTaskDeps) {
}

enum class CommandType { KERNEL = 1, MEMSET = 2 };
std::vector<std::pair<CommandType, size_t>> ExecutedCommands;
std::vector<std::tuple<CommandType, size_t, size_t>> ExecutedCommands;

inline ur_result_t customEnqueueKernelLaunch(void *pParams) {
auto params = *static_cast<ur_enqueue_kernel_launch_params_t *>(pParams);
ExecutedCommands.push_back(
{CommandType::KERNEL, *params.pnumEventsInWaitList});
ExecutedCommands.push_back({CommandType::KERNEL, *params.pnumEventsInWaitList,
**params.ppGlobalWorkSize});
return UR_RESULT_SUCCESS;
}

inline ur_result_t customEnqueueUSMFill(void *pParams) {
auto params = *static_cast<ur_enqueue_usm_fill_params_t *>(pParams);
ExecutedCommands.push_back(
{CommandType::MEMSET, *params.pnumEventsInWaitList});
{CommandType::MEMSET, *params.pnumEventsInWaitList, 0});
return UR_RESULT_SUCCESS;
}

Expand Down Expand Up @@ -112,10 +114,12 @@ TEST_F(SchedulerTest, InOrderQueueCrossDeps) {
InOrderQueue.wait();

ASSERT_EQ(ExecutedCommands.size(), 2u);
EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET);
EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u);
EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL);
EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u);
EXPECT_EQ(std::get<0>(ExecutedCommands[0]) /*CommandType*/,
CommandType::MEMSET);
EXPECT_EQ(std::get<1>(ExecutedCommands[0]) /*EventsCount*/, 0u);
EXPECT_EQ(std::get<0>(ExecutedCommands[1]) /*CommandType*/,
CommandType::KERNEL);
EXPECT_EQ(std::get<1>(ExecutedCommands[1]) /*EventsCount*/, 0u);
}

TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) {
Expand Down Expand Up @@ -157,8 +161,57 @@ TEST_F(SchedulerTest, InOrderQueueCrossDepsShortcutFuncs) {
InOrderQueue.wait();

ASSERT_EQ(ExecutedCommands.size(), 2u);
EXPECT_EQ(ExecutedCommands[0].first /*CommandType*/, CommandType::MEMSET);
EXPECT_EQ(ExecutedCommands[0].second /*EventsCount*/, 0u);
EXPECT_EQ(ExecutedCommands[1].first /*CommandType*/, CommandType::KERNEL);
EXPECT_EQ(ExecutedCommands[1].second /*EventsCount*/, 0u);
EXPECT_EQ(std::get<0>(ExecutedCommands[0]) /*CommandType*/,
CommandType::MEMSET);
EXPECT_EQ(std::get<1>(ExecutedCommands[0]) /*EventsCount*/, 0u);
EXPECT_EQ(std::get<0>(ExecutedCommands[1]) /*CommandType*/,
CommandType::KERNEL);
EXPECT_EQ(std::get<1>(ExecutedCommands[1]) /*EventsCount*/, 0u);
}

TEST_F(SchedulerTest, InOrderQueueCrossDepsEnqueueFunctions) {
ExecutedCommands.clear();
sycl::unittest::UrMock<> Mock;
mock::getCallbacks().set_before_callback("urEnqueueKernelLaunch",
&customEnqueueKernelLaunch);

sycl::platform Plt = sycl::platform();

context Ctx{Plt};
queue InOrderQueue{Ctx, default_selector_v, property::queue::in_order()};

std::mutex CvMutex;
std::condition_variable Cv;
bool ready = false;

InOrderQueue.submit([&](sycl::handler &CGH) {
CGH.host_task([&] {
std::unique_lock<std::mutex> lk(CvMutex);
Cv.wait(lk, [&ready] { return ready; });
});
});

oneapiext::nd_launch<TestKernel>(
InOrderQueue, nd_range<1>{range<1>{32}, range<1>{32}}, [](nd_item<1>) {});

oneapiext::nd_launch<TestKernel>(
InOrderQueue, nd_range<1>{range<1>{64}, range<1>{32}}, [](nd_item<1>) {});

{
std::unique_lock<std::mutex> lk(CvMutex);
ready = true;
}
Cv.notify_one();

InOrderQueue.wait();

ASSERT_EQ(ExecutedCommands.size(), 2u);
EXPECT_EQ(std::get<0>(ExecutedCommands[0]) /*CommandType*/,
CommandType::KERNEL);
EXPECT_EQ(std::get<1>(ExecutedCommands[0]) /*EventsCount*/, 0u);
EXPECT_EQ(std::get<2>(ExecutedCommands[0]) /*GlobalWorkSize*/, 32u);
EXPECT_EQ(std::get<0>(ExecutedCommands[1]) /*CommandType*/,
CommandType::KERNEL);
EXPECT_EQ(std::get<1>(ExecutedCommands[1]) /*EventsCount*/, 0u);
EXPECT_EQ(std::get<2>(ExecutedCommands[1]) /*GlobalWorkSize*/, 64u);
}