L0: GRF mode debug flags support

Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz 2022-09-22 13:18:52 +00:00 committed by Compute-Runtime-Automation
parent 3e01915e61
commit b2001bf265
9 changed files with 88 additions and 45 deletions

View File

@ -743,6 +743,8 @@ void ModuleImp::createBuildOptions(const char *pBuildFlags, std::string &apiOpti
moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::allowZebin, NEO::CompilerOptions::allowZebin); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::allowZebin, NEO::CompilerOptions::allowZebin);
moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::largeGrf, BuildOptions::optLargeRegisterFile); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::largeGrf, BuildOptions::optLargeRegisterFile);
NEO::CompilerOptions::applyAdditionalOptions(internalBuildOptions);
moveOptLevelOption(apiOptions, apiOptions); moveOptLevelOption(apiOptions, apiOptions);
moveProfileFlagsOption(apiOptions, apiOptions); moveProfileFlagsOption(apiOptions, apiOptions);
this->libraryExportRequired = moveBuildOption(apiOptions, apiOptions, BuildOptions::enableLibraryCompile, BuildOptions::enableLibraryCompile); this->libraryExportRequired = moveBuildOption(apiOptions, apiOptions, BuildOptions::enableLibraryCompile, BuildOptions::enableLibraryCompile);

View File

@ -270,5 +270,61 @@ TEST_F(ModuleOnlineCompiled, GivenKernelThenCorrectAttributesAreReturned) {
free(attributes); free(attributes);
} }
TEST_F(ModuleTests, givenLargeGrfFlagSetWhenCreatingModuleThenOverrideInternalFlags) {
DebugManagerStateRestore restorer;
DebugManager.flags.ForceLargeGrfCompilationMode.set(true);
auto pMockCompilerInterface = new MockCompilerInterface;
auto &rootDeviceEnvironment = this->neoDevice->executionEnvironment->rootDeviceEnvironments[this->neoDevice->getRootDeviceIndex()];
rootDeviceEnvironment->compilerInterface.reset(pMockCompilerInterface);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(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);
bool success = module.initialize(&moduleDesc, neoDevice);
EXPECT_TRUE(success);
EXPECT_NE(pMockCompilerInterface->inputInternalOptions.find("-cl-intel-256-GRF-per-thread"), std::string::npos);
EXPECT_EQ(pMockCompilerInterface->inputInternalOptions.find("-cl-intel-128-GRF-per-thread"), std::string::npos);
}
TEST_F(ModuleTests, givenDefaultGrfFlagSetWhenCreatingModuleThenOverrideInternalFlags) {
DebugManagerStateRestore restorer;
DebugManager.flags.ForceDefaultGrfCompilationMode.set(true);
auto pMockCompilerInterface = new MockCompilerInterface;
auto &rootDeviceEnvironment = this->neoDevice->executionEnvironment->rootDeviceEnvironments[this->neoDevice->getRootDeviceIndex()];
rootDeviceEnvironment->compilerInterface.reset(pMockCompilerInterface);
auto zebinData = std::make_unique<ZebinTestData::ZebinWithL0TestCommonModule>(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);
bool success = module.initialize(&moduleDesc, neoDevice);
EXPECT_TRUE(success);
EXPECT_EQ(pMockCompilerInterface->inputInternalOptions.find("-cl-intel-256-GRF-per-thread"), std::string::npos);
EXPECT_NE(pMockCompilerInterface->inputInternalOptions.find("-cl-intel-128-GRF-per-thread"), std::string::npos);
}
} // namespace ult } // namespace ult
} // namespace L0 } // namespace L0

View File

@ -65,7 +65,7 @@ cl_int Program::build(
const bool shouldSuppressRebuildWarning{CompilerOptions::extract(CompilerOptions::noRecompiledFromIr, options)}; const bool shouldSuppressRebuildWarning{CompilerOptions::extract(CompilerOptions::noRecompiledFromIr, options)};
extractInternalOptions(options, internalOptions); extractInternalOptions(options, internalOptions);
applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
CompilerInterface *pCompilerInterface = defaultDevice.getCompilerInterface(); CompilerInterface *pCompilerInterface = defaultDevice.getCompilerInterface();
if (!pCompilerInterface) { if (!pCompilerInterface) {

View File

@ -498,25 +498,6 @@ void Program::prependFilePathToOptions(const std::string &filename) {
} }
} }
void Program::applyAdditionalOptions(std::string &internalOptions) {
size_t pos;
if (DebugManager.flags.ForceLargeGrfCompilationMode.get()) {
pos = internalOptions.find(CompilerOptions::largeGrf.data());
if (pos == std::string::npos) {
CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::largeGrf);
}
} else if (DebugManager.flags.ForceDefaultGrfCompilationMode.get()) {
pos = internalOptions.find(CompilerOptions::defaultGrf.data());
if (pos == std::string::npos) {
CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::defaultGrf.data());
}
pos = internalOptions.find(CompilerOptions::largeGrf.data());
if (pos != std::string::npos) {
internalOptions.erase(pos, CompilerOptions::largeGrf.size());
}
}
}
const std::vector<ConstStringRef> Program::internalOptionsToExtract = {CompilerOptions::gtpinRera, const std::vector<ConstStringRef> Program::internalOptionsToExtract = {CompilerOptions::gtpinRera,
CompilerOptions::defaultGrf, CompilerOptions::defaultGrf,
CompilerOptions::largeGrf, CompilerOptions::largeGrf,

View File

@ -305,7 +305,6 @@ class Program : public BaseObject<_cl_program> {
void extractInternalOptions(const std::string &options, std::string &internalOptions); void extractInternalOptions(const std::string &options, std::string &internalOptions);
MOCKABLE_VIRTUAL bool isFlagOption(ConstStringRef option); MOCKABLE_VIRTUAL bool isFlagOption(ConstStringRef option);
MOCKABLE_VIRTUAL bool isOptionValueValid(ConstStringRef option, ConstStringRef value); MOCKABLE_VIRTUAL bool isOptionValueValid(ConstStringRef option, ConstStringRef value);
MOCKABLE_VIRTUAL void applyAdditionalOptions(std::string &internalOptions);
MOCKABLE_VIRTUAL bool appendKernelDebugOptions(ClDevice &clDevice, std::string &internalOptions); MOCKABLE_VIRTUAL bool appendKernelDebugOptions(ClDevice &clDevice, std::string &internalOptions);
void notifyDebuggerWithSourceCode(ClDevice &clDevice, std::string &filename); void notifyDebuggerWithSourceCode(ClDevice &clDevice, std::string &filename);

View File

@ -28,7 +28,6 @@ ClDeviceVector toClDeviceVector(ClDevice &clDevice);
class MockProgram : public Program { class MockProgram : public Program {
public: public:
using Program::allowNonUniform; using Program::allowNonUniform;
using Program::applyAdditionalOptions;
using Program::areSpecializationConstantsInitialized; using Program::areSpecializationConstantsInitialized;
using Program::buildInfos; using Program::buildInfos;
using Program::context; using Program::context;

View File

@ -2693,23 +2693,6 @@ TEST_F(ProgramTests, GivenInjectInternalBuildOptionsWhenCompilingBuiltInProgramT
EXPECT_FALSE(CompilerOptions::contains(cip->buildInternalOptions, "-abc")) << cip->buildInternalOptions; EXPECT_FALSE(CompilerOptions::contains(cip->buildInternalOptions, "-abc")) << cip->buildInternalOptions;
} }
class AdditionalOptionsMockProgram : public MockProgram {
public:
using MockProgram::MockProgram;
void applyAdditionalOptions(std::string &internalOptions) override {
applyAdditionalOptionsCalled++;
MockProgram::applyAdditionalOptions(internalOptions);
}
uint32_t applyAdditionalOptionsCalled = 0;
};
TEST_F(ProgramTests, givenProgramWhenBuiltThenAdditionalOptionsAreApplied) {
AdditionalOptionsMockProgram program(toClDeviceVector(*pClDevice));
program.build(program.getDevices(), nullptr, false);
EXPECT_EQ(1u, program.applyAdditionalOptionsCalled);
}
TEST(CreateProgramFromBinaryTests, givenBinaryProgramBuiltInWhenKernelRebulildIsForcedThenDeviceBinaryIsNotUsed) { TEST(CreateProgramFromBinaryTests, givenBinaryProgramBuiltInWhenKernelRebulildIsForcedThenDeviceBinaryIsNotUsed) {
DebugManagerStateRestore dbgRestorer; DebugManagerStateRestore dbgRestorer;
DebugManager.flags.RebuildPrecompiledKernels.set(true); DebugManager.flags.RebuildPrecompiledKernels.set(true);
@ -3368,11 +3351,11 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceLargeGrfCompilationModeIs
MockProgram program(toClDeviceVector(device)); MockProgram program(toClDeviceVector(device));
auto internalOptions = program.getInternalOptions(); auto internalOptions = program.getInternalOptions();
EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions;
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions;
size_t internalOptionsSize = internalOptions.size(); size_t internalOptionsSize = internalOptions.size();
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_EQ(internalOptionsSize, internalOptions.size()); EXPECT_EQ(internalOptionsSize, internalOptions.size());
} }
@ -3384,11 +3367,11 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceDefaultGrfCompilationMode
MockProgram program(toClDeviceVector(device)); MockProgram program(toClDeviceVector(device));
auto internalOptions = program.getInternalOptions(); auto internalOptions = program.getInternalOptions();
EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions;
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions;
size_t internalOptionsSize = internalOptions.size(); size_t internalOptionsSize = internalOptions.size();
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_EQ(internalOptionsSize, internalOptions.size()); EXPECT_EQ(internalOptionsSize, internalOptions.size());
} }
@ -3403,11 +3386,11 @@ TEST(ProgramInternalOptionsTests, givenProgramWhenForceDefaultGrfCompilationMode
EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions;
EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions;
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions; EXPECT_TRUE(CompilerOptions::contains(internalOptions, CompilerOptions::defaultGrf)) << internalOptions;
EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions; EXPECT_FALSE(CompilerOptions::contains(internalOptions, CompilerOptions::largeGrf)) << internalOptions;
size_t internalOptionsSize = internalOptions.size(); size_t internalOptionsSize = internalOptions.size();
program.applyAdditionalOptions(internalOptions); CompilerOptions::applyAdditionalOptions(internalOptions);
EXPECT_EQ(internalOptionsSize, internalOptions.size()); EXPECT_EQ(internalOptionsSize, internalOptions.size());
} }

View File

@ -7,6 +7,8 @@
#include "shared/source/compiler_interface/compiler_options.h" #include "shared/source/compiler_interface/compiler_options.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include <cstring> #include <cstring>
namespace NEO { namespace NEO {
@ -50,5 +52,24 @@ TokenizedString tokenize(ConstStringRef src, char sperator) {
return ret; return ret;
}; };
void applyAdditionalOptions(std::string &internalOptions) {
size_t pos;
if (DebugManager.flags.ForceLargeGrfCompilationMode.get()) {
pos = internalOptions.find(CompilerOptions::largeGrf.data());
if (pos == std::string::npos) {
CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::largeGrf);
}
} else if (DebugManager.flags.ForceDefaultGrfCompilationMode.get()) {
pos = internalOptions.find(CompilerOptions::defaultGrf.data());
if (pos == std::string::npos) {
CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::defaultGrf.data());
}
pos = internalOptions.find(CompilerOptions::largeGrf.data());
if (pos != std::string::npos) {
internalOptions.erase(pos, CompilerOptions::largeGrf.size());
}
}
}
} // namespace CompilerOptions } // namespace CompilerOptions
} // namespace NEO } // namespace NEO

View File

@ -179,5 +179,7 @@ bool contains(const std::string &options, ConstStringRef optionToFind);
using TokenizedString = StackVec<ConstStringRef, 32>; using TokenizedString = StackVec<ConstStringRef, 32>;
TokenizedString tokenize(ConstStringRef src, char sperator = ' '); TokenizedString tokenize(ConstStringRef src, char sperator = ' ');
void applyAdditionalOptions(std::string &internalOptions);
} // namespace CompilerOptions } // namespace CompilerOptions
} // namespace NEO } // namespace NEO