From 1390af6efe95e17750382da5f2812b35388cbcd7 Mon Sep 17 00:00:00 2001 From: Kacper Nowak Date: Tue, 8 Feb 2022 17:16:59 +0000 Subject: [PATCH] Make usesStringMap flag independent of implicit args requirements This commits removes part of condition requiring requiresImplicitArgs flag set in kernel descriptor in order to set usesStringMap flag. Related-To: NEO-6604 Signed-off-by: Kacper Nowak --- .../source/printf_handler/printf_handler.cpp | 2 +- .../unit_tests/sources/kernel/test_kernel.cpp | 84 ++++++++++++------- opencl/source/program/printf_handler.cpp | 2 +- .../command_queue/enqueue_kernel_2_tests.cpp | 45 +--------- 4 files changed, 57 insertions(+), 76 deletions(-) diff --git a/level_zero/core/source/printf_handler/printf_handler.cpp b/level_zero/core/source/printf_handler/printf_handler.cpp index 84fbbd0ba7..3dcc234827 100644 --- a/level_zero/core/source/printf_handler/printf_handler.cpp +++ b/level_zero/core/source/printf_handler/printf_handler.cpp @@ -30,7 +30,7 @@ void PrintfHandler::printOutput(const KernelImmutableData *kernelData, NEO::GraphicsAllocation *printfBuffer, Device *device) { bool using32BitGpuPointers = kernelData->getDescriptor().kernelAttributes.gpuPointerSize == 4u; - auto usesStringMap = kernelData->getDescriptor().kernelAttributes.flags.usesStringMapForPrintf || kernelData->getDescriptor().kernelAttributes.flags.requiresImplicitArgs; + auto usesStringMap = kernelData->getDescriptor().kernelAttributes.flags.usesStringMapForPrintf; NEO::PrintFormatter printfFormatter{ static_cast(printfBuffer->getUnderlyingBuffer()), static_cast(printfBuffer->getUnderlyingBufferSize()), diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index 094293dd1b..21d52879dc 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -2187,6 +2187,60 @@ TEST_F(PrintfTest, WhenCreatingPrintfBufferThenCrossThreadDataIsPatched) { mockKernel.crossThreadData.release(); } +using KernelPrintfStringMapTests = Test; + +TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageEnabledWhenPrintOutputThenProperStringIsPrinted) { + std::unique_ptr mockKernelImmData = std::make_unique(0u); + + auto kernelDescriptor = mockKernelImmData->kernelDescriptor; + kernelDescriptor->kernelAttributes.flags.usesPrintf = true; + kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = true; + std::string expectedString("test123"); + kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString)); + + createModuleFromBinary(0u, false, mockKernelImmData.get()); + + auto kernel = std::make_unique(module.get()); + + ze_kernel_desc_t kernelDesc{ZE_STRUCTURE_TYPE_KERNEL_DESC}; + kernel->initialize(&kernelDesc); + + auto printfAllocation = reinterpret_cast(kernel->getPrintfBufferAllocation()->getUnderlyingBuffer()); + printfAllocation[0] = 8; + printfAllocation[1] = 0; + + testing::internal::CaptureStdout(); + kernel->printPrintfOutput(); + std::string output = testing::internal::GetCapturedStdout(); + EXPECT_STREQ(expectedString.c_str(), output.c_str()); +} + +TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageDisabledWhenPrintOutputThenNothingIsPrinted) { + std::unique_ptr mockKernelImmData = std::make_unique(0u); + + auto kernelDescriptor = mockKernelImmData->kernelDescriptor; + kernelDescriptor->kernelAttributes.flags.usesPrintf = true; + kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = false; + std::string expectedString("test123"); + kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString)); + + createModuleFromBinary(0u, false, mockKernelImmData.get()); + + auto kernel = std::make_unique(module.get()); + + ze_kernel_desc_t kernelDesc{ZE_STRUCTURE_TYPE_KERNEL_DESC}; + kernel->initialize(&kernelDesc); + + auto printfAllocation = reinterpret_cast(kernel->getPrintfBufferAllocation()->getUnderlyingBuffer()); + printfAllocation[0] = 8; + printfAllocation[1] = 0; + + testing::internal::CaptureStdout(); + kernel->printPrintfOutput(); + std::string output = testing::internal::GetCapturedStdout(); + EXPECT_STREQ("", output.c_str()); +} + using KernelImplicitArgTests = Test; TEST_F(KernelImplicitArgTests, givenKernelWithImplicitArgsWhenInitializeThenPrintfSurfaceIsCreatedAndProperlyPatchedInImplicitArgs) { @@ -2272,36 +2326,6 @@ TEST_F(KernelImplicitArgTests, givenKernelWithImplicitArgsWhenSettingKernelParam EXPECT_EQ(0, memcmp(pImplicitArgs, &expectedImplicitArgs, sizeof(ImplicitArgs))); } -TEST_F(KernelImplicitArgTests, givenKernelWithImplicitArgsAndPrintfStringsMapWhenPrintOutputThenProperStringIsPrinted) { - std::unique_ptr mockKernelImmData = std::make_unique(0u); - - auto kernelDescriptor = mockKernelImmData->kernelDescriptor; - kernelDescriptor->kernelAttributes.flags.requiresImplicitArgs = true; - kernelDescriptor->kernelAttributes.flags.usesPrintf = false; - kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = false; - std::string expectedString("test123"); - kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString)); - - createModuleFromBinary(0u, false, mockKernelImmData.get()); - - auto kernel = std::make_unique(module.get()); - - ze_kernel_desc_t kernelDesc{ZE_STRUCTURE_TYPE_KERNEL_DESC}; - kernel->initialize(&kernelDesc); - - auto printfAllocation = reinterpret_cast(kernel->getPrintfBufferAllocation()->getUnderlyingBuffer()); - printfAllocation[0] = 8; - printfAllocation[1] = 0; - - EXPECT_TRUE(kernel->getKernelDescriptor().kernelAttributes.flags.requiresImplicitArgs); - ASSERT_NE(nullptr, kernel->getImplicitArgs()); - - testing::internal::CaptureStdout(); - kernel->printPrintfOutput(); - std::string output = testing::internal::GetCapturedStdout(); - EXPECT_STREQ(expectedString.c_str(), output.c_str()); -} - TEST_F(KernelImplicitArgTests, givenKernelWithoutImplicitArgsWhenPatchingImplicitArgsThenNothingHappens) { std::unique_ptr mockKernelImmData = std::make_unique(0u); mockKernelImmData->kernelDescriptor->kernelAttributes.flags.requiresImplicitArgs = false; diff --git a/opencl/source/program/printf_handler.cpp b/opencl/source/program/printf_handler.cpp index 5db9ed6898..8da95c7b43 100644 --- a/opencl/source/program/printf_handler.cpp +++ b/opencl/source/program/printf_handler.cpp @@ -88,7 +88,7 @@ void PrintfHandler::makeResident(CommandStreamReceiver &commandStreamReceiver) { void PrintfHandler::printEnqueueOutput() { auto &hwInfo = device.getHardwareInfo(); - auto usesStringMap = kernel->getDescriptor().kernelAttributes.flags.usesStringMapForPrintf || nullptr != kernel->getImplicitArgs(); + auto usesStringMap = kernel->getDescriptor().kernelAttributes.flags.usesStringMapForPrintf; const auto &hwInfoConfig = *HwInfoConfig::get(hwInfo.platform.eProductFamily); auto printfOutputBuffer = reinterpret_cast(printfSurface->getUnderlyingBuffer()); auto printfOutputSize = static_cast(printfSurface->getUnderlyingBufferSize()); diff --git a/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp index bbaa15a535..05a13b201d 100644 --- a/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_kernel_2_tests.cpp @@ -624,56 +624,13 @@ HWCMDTEST_P(IGFX_GEN8_CORE, EnqueueKernelPrintfTest, GivenKernelWithPrintfBlocke } HWTEST_P(EnqueueKernelPrintfTest, GivenKernelWithPrintfBlockedByEventWhenEventUnblockedThenOutputPrinted) { - testing::internal::CaptureStdout(); - - auto userEvent = make_releaseable(context); - - MockKernelWithInternals mockKernel(*pClDevice); - mockKernel.kernelInfo.setPrintfSurface(sizeof(uintptr_t), 0); - std::string testString = "test"; - mockKernel.kernelInfo.addToPrintfStringsMap(0, testString); - - cl_uint workDim = 1; - size_t globalWorkOffset[3] = {0, 0, 0}; - - FillValues(); - - cl_event blockedEvent = userEvent.get(); - cl_event outEvent{}; - auto retVal = pCmdQ->enqueueKernel( - mockKernel, - workDim, - globalWorkOffset, - globalWorkSize, - localWorkSize, - 1, - &blockedEvent, - &outEvent); - - ASSERT_EQ(CL_SUCCESS, retVal); - - auto pOutEvent = castToObject(outEvent); - - auto printfAllocation = reinterpret_cast(static_cast(pOutEvent->peekCommand())->peekPrintfHandler()->getSurface()->getUnderlyingBuffer()); - printfAllocation[0] = 8; - printfAllocation[1] = 0; - - pOutEvent->release(); - - userEvent->setStatus(CL_COMPLETE); - - std::string output = testing::internal::GetCapturedStdout(); - EXPECT_STREQ("test", output.c_str()); -} - -HWTEST_P(EnqueueKernelPrintfTest, GivenKernelWithImplicitArgsWhenEventUnblockedThenOutputPrinted) { auto userEvent = make_releaseable(context); MockKernelWithInternals mockKernel(*pClDevice); std::string testString = "test"; mockKernel.kernelInfo.addToPrintfStringsMap(0, testString); mockKernel.kernelInfo.kernelDescriptor.kernelAttributes.flags.usesPrintf = false; - mockKernel.kernelInfo.kernelDescriptor.kernelAttributes.flags.usesStringMapForPrintf = false; + mockKernel.kernelInfo.kernelDescriptor.kernelAttributes.flags.usesStringMapForPrintf = true; mockKernel.mockKernel->pImplicitArgs = std::make_unique(); *mockKernel.mockKernel->pImplicitArgs = {};