diff --git a/level_zero/core/source/module/module_imp.cpp b/level_zero/core/source/module/module_imp.cpp index bfbd07472d..41fc3f01c6 100644 --- a/level_zero/core/source/module/module_imp.cpp +++ b/level_zero/core/source/module/module_imp.cpp @@ -52,6 +52,7 @@ NEO::ConstStringRef hasBufferOffsetArg = "-ze-intel-has-buffer-offset-arg"; NEO::ConstStringRef debugKernelEnable = "-ze-kernel-debug-enable"; NEO::ConstStringRef profileFlags = "-zet-profile-flags"; NEO::ConstStringRef optLargeRegisterFile = "-ze-opt-large-register-file"; +NEO::ConstStringRef optAutoGrf = "-ze-intel-enable-auto-large-GRF-mode"; } // namespace BuildOptions ModuleTranslationUnit::ModuleTranslationUnit(L0::Device *device) @@ -691,12 +692,15 @@ void ModuleImp::createBuildOptions(const char *pBuildFlags, std::string &apiOpti std::string buildFlags(pBuildFlags); apiOptions = pBuildFlags; + NEO::CompilerOptions::applyAdditionalApiOptions(apiOptions); + moveBuildOption(apiOptions, apiOptions, NEO::CompilerOptions::optDisable, BuildOptions::optDisable); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::greaterThan4gbBuffersRequired, BuildOptions::greaterThan4GbRequired); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::allowZebin, NEO::CompilerOptions::allowZebin); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::largeGrf, BuildOptions::optLargeRegisterFile); + moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::autoGrf, BuildOptions::optAutoGrf); - NEO::CompilerOptions::applyAdditionalOptions(internalBuildOptions); + NEO::CompilerOptions::applyAdditionalInternalOptions(internalBuildOptions); moveOptLevelOption(apiOptions, apiOptions); moveProfileFlagsOption(apiOptions, apiOptions); diff --git a/level_zero/core/source/module/module_imp.h b/level_zero/core/source/module/module_imp.h index 4766aebade..e02b594ba3 100644 --- a/level_zero/core/source/module/module_imp.h +++ b/level_zero/core/source/module/module_imp.h @@ -34,6 +34,7 @@ extern NEO::ConstStringRef hasBufferOffsetArg; extern NEO::ConstStringRef debugKernelEnable; extern NEO::ConstStringRef profileFlags; extern NEO::ConstStringRef optLargeRegisterFile; +extern NEO::ConstStringRef optAutoGrf; } // namespace BuildOptions diff --git a/level_zero/core/test/unit_tests/sources/module/test_module_2.cpp b/level_zero/core/test/unit_tests/sources/module/test_module_2.cpp index 89cdaefd65..550e42e8b6 100644 --- a/level_zero/core/test/unit_tests/sources/module/test_module_2.cpp +++ b/level_zero/core/test/unit_tests/sources/module/test_module_2.cpp @@ -60,6 +60,17 @@ TEST_F(ModuleTests, WhenCreatingBuildOptionsThenOptionsParsedCorrectly) { delete module; } +TEST_F(ModuleTests, whenCreatingAutoGrfBuildOptionsThenOptionsParsedCorrectly) { + ModuleImp module(device, nullptr, ModuleType::User); + + std::string buildOptions; + std::string internalBuildOptions; + + module.createBuildOptions(BuildOptions::optAutoGrf.data(), buildOptions, internalBuildOptions); + + EXPECT_TRUE(NEO::CompilerOptions::contains(internalBuildOptions, NEO::CompilerOptions::autoGrf)); +} + TEST(ModuleBuildLog, WhenCreatingModuleBuildLogThenNonNullPointerReturned) { auto moduleBuildLog = ModuleBuildLog::create(); ASSERT_NE(nullptr, moduleBuildLog); @@ -299,6 +310,35 @@ TEST_F(ModuleTests, givenLargeGrfFlagSetWhenCreatingModuleThenOverrideInternalFl EXPECT_EQ(pMockCompilerInterface->inputInternalOptions.find("-cl-intel-128-GRF-per-thread"), std::string::npos); } +TEST_F(ModuleTests, givenAutoGrfFlagSetWhenCreatingModuleThenOverrideInternalFlags) { + DebugManagerStateRestore restorer; + DebugManager.flags.ForceAutoGrfCompilationMode.set(1); + + auto pMockCompilerInterface = new MockCompilerInterface; + auto &rootDeviceEnvironment = this->neoDevice->executionEnvironment->rootDeviceEnvironments[this->neoDevice->getRootDeviceIndex()]; + rootDeviceEnvironment->compilerInterface.reset(pMockCompilerInterface); + + auto zebinData = std::make_unique(device->getHwInfo()); + const auto &src = zebinData->storage; + + ze_module_desc_t moduleDesc = {}; + moduleDesc.format = ZE_MODULE_FORMAT_IL_SPIRV; + moduleDesc.pInputModule = src.data(); + moduleDesc.inputSize = src.size(); + + auto mockTranslationUnit = new MockModuleTranslationUnit(device); + Module module(device, nullptr, ModuleType::User); + + module.translationUnit.reset(mockTranslationUnit); + + ze_result_t result = ZE_RESULT_ERROR_MODULE_BUILD_FAILURE; + result = module.initialize(&moduleDesc, neoDevice); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + + EXPECT_NE(pMockCompilerInterface->receivedApiOptions.find("-cl-intel-enable-auto-large-GRF-mode"), std::string::npos); + EXPECT_EQ(pMockCompilerInterface->receivedApiOptions.find("-cl-intel-256-GRF-per-thread"), std::string::npos); +} + TEST_F(ModuleTests, givenDefaultGrfFlagSetWhenCreatingModuleThenOverrideInternalFlags) { DebugManagerStateRestore restorer; DebugManager.flags.ForceDefaultGrfCompilationMode.set(true); diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index 3aa218d4bb..80c3a98627 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -65,7 +65,8 @@ cl_int Program::build( const bool shouldSuppressRebuildWarning{CompilerOptions::extract(CompilerOptions::noRecompiledFromIr, options)}; extractInternalOptions(options, internalOptions); - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalApiOptions(options); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); CompilerInterface *pCompilerInterface = defaultDevice.getCompilerInterface(); if (!pCompilerInterface) { diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index 6442679d3b..0ff8a90ff8 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -493,6 +493,7 @@ void Program::prependFilePathToOptions(const std::string &filename) { const std::vector Program::internalOptionsToExtract = {CompilerOptions::gtpinRera, CompilerOptions::defaultGrf, CompilerOptions::largeGrf, + CompilerOptions::autoGrf, CompilerOptions::greaterThan4gbBuffersRequired, CompilerOptions::numThreadsPerEu}; diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index 143f3b873c..ad291dd15c 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -3262,14 +3262,30 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceLargeGrfCompilationModeIs MockProgram program(toClDeviceVector(device)); auto internalOptions = program.getInternalOptions(); EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; size_t internalOptionsSize = internalOptions.size(); - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_EQ(internalOptionsSize, internalOptions.size()); } +TEST(ProgramInternalOptionsTests, givenProgramWhenForceAutoGrfCompilationModeIsSetThenBuildOptionIsAdded) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.ForceAutoGrfCompilationMode.set(1); + + MockClDevice device{new MockDevice()}; + MockProgram program(toClDeviceVector(device)); + auto options = program.getOptions(); + EXPECT_FALSE(CompilerOptions::contains(options, CompilerOptions::autoGrf)) << options; + CompilerOptions::applyAdditionalApiOptions(options); + EXPECT_TRUE(CompilerOptions::contains(options, CompilerOptions::autoGrf)) << options; + + size_t optionsSize = options.size(); + CompilerOptions::applyAdditionalApiOptions(options); + EXPECT_EQ(optionsSize, options.size()); +} + TEST(ProgramInternalOptionsTests, givenProgramWhenForceDefaultGrfCompilationModeIsSetThenBuildOptionIsAdded) { DebugManagerStateRestore stateRestorer; DebugManager.flags.ForceDefaultGrfCompilationMode.set(true); @@ -3278,11 +3294,11 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceDefaultGrfCompilationMode MockProgram program(toClDeviceVector(device)); auto internalOptions = program.getInternalOptions(); EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; size_t internalOptionsSize = internalOptions.size(); - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_EQ(internalOptionsSize, internalOptions.size()); } @@ -3297,12 +3313,12 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceDefaultGrfCompilationMode EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; size_t internalOptionsSize = internalOptions.size(); - CompilerOptions::applyAdditionalOptions(internalOptions); + CompilerOptions::applyAdditionalInternalOptions(internalOptions); EXPECT_EQ(internalOptionsSize, internalOptions.size()); } diff --git a/shared/source/compiler_interface/compiler_options.cpp b/shared/source/compiler_interface/compiler_options.cpp index 68df9ea68d..8661a92bff 100644 --- a/shared/source/compiler_interface/compiler_options.cpp +++ b/shared/source/compiler_interface/compiler_options.cpp @@ -57,7 +57,7 @@ TokenizedString tokenize(ConstStringRef src, char sperator) { return ret; }; -void applyAdditionalOptions(std::string &internalOptions) { +void applyAdditionalInternalOptions(std::string &internalOptions) { size_t pos; if (DebugManager.flags.ForceLargeGrfCompilationMode.get()) { pos = internalOptions.find(CompilerOptions::largeGrf.data()); @@ -76,5 +76,19 @@ void applyAdditionalOptions(std::string &internalOptions) { } } +void applyAdditionalApiOptions(std::string &apiOptions) { + size_t pos; + if (DebugManager.flags.ForceAutoGrfCompilationMode.get() == 1) { + pos = apiOptions.find(CompilerOptions::autoGrf.data()); + if (pos == std::string::npos) { + CompilerOptions::concatenateAppend(apiOptions, CompilerOptions::autoGrf); + } + pos = apiOptions.find(CompilerOptions::largeGrf.data()); + if (pos != std::string::npos) { + apiOptions.erase(pos, CompilerOptions::largeGrf.size()); + } + } +} + } // namespace CompilerOptions } // namespace NEO diff --git a/shared/source/compiler_interface/compiler_options.h b/shared/source/compiler_interface/compiler_options.h index 281130885f..7a71d0a536 100644 --- a/shared/source/compiler_interface/compiler_options.h +++ b/shared/source/compiler_interface/compiler_options.h @@ -42,6 +42,7 @@ constexpr ConstStringRef excludeIrFromZebin = "-exclude-ir-from-zebin"; constexpr ConstStringRef noRecompiledFromIr = "-Wno-recompiled-from-ir"; constexpr ConstStringRef defaultGrf = "-cl-intel-128-GRF-per-thread"; constexpr ConstStringRef largeGrf = "-cl-intel-256-GRF-per-thread"; +constexpr ConstStringRef autoGrf = "-cl-intel-enable-auto-large-GRF-mode"; constexpr ConstStringRef numThreadsPerEu = "-cl-intel-reqd-eu-thread-count"; constexpr ConstStringRef useCMCompiler = "-cmc"; @@ -183,6 +184,7 @@ std::string wrapInQuotes(const std::string &stringToWrap); using TokenizedString = StackVec; TokenizedString tokenize(ConstStringRef src, char sperator = ' '); -void applyAdditionalOptions(std::string &internalOptions); +void applyAdditionalInternalOptions(std::string &internalOptions); +void applyAdditionalApiOptions(std::string &apiOptions); } // namespace CompilerOptions } // namespace NEO diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 674b927265..a7f2ce3d5e 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -462,6 +462,7 @@ DECLARE_DEBUG_VARIABLE(bool, ForceAllResourcesUncached, false, "When set, all me DECLARE_DEBUG_VARIABLE(bool, EnableDebuggerMmapMemoryAccess, false, "Mmap used to access memory by debug api, valid only on Linux OS") DECLARE_DEBUG_VARIABLE(bool, ForceDefaultGrfCompilationMode, false, "Adds build option -cl-intel-128-GRF-per-thread to force kernel compilation in Default-GRF mode") DECLARE_DEBUG_VARIABLE(bool, ForceLargeGrfCompilationMode, false, "Adds build option -cl-intel-256-GRF-per-thread to force kernel compilation in Large-GRF mode") +DECLARE_DEBUG_VARIABLE(int32_t, ForceAutoGrfCompilationMode, -1, "Adds build option -*-intel-enable-auto-large-GRF-mode to force kernel compilation") DECLARE_DEBUG_VARIABLE(int32_t, ForceOCLVersion, 0, "Force specific OpenCL API version") DECLARE_DEBUG_VARIABLE(int32_t, ForceOCL21FeaturesSupport, -1, "-1: default, 0: disable, 1:enable. Force support of OpenCL 2.0 and OpenCL 2.1 API features") DECLARE_DEBUG_VARIABLE(int32_t, ForcePreemptionMode, -1, "Keep this variable in sync with PreemptionMode enum. -1 - devices default mode, 1 - disable, 2 - midBatch, 3 - threadGroup, 4 - midThread") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 0247ed4a83..72c0fbd229 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -482,4 +482,5 @@ ExperimentalSmallBufferPoolAllocator = -1 ForceZeDeviceCanAccessPerReturnValue = -1 AdjustThreadGroupDispatchSize = -1 ForceNonblockingExecbufferCalls = -1 -UseHighAlignmentForHeapExtended = -1 \ No newline at end of file +UseHighAlignmentForHeapExtended = -1 +ForceAutoGrfCompilationMode = -1 \ No newline at end of file