mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-04 23:56:39 +08:00
Defer builtin initialization until first use
Signed-off-by: Jaime Arteaga <jaime.a.arteaga.molina@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
06bcc67e38
commit
315146a43d
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user