Skip to content

Commit 9aa1ead

Browse files
Recompile L0 builtins from intermediates when debug flag is enabled
Related-To: NEO-5020 Change-Id: I7c92ad6ff5bdbe19a25503385fe270e7d5dd330e Signed-off-by: Konstanty Misiak <konstanty.misiak@intel.com>
1 parent e56a38d commit 9aa1ead

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

level_zero/core/source/builtin/builtin_functions_lib_impl.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,16 @@ Kernel *BuiltinFunctionsLibImpl::getPageFaultFunction() {
146146
}
147147

148148
std::unique_ptr<BuiltinFunctionsLibImpl::BuiltinData> BuiltinFunctionsLibImpl::loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) {
149-
auto builtInCode = builtInsLib->getBuiltinsLib().getBuiltinCode(builtin, NEO::BuiltinCode::ECodeType::Binary, *device->getNEODevice());
149+
using BuiltInCodeType = NEO::BuiltinCode::ECodeType;
150+
151+
auto builtInCodeType = NEO::DebugManager.flags.RebuildPrecompiledKernels.get() ? BuiltInCodeType::Intermediate : BuiltInCodeType::Binary;
152+
auto builtInCode = builtInsLib->getBuiltinsLib().getBuiltinCode(builtin, builtInCodeType, *device->getNEODevice());
150153

151154
ze_result_t res;
152155
std::unique_ptr<Module> module;
153156
ze_module_handle_t moduleHandle;
154157
ze_module_desc_t moduleDesc = {};
155-
moduleDesc.format = ZE_MODULE_FORMAT_NATIVE;
158+
moduleDesc.format = builtInCode.type == BuiltInCodeType::Binary ? ZE_MODULE_FORMAT_NATIVE : ZE_MODULE_FORMAT_IL_SPIRV;
156159
moduleDesc.pInputModule = reinterpret_cast<uint8_t *>(&builtInCode.resource[0]);
157160
moduleDesc.inputSize = builtInCode.resource.size();
158161
res = device->createModule(&moduleDesc, &moduleHandle, nullptr);

level_zero/core/test/unit_tests/sources/builtin/builtin_functions_tests.cpp

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
#include "shared/source/built_ins/built_ins.h"
99
#include "shared/source/execution_environment/root_device_environment.h"
10+
#include "shared/test/unit_test/helpers/debug_manager_state_restore.h"
1011
#include "shared/test/unit_test/mocks/mock_compiler_interface.h"
1112

1213
#include "test.h"
1314

1415
#include "level_zero/core/source/builtin/builtin_functions_lib_impl.h"
1516
#include "level_zero/core/source/device/device_imp.h"
1617
#include "level_zero/core/source/module/module.h"
18+
#include "level_zero/core/source/module/module_imp.h"
1719
#include "level_zero/core/test/unit_tests/fixtures/device_fixture.h"
1820

1921
#include "gtest/gtest.h"
@@ -41,7 +43,7 @@ class TestBuiltinFunctionsLibImpl : public DeviceFixture, public testing::Test {
4143
std::unique_ptr<MockBuiltinFunctionsLibImpl> mockBuiltinFunctionsLibImpl;
4244
};
4345

44-
HWTEST_F(TestBuiltinFunctionsLibImpl, givenInitImageFunctionWhenImageBultinsTableConstainNullptrsAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {
46+
HWTEST_F(TestBuiltinFunctionsLibImpl, givenInitImageFunctionWhenImageBultinsTableContainNullptrsAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {
4547
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
4648
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]);
4749
}
@@ -54,7 +56,7 @@ HWTEST_F(TestBuiltinFunctionsLibImpl, givenInitImageFunctionWhenImageBultinsTabl
5456
}
5557
}
5658

57-
HWTEST_F(TestBuiltinFunctionsLibImpl, givenInitFunctionWhenBultinsTableConstainNullptrsThenBuiltinsFunctionsAreLoaded) {
59+
HWTEST_F(TestBuiltinFunctionsLibImpl, givenInitFunctionWhenBultinsTableContainNullptrsThenBuiltinsFunctionsAreLoaded) {
5860
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
5961
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
6062
}
@@ -84,5 +86,78 @@ HWTEST_F(TestBuiltinFunctionsLibImpl, givenCompilerInterfaceWhenCreateDeviceThen
8486
EXPECT_NE(nullptr, testDevice->getBuiltinFunctionsLib()->getFunction(static_cast<L0::Builtin>(builtId)));
8587
}
8688
}
89+
90+
HWTEST_F(TestBuiltinFunctionsLibImpl, givenRebuildPrecompiledKernelsDebugFlagWhenInitFuctionsThenIntermediateCodeForBuiltinsIsRequested) {
91+
struct MockDeviceForRebuildBuilins : public Mock<DeviceImp> {
92+
struct MockModuleForRebuildBuiltins : public ModuleImp {
93+
MockModuleForRebuildBuiltins(Device *device) : ModuleImp(device, nullptr) {}
94+
95+
ze_result_t createKernel(const ze_kernel_desc_t *desc,
96+
ze_kernel_handle_t *phFunction) override {
97+
*phFunction = nullptr;
98+
return ZE_RESULT_SUCCESS;
99+
}
100+
};
101+
102+
MockDeviceForRebuildBuilins(L0::Device *device) : Mock(device->getNEODevice(), static_cast<NEO::ExecutionEnvironment *>(device->getExecEnvironment())) {
103+
driverHandle = device->getDriverHandle();
104+
builtins = BuiltinFunctionsLib::create(this, neoDevice->getBuiltIns());
105+
}
106+
107+
ze_result_t createModule(const ze_module_desc_t *desc,
108+
ze_module_handle_t *module,
109+
ze_module_build_log_handle_t *buildLog) override {
110+
EXPECT_EQ(desc->format, ZE_MODULE_FORMAT_IL_SPIRV);
111+
EXPECT_GT(desc->inputSize, 0u);
112+
EXPECT_NE(desc->pInputModule, nullptr);
113+
wasCreatedModuleCalled = true;
114+
115+
*module = new MockModuleForRebuildBuiltins(this);
116+
117+
return ZE_RESULT_SUCCESS;
118+
}
119+
120+
bool wasCreatedModuleCalled = false;
121+
};
122+
123+
DebugManagerStateRestore dgbRestorer;
124+
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(true);
125+
MockDeviceForRebuildBuilins testDevice(device);
126+
127+
testDevice.getBuiltinFunctionsLib()->initFunctions();
128+
129+
EXPECT_TRUE(testDevice.wasCreatedModuleCalled);
130+
}
131+
132+
HWTEST_F(TestBuiltinFunctionsLibImpl, givenNotToRebuildPrecompiledKernelsDebugFlagWhenInitFuctionsThenNativeCodeForBuiltinsIsRequested) {
133+
struct MockDeviceForRebuildBuilins : public Mock<DeviceImp> {
134+
MockDeviceForRebuildBuilins(L0::Device *device) : Mock(device->getNEODevice(), static_cast<NEO::ExecutionEnvironment *>(device->getExecEnvironment())) {
135+
driverHandle = device->getDriverHandle();
136+
builtins = BuiltinFunctionsLib::create(this, neoDevice->getBuiltIns());
137+
}
138+
139+
ze_result_t createModule(const ze_module_desc_t *desc,
140+
ze_module_handle_t *module,
141+
ze_module_build_log_handle_t *buildLog) override {
142+
EXPECT_EQ(desc->format, ZE_MODULE_FORMAT_NATIVE);
143+
EXPECT_GT(desc->inputSize, 0u);
144+
EXPECT_NE(desc->pInputModule, nullptr);
145+
wasCreatedModuleCalled = true;
146+
147+
return DeviceImp::createModule(desc, module, buildLog);
148+
}
149+
150+
bool wasCreatedModuleCalled = false;
151+
};
152+
153+
DebugManagerStateRestore dgbRestorer;
154+
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(false);
155+
MockDeviceForRebuildBuilins testDevice(device);
156+
157+
testDevice.getBuiltinFunctionsLib()->initFunctions();
158+
159+
EXPECT_TRUE(testDevice.wasCreatedModuleCalled);
160+
}
161+
87162
} // namespace ult
88163
} // namespace L0

0 commit comments

Comments
 (0)