diff --git a/sycl/unittests/scheduler/CMakeLists.txt b/sycl/unittests/scheduler/CMakeLists.txt index ceb7c8990c3f2..4356c0937bb3c 100644 --- a/sycl/unittests/scheduler/CMakeLists.txt +++ b/sycl/unittests/scheduler/CMakeLists.txt @@ -17,5 +17,6 @@ add_sycl_unittest(SchedulerTests OBJECT RequiredWGSize.cpp QueueFlushing.cpp PostEnqueueCleanup.cpp + Regression.cpp utils.cpp ) diff --git a/sycl/unittests/scheduler/Regression.cpp b/sycl/unittests/scheduler/Regression.cpp new file mode 100644 index 0000000000000..f0af4be0665eb --- /dev/null +++ b/sycl/unittests/scheduler/Regression.cpp @@ -0,0 +1,100 @@ +//==------------ Regression.cpp --- Scheduler unit tests -------------------==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "SchedulerTest.hpp" +#include "SchedulerTestUtils.hpp" + +#include +#include + +using namespace sycl; + +static std::tuple initializeRefValues() { + detail::NDRDescT NDRDesc; + NDRDesc.GlobalSize = range<3>(1, 2, 3); + NDRDesc.LocalSize = range<3>(1, 1, 1); + + int val; + buffer Buf(&val, range<1>(1)); + detail::Requirement MockReq = getMockRequirement(Buf); + return {NDRDesc, MockReq}; +} + +static pi_result redefinedEnqueueNativeKernel( + pi_queue queue, void (*user_func)(void *), void *args, size_t cb_args, + pi_uint32 num_mem_objects, const pi_mem *mem_list, + const void **args_mem_loc, pi_uint32 num_events_in_wait_list, + const pi_event *event_wait_list, pi_event *event) { + void **CastedBlob = (void **)args; + auto [NDRDesc, MockReq] = initializeRefValues(); + + std::vector Reqs = + *(static_cast *>(CastedBlob[0])); + EXPECT_EQ(Reqs[0]->MAccessRange[0], MockReq.MAccessRange[0]); + EXPECT_EQ(Reqs[0]->MAccessRange[1], MockReq.MAccessRange[1]); + EXPECT_EQ(Reqs[0]->MAccessRange[2], MockReq.MAccessRange[2]); + + std::unique_ptr *HostKernel = + static_cast *>(CastedBlob[1]); + testing::internal::CaptureStdout(); + (*HostKernel)->call(NDRDesc, nullptr); + std::string Output = testing::internal::GetCapturedStdout(); + EXPECT_EQ(Output, "Blablabla"); + + detail::NDRDescT *NDRDescActual = + static_cast(CastedBlob[2]); + EXPECT_EQ(NDRDescActual->GlobalSize[0], NDRDesc.GlobalSize[0]); + EXPECT_EQ(NDRDescActual->GlobalSize[1], NDRDesc.GlobalSize[1]); + EXPECT_EQ(NDRDescActual->GlobalSize[2], NDRDesc.GlobalSize[2]); + + return PI_SUCCESS; +} + +TEST_F(SchedulerTest, CheckArgsBlobInPiEnqueueNativeKernelIsValid) { + default_selector Selector; + platform Plt{default_selector()}; + if (Plt.is_host()) { + std::cout << "Not run due to host-only environment\n"; + return; + } + + unittest::PiMock Mock{Plt}; + setupDefaultMockAPIs(Mock); + Mock.redefine( + redefinedEnqueueNativeKernel); + + auto Kernel = []() { std::cout << "Blablabla"; }; + detail::HostKernel HKernel(Kernel); + auto [NDRDesc, MockReq] = initializeRefValues(); + + std::unique_ptr CG{new detail::CGExecKernel( + /*NDRDesc*/ NDRDesc, + /*HKernel*/ + std::make_unique>(HKernel), + /*SyclKernel*/ nullptr, + /*ArgsStorage*/ {}, + /*AccStorage*/ {}, + /*SharedPtrStorage*/ {}, + /*Requirements*/ {&MockReq}, + /*Events*/ {}, + /*Args*/ {}, + /*KernelName*/ "", + /*OSModuleHandle*/ detail::OSUtil::ExeModuleHandle, + /*Streams*/ {}, + /*Type*/ detail::CG::RunOnHostIntel)}; + + context Ctx{Plt}; + queue Queue{Ctx, Selector}; + detail::QueueImplPtr QueueImpl = detail::getSyclObjImpl(Queue); + + detail::ExecCGCommand ExecCGCmd{std::move(CG), QueueImpl}; + detail::EnqueueResultT EnqueueResult = detail::EnqueueResultT( + detail::EnqueueResultT::SyclEnqueueReady, &ExecCGCmd); + std::vector ToCleanUp; + ExecCGCmd.enqueue(EnqueueResult, detail::BlockingT::NON_BLOCKING, ToCleanUp); +}