Defer builtin initialization until first use

Signed-off-by: Jaime Arteaga <jaime.a.arteaga.molina@intel.com>
This commit is contained in:
Jaime Arteaga
2021-01-30 00:32:30 +00:00
committed by Compute-Runtime-Automation
parent 06bcc67e38
commit 315146a43d
8 changed files with 215 additions and 138 deletions

View File

@@ -22,16 +22,19 @@ struct MockBuiltinFunctionsLibImpl : BuiltinFunctionsLibImpl {
dummyModule = std::unique_ptr<Module>(new Mock<Module>(device, nullptr));
dummyKernel->module = dummyModule.get();
}
void initFunctions() override {
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
void initBuiltinKernel(L0::Builtin func) override {
auto builtId = static_cast<uint32_t>(func);
if (builtins[builtId].get() == nullptr) {
builtins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBuffer, "copyBufferToBufferBytesSingle");
}
}
void initImageFunctions() override {
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
void initBuiltinImageKernel(L0::ImageBuiltin func) override {
auto builtId = static_cast<uint32_t>(func);
if (imageBuiltins[builtId].get() == nullptr) {
imageBuiltins[builtId] = loadBuiltIn(NEO::EBuiltInOps::CopyImage3dToBuffer, "CopyImage3dToBuffer16Bytes");
}
}
void initPageFaultFunction() override {
pageFaultBuiltin = loadBuiltIn(NEO::EBuiltInOps::CopyBufferToBuffer, "CopyBufferToBufferSideRegion");
}

View File

@@ -23,11 +23,24 @@ struct MockBuiltinFunctionsLibImplTimestamps : BuiltinFunctionsLibImpl {
using BuiltinFunctionsLibImpl::BuiltinFunctionsLibImpl;
void initFunctions() override {
builtins[0] = loadBuiltIn(NEO::EBuiltInOps::QueryKernelTimestamps, "QueryKernelTimestamps");
builtins[1] = loadBuiltIn(NEO::EBuiltInOps::QueryKernelTimestamps, "QueryKernelTimestampsWithOffsets");
void initBuiltinKernel(Builtin func) override {
switch (static_cast<Builtin>(func)) {
case Builtin::QueryKernelTimestamps:
if (builtins[0].get() == nullptr) {
builtins[0] = loadBuiltIn(NEO::EBuiltInOps::QueryKernelTimestamps, "QueryKernelTimestamps");
}
break;
case Builtin::QueryKernelTimestampsWithOffsets:
if (builtins[1].get() == nullptr) {
builtins[1] = loadBuiltIn(NEO::EBuiltInOps::QueryKernelTimestamps, "QueryKernelTimestampsWithOffsets");
}
break;
default:
break;
};
}
void initBuiltinImageKernel(ImageBuiltin func) override {
}
void initImageFunctions() override {}
void initPageFaultFunction() override {}

View File

@@ -30,6 +30,7 @@ class TestBuiltinFunctionsLibImpl : public DeviceFixture, public testing::Test {
using BuiltinFunctionsLibImpl::builtins;
using BuiltinFunctionsLibImpl::getFunction;
using BuiltinFunctionsLibImpl::imageBuiltins;
using BuiltinFunctionsLibImpl::pageFaultBuiltin;
MockBuiltinFunctionsLibImpl(L0::Device *device, NEO::BuiltIns *builtInsLib) : BuiltinFunctionsLibImpl(device, builtInsLib) {}
std::unique_ptr<BuiltinData> loadBuiltIn(NEO::EBuiltInOps::Type builtin, const char *builtInName) override {
ze_result_t res;
@@ -84,28 +85,61 @@ class TestBuiltinFunctionsLibImpl : public DeviceFixture, public testing::Test {
class TestBuiltinFunctionsLibImplDefault : public TestBuiltinFunctionsLibImpl<false> {};
class TestBuiltinFunctionsLibImplImages : public TestBuiltinFunctionsLibImpl<true> {};
HWTEST_F(TestBuiltinFunctionsLibImplImages, givenInitImageFunctionWhenImageBultinsTableContainNullptrsAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {
HWTEST_F(TestBuiltinFunctionsLibImplImages, givenImageSupportThenEachBuiltinImageFunctionsIsLoadedOnlyOnce) {
L0::Kernel *initializedImageBuiltins[static_cast<uint32_t>(ImageBuiltin::COUNT)];
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]);
}
if (mockDevicePtr.get()->getHwInfo().capabilityTable.supportsImages) {
mockBuiltinFunctionsLibImpl->initImageFunctions();
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]);
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getImageFunction(static_cast<L0::ImageBuiltin>(builtId)));
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]);
initializedImageBuiltins[builtId] = mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]->func.get();
}
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
EXPECT_EQ(initializedImageBuiltins[builtId],
mockBuiltinFunctionsLibImpl->getImageFunction(static_cast<L0::ImageBuiltin>(builtId)));
}
}
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenInitFunctionWhenBultinsTableContainNullptrsThenBuiltinsFunctionsAreLoaded) {
HWTEST_F(TestBuiltinFunctionsLibImplImages, givenImageSupportAndWrongIdWhenCallingBuiltinImageFunctionThenExceptionIsThrown) {
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(ImageBuiltin::COUNT); builtId++) {
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->imageBuiltins[builtId]);
}
if (mockDevicePtr.get()->getHwInfo().capabilityTable.supportsImages) {
uint32_t builtId = static_cast<uint32_t>(ImageBuiltin::COUNT) + 1;
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initBuiltinImageKernel(static_cast<L0::ImageBuiltin>(builtId)), std::exception);
}
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCallsToGetFunctionThenEachBuiltinFunctionsIsLoadedOnlyOnce) {
L0::Kernel *initializedBuiltins[static_cast<uint32_t>(Builtin::COUNT)];
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
}
mockBuiltinFunctionsLibImpl->initFunctions();
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
EXPECT_NE(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
initializedBuiltins[builtId] = mockBuiltinFunctionsLibImpl->builtins[builtId]->func.get();
}
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_EQ(initializedBuiltins[builtId],
mockBuiltinFunctionsLibImpl->getFunction(static_cast<L0::Builtin>(builtId)));
}
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCallToBuiltinFunctionWithWrongIdThenExceptionIsThrown) {
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->builtins[builtId]);
}
uint32_t builtId = static_cast<uint32_t>(Builtin::COUNT) + 1;
EXPECT_THROW(mockBuiltinFunctionsLibImpl->initBuiltinKernel(static_cast<L0::Builtin>(builtId)), std::exception);
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCompilerInterfaceWhenCreateDeviceAndImageSupportedThenBuiltinsImageFunctionsAreLoaded) {
@@ -119,6 +153,16 @@ HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCompilerInterfaceWhenCreateDev
}
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCallToPageFaultBuiltinFunctionThenBuiltinFunctionIsLoadedOnce) {
EXPECT_EQ(nullptr, mockBuiltinFunctionsLibImpl->pageFaultBuiltin);
L0::Kernel *initializedPageFaultBuiltin;
initializedPageFaultBuiltin = mockBuiltinFunctionsLibImpl->getPageFaultFunction();
EXPECT_NE(nullptr, initializedPageFaultBuiltin);
EXPECT_EQ(initializedPageFaultBuiltin, mockBuiltinFunctionsLibImpl->getPageFaultFunction());
}
HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenCompilerInterfaceWhenCreateDeviceThenBuiltinsFunctionsAreLoaded) {
neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[neoDevice->getRootDeviceIndex()]->compilerInterface.reset(new NEO::MockCompilerInterfaceSpirv());
std::unique_ptr<L0::Device> testDevice(Device::create(device->getDriverHandle(), neoDevice, std::numeric_limits<uint32_t>::max(), false));
@@ -165,7 +209,9 @@ HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenRebuildPrecompiledKernelsDebug
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(true);
MockDeviceForRebuildBuilins testDevice(device);
testDevice.builtins.reset(new BuiltinFunctionsLibImpl(&testDevice, neoDevice->getBuiltIns()));
testDevice.getBuiltinFunctionsLib()->initFunctions();
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
testDevice.getBuiltinFunctionsLib()->initBuiltinKernel(static_cast<Builtin>(builtId));
}
EXPECT_TRUE(testDevice.createModuleCalled);
}
@@ -196,7 +242,9 @@ HWTEST_F(TestBuiltinFunctionsLibImplDefault, givenNotToRebuildPrecompiledKernels
MockDeviceForRebuildBuilins testDevice(device);
L0::Device *testDevicePtr = &testDevice;
testDevice.builtins.reset(new BuiltinFunctionsLibImpl(testDevicePtr, neoDevice->getBuiltIns()));
testDevice.getBuiltinFunctionsLib()->initFunctions();
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
testDevice.getBuiltinFunctionsLib()->initBuiltinKernel(static_cast<Builtin>(builtId));
}
EXPECT_TRUE(testDevice.createModuleCalled);
}
@@ -224,7 +272,9 @@ HWTEST_F(TestBuiltinFunctionsLibImplDefault, GivenBuiltinsWhenInitializingFuncti
MockDeviceWithBuilins testDevice(device);
L0::Device *testDevicePtr = &testDevice;
testDevice.builtins.reset(new BuiltinFunctionsLibImpl(testDevicePtr, neoDevice->getBuiltIns()));
testDevice.getBuiltinFunctionsLib()->initFunctions();
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
testDevice.getBuiltinFunctionsLib()->initBuiltinKernel(static_cast<Builtin>(builtId));
}
EXPECT_EQ(ModuleType::Builtin, testDevice.typeCreated);
}

View File

@@ -534,7 +534,7 @@ class MockEvent : public ::L0::Event {
HWTEST_F(CommandListCreate, givenCommandListWithInvalidWaitEventArgWhenAppendQueryKernelTimestampsThenProperErrorRetruned) {
ze_result_t returnValue;
std::unique_ptr<L0::CommandList> commandList(CommandList::create(productFamily, device, NEO::EngineGroupType::RenderCompute, returnValue));
device->getBuiltinFunctionsLib()->initFunctions();
device->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestamps);
MockEvent event;
event.waitScope = ZE_EVENT_SCOPE_FLAG_HOST;
event.signalScope = ZE_EVENT_SCOPE_FLAG_HOST;
@@ -600,7 +600,8 @@ using TestPlatforms = IsAtLeastProduct<IGFX_SKYLAKE>;
HWTEST2_F(AppendQueryKernelTimestamps, givenCommandListWhenAppendQueryKernelTimestampsWithoutOffsetsThenProperBuiltinWasAdded, TestPlatforms) {
std::unique_ptr<MockDeviceForSpv<false>> testDevice = std::unique_ptr<MockDeviceForSpv<false>>(new MockDeviceForSpv<false>(device->getNEODevice(), device->getNEODevice()->getExecutionEnvironment(), driverHandle.get()));
testDevice->builtins.reset(new MockBuiltinFunctionsLibImplTimestamps(testDevice.get(), testDevice->getNEODevice()->getBuiltIns()));
testDevice->getBuiltinFunctionsLib()->initFunctions();
testDevice->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestamps);
testDevice->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestampsWithOffsets);
device = testDevice.get();
@@ -649,7 +650,8 @@ HWTEST2_F(AppendQueryKernelTimestamps, givenCommandListWhenAppendQueryKernelTime
HWTEST2_F(AppendQueryKernelTimestamps, givenCommandListWhenAppendQueryKernelTimestampsWithOffsetsThenProperBuiltinWasAdded, TestPlatforms) {
std::unique_ptr<MockDeviceForSpv<false>> testDevice = std::unique_ptr<MockDeviceForSpv<false>>(new MockDeviceForSpv<false>(device->getNEODevice(), device->getNEODevice()->getExecutionEnvironment(), driverHandle.get()));
testDevice->builtins.reset(new MockBuiltinFunctionsLibImplTimestamps(testDevice.get(), testDevice->getNEODevice()->getBuiltIns()));
testDevice->getBuiltinFunctionsLib()->initFunctions();
testDevice->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestamps);
testDevice->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestampsWithOffsets);
device = testDevice.get();
@@ -711,7 +713,7 @@ HWTEST2_F(AppendQueryKernelTimestamps, givenCommandListWhenAppendQueryKernelTime
HWTEST2_F(AppendQueryKernelTimestamps, givenCommandListWhenAppendQueryKernelTimestampsWithEventsNumberBiggerThanMaxWorkItemSizeThenProperGroupSizeAndGroupCountIsSet, TestPlatforms) {
std::unique_ptr<MockDeviceForSpv<false>> testDevice = std::unique_ptr<MockDeviceForSpv<false>>(new MockDeviceForSpv<false>(device->getNEODevice(), device->getNEODevice()->getExecutionEnvironment(), driverHandle.get()));
testDevice->builtins.reset(new MockBuiltinFunctionsLibImplTimestamps(testDevice.get(), testDevice->getNEODevice()->getBuiltIns()));
testDevice->getBuiltinFunctionsLib()->initFunctions();
testDevice->getBuiltinFunctionsLib()->initBuiltinKernel(L0::Builtin::QueryKernelTimestamps);
device = testDevice.get();