Correct setting usesStringMap flag in printf

This commit fixes setting usesStringMap flag for printf, taking into
account using indirect functions in legacy (non-zebinary) path. It also
adds new field to kernelDescriptor, specifying the binary type
(legacy/zebin).

Related-To: NEO-6604
Signed-off-by: Kacper Nowak <kacper.nowak@intel.com>
This commit is contained in:
Kacper Nowak
2022-02-14 16:05:39 +00:00
committed by Compute-Runtime-Automation
parent 143f67f2fe
commit cd9cc53159
10 changed files with 105 additions and 6 deletions

View File

@@ -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;
auto usesStringMap = kernelData->getDescriptor().kernelAttributes.usesStringMap();
NEO::PrintFormatter printfFormatter{
static_cast<uint8_t *>(printfBuffer->getUnderlyingBuffer()),
static_cast<uint32_t>(printfBuffer->getUnderlyingBufferSize()),

View File

@@ -2187,14 +2187,15 @@ TEST_F(PrintfTest, WhenCreatingPrintfBufferThenCrossThreadDataIsPatched) {
mockKernel.crossThreadData.release();
}
using KernelPrintfStringMapTests = Test<ModuleImmutableDataFixture>;
using KernelPatchtokensPrintfStringMapTests = Test<ModuleImmutableDataFixture>;
TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageEnabledWhenPrintOutputThenProperStringIsPrinted) {
TEST_F(KernelPatchtokensPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageEnabledWhenPrintOutputThenProperStringIsPrinted) {
std::unique_ptr<MockImmutableData> mockKernelImmData = std::make_unique<MockImmutableData>(0u);
auto kernelDescriptor = mockKernelImmData->kernelDescriptor;
kernelDescriptor->kernelAttributes.flags.usesPrintf = true;
kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = true;
kernelDescriptor->kernelAttributes.binaryFormat = DeviceBinaryFormat::Patchtokens;
std::string expectedString("test123");
kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString));
@@ -2215,12 +2216,14 @@ TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageEnabledWh
EXPECT_STREQ(expectedString.c_str(), output.c_str());
}
TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageDisabledWhenPrintOutputThenNothingIsPrinted) {
TEST_F(KernelPatchtokensPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageDisabledAndNoImplicitArgsWhenPrintOutputThenNothingIsPrinted) {
std::unique_ptr<MockImmutableData> mockKernelImmData = std::make_unique<MockImmutableData>(0u);
auto kernelDescriptor = mockKernelImmData->kernelDescriptor;
kernelDescriptor->kernelAttributes.flags.usesPrintf = true;
kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = false;
kernelDescriptor->kernelAttributes.flags.requiresImplicitArgs = false;
kernelDescriptor->kernelAttributes.binaryFormat = DeviceBinaryFormat::Patchtokens;
std::string expectedString("test123");
kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString));
@@ -2241,6 +2244,34 @@ TEST_F(KernelPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageDisabledW
EXPECT_STREQ("", output.c_str());
}
TEST_F(KernelPatchtokensPrintfStringMapTests, givenKernelWithPrintfStringsMapUsageDisabledAndWithImplicitArgsWhenPrintOutputThenOutputIsPrinted) {
std::unique_ptr<MockImmutableData> mockKernelImmData = std::make_unique<MockImmutableData>(0u);
auto kernelDescriptor = mockKernelImmData->kernelDescriptor;
kernelDescriptor->kernelAttributes.flags.usesPrintf = true;
kernelDescriptor->kernelAttributes.flags.usesStringMapForPrintf = false;
kernelDescriptor->kernelAttributes.flags.requiresImplicitArgs = true;
kernelDescriptor->kernelAttributes.binaryFormat = DeviceBinaryFormat::Patchtokens;
std::string expectedString("test123");
kernelDescriptor->kernelMetadata.printfStringsMap.insert(std::make_pair(0u, expectedString));
createModuleFromBinary(0u, false, mockKernelImmData.get());
auto kernel = std::make_unique<MockKernel>(module.get());
ze_kernel_desc_t kernelDesc{ZE_STRUCTURE_TYPE_KERNEL_DESC};
kernel->initialize(&kernelDesc);
auto printfAllocation = reinterpret_cast<uint32_t *>(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());
}
using KernelImplicitArgTests = Test<ModuleImmutableDataFixture>;
TEST_F(KernelImplicitArgTests, givenKernelWithImplicitArgsWhenInitializeThenPrintfSurfaceIsCreatedAndProperlyPatchedInImplicitArgs) {