From ceda3f65c2c364671e818e97627df91baf7cbee9 Mon Sep 17 00:00:00 2001 From: "Kopryk, Kamil" Date: Thu, 22 Dec 2022 16:09:00 +0100 Subject: [PATCH] fix(zebin): pass disable zebin internal option when building vme program Signed-off-by: Kopryk, Kamil --- opencl/source/program/build.cpp | 2 ++ opencl/source/program/program.cpp | 21 ++++++++++++++ opencl/source/program/program.h | 1 + opencl/test/unit_test/mocks/mock_program.h | 1 + .../test/unit_test/program/program_tests.cpp | 28 +++++++++++++++++++ 5 files changed, 53 insertions(+) diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index 80c3a98627..28a82c5b67 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -74,6 +74,8 @@ cl_int Program::build( break; } + disableZebinIfVmeEnabled(options, internalOptions); + TranslationInput inputArgs = {IGC::CodeType::oclC, IGC::CodeType::oclGenBin}; if (createdFrom != CreatedFrom::SOURCE) { inputArgs.srcType = isSpirV ? IGC::CodeType::spirV : IGC::CodeType::llvmBc; diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index 11a9a9d88b..41d371189f 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -446,6 +446,27 @@ bool Program::containsVmeUsage(const std::vector &kernelInfos) con return false; } +void Program::disableZebinIfVmeEnabled(std::string &options, std::string &internalOptions) { + auto isVme = false; + const char *vmeOptions[] = {"cl_intel_device_side_advanced_vme_enable", + "cl_intel_device_side_avc_vme_enable", + "cl_intel_device_side_vme_enable"}; + for (auto vmeOption : vmeOptions) { + auto pos = options.find(vmeOption); + if (pos != std::string::npos) { + isVme = true; + break; + } + } + if (isVme) { + auto pos = options.find(CompilerOptions::allowZebin.str()); + if (pos != std::string::npos) { + options.erase(pos, pos + CompilerOptions::allowZebin.length()); + } + internalOptions += " " + CompilerOptions::disableZebin.str(); + } +} + bool Program::isValidCallback(void(CL_CALLBACK *funcNotify)(cl_program program, void *userData), void *userData) { return funcNotify != nullptr || userData == nullptr; } diff --git a/opencl/source/program/program.h b/opencl/source/program/program.h index 56f2f19099..7b31ef97e8 100644 --- a/opencl/source/program/program.h +++ b/opencl/source/program/program.h @@ -307,6 +307,7 @@ class Program : public BaseObject<_cl_program> { void setBuildStatusSuccess(const ClDeviceVector &deviceVector, cl_program_binary_type binaryType); bool containsVmeUsage(const std::vector &kernelInfos) const; + void disableZebinIfVmeEnabled(std::string &options, std::string &internalOptions); bool isSpirV = false; diff --git a/opencl/test/unit_test/mocks/mock_program.h b/opencl/test/unit_test/mocks/mock_program.h index 4087c468b5..c7c894bd68 100644 --- a/opencl/test/unit_test/mocks/mock_program.h +++ b/opencl/test/unit_test/mocks/mock_program.h @@ -52,6 +52,7 @@ class MockProgram : public Program { using Program::createdFrom; using Program::createProgramFromBinary; using Program::deviceBuildInfos; + using Program::disableZebinIfVmeEnabled; using Program::extractInternalOptions; using Program::getKernelInfo; using Program::internalOptionsToExtract; diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index 517f62f237..61cd146455 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -3379,6 +3379,34 @@ TEST(ProgramVmeUsage, givenVmeUsageWhenContainsVmeUsageIsCalledThenReturnTrue) { } } +TEST(ProgramVmeUsage, givenVmeOptionsWhenDisableZebinIfVmeEnabledIsCalledThenZebinIsDisabled) { + MockClDevice device{new MockDevice()}; + MockProgram program(toClDeviceVector(device)); + + { + std::string options = CompilerOptions::allowZebin.str(); + std::string internalOptions = ""; + program.disableZebinIfVmeEnabled(options, internalOptions); + EXPECT_TRUE(CompilerOptions::contains(options, CompilerOptions::allowZebin)); + EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::disableZebin)); + } + + { + std::string options = CompilerOptions::allowZebin.str() + " cl_intel_device_side_vme_enable"; + std::string internalOptions = ""; + program.disableZebinIfVmeEnabled(options, internalOptions); + EXPECT_FALSE(CompilerOptions::contains(options, CompilerOptions::allowZebin)); + EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::disableZebin)); + } + { + std::string options = "cl_intel_device_side_vme_enable"; + std::string internalOptions = ""; + program.disableZebinIfVmeEnabled(options, internalOptions); + EXPECT_FALSE(CompilerOptions::contains(options, CompilerOptions::allowZebin)); + EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::disableZebin)); + } +} + TEST(ProgramPopulateZebinExtendedArgsMetadataTests, givenZebinaryFormatAndDecodeErrorOnDecodingArgsMetadataWhenCallingPopulateZebinExtendedArgsMetadataThenMetadataIsNotPopulated) { MockClDevice device{new MockDevice()}; MockProgram program(toClDeviceVector(device));