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));