Skip to content

Commit ec28386

Browse files
authored
[NPU] Get same zero context for different CORE (#29917)
### Details: - *Do not reinitialize driver and device for each ov::Core object* --------- Signed-off-by: Bogdan Pereanu <[email protected]>
1 parent 0db3b37 commit ec28386

File tree

4 files changed

+44
-4
lines changed

4 files changed

+44
-4
lines changed

src/plugins/intel_npu/src/backend/src/zero_backend.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace intel_npu {
1414
ZeroEngineBackend::ZeroEngineBackend() : _logger("ZeroEngineBackend", Logger::global().level()) {
1515
_logger.debug("ZeroEngineBackend - initialize started");
1616

17-
_initStruct = std::make_shared<ZeroInitStructsHolder>();
17+
_initStruct = ZeroInitStructsHolder::getInstance();
1818

1919
auto device = std::make_shared<ZeroDevice>(_initStruct);
2020
_devices.emplace(std::make_pair(device->getName(), device));

src/plugins/intel_npu/src/utils/include/intel_npu/utils/zero/zero_init.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class ZeroInitStructsHolder final {
7373
return false;
7474
}
7575

76+
static const std::shared_ptr<ZeroInitStructsHolder>& getInstance();
77+
7678
private:
7779
void initNpuDriver();
7880

src/plugins/intel_npu/src/utils/src/zero/zero_init.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@ ZeroInitStructsHolder::ZeroInitStructsHolder()
309309
THROW_ON_FAIL_FOR_LEVELZERO("pfnDeviceGetGraphProperties", result);
310310
}
311311

312+
const std::shared_ptr<ZeroInitStructsHolder>& ZeroInitStructsHolder::getInstance() {
313+
static std::shared_ptr<ZeroInitStructsHolder> instance = std::make_shared<ZeroInitStructsHolder>();
314+
return instance;
315+
}
316+
312317
ZeroInitStructsHolder::~ZeroInitStructsHolder() {
313318
if (context) {
314319
log.debug("ZeroInitStructsHolder - performing zeContextDestroy");

src/plugins/intel_npu/tests/functional/behavior/remote_tensor_tests/remote_run.hpp

+36-3
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,6 @@ TEST_P(RemoteRunTests, checkResultsAfterChangingStateTensorsWithRemoteTensors) {
753753
auto model = createModelWithStates(element::f32, original_shape);
754754

755755
auto context = core->get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
756-
;
757756

758757
compiled_model = core->compile_model(model, target_device, configuration);
759758
ov::InferRequest inference_request;
@@ -851,7 +850,6 @@ TEST_P(RemoteRunTests, checkResultsAfterChangingStateDataWithRemoteAndRandomTens
851850
auto model = createModelWithStates(element::f32, original_shape);
852851

853852
auto context = core->get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
854-
;
855853

856854
compiled_model = core->compile_model(model, target_device, configuration);
857855
ov::InferRequest inference_request;
@@ -940,7 +938,6 @@ TEST_P(RemoteRunTests, checkResultsAfterChangingStateDataWithRemoteAndRandomTens
940938
auto model = createModelWithStates(element::f32, original_shape);
941939

942940
auto context = core->get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
943-
;
944941

945942
compiled_model = core->compile_model(model, target_device, configuration);
946943
ov::InferRequest inference_request;
@@ -1018,6 +1015,42 @@ TEST_P(RemoteRunTests, checkResultsAfterChangingStateDataWithRemoteAndRandomTens
10181015
}
10191016
}
10201017

1018+
TEST_P(RemoteRunTests, CheckContextFromDifferentOvCores) {
1019+
// Skip test according to plugin specific disabledTestPatterns() (if any)
1020+
SKIP_IF_CURRENT_TEST_IS_DISABLED()
1021+
ov::Core core0;
1022+
ov::Core core1;
1023+
1024+
auto context0 = core->get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
1025+
auto context1 = core0.get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
1026+
auto context2 = core1.get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
1027+
1028+
EXPECT_EQ(context0.get(), context1.get());
1029+
EXPECT_EQ(context1.get(), context2.get());
1030+
}
1031+
1032+
TEST_P(RemoteRunTests, CheckContextFromDifferentDestroyedOvCores) {
1033+
// Skip test according to plugin specific disabledTestPatterns() (if any)
1034+
SKIP_IF_CURRENT_TEST_IS_DISABLED()
1035+
1036+
ov::RemoteContext context1, context2;
1037+
auto context0 = core->get_default_context(target_device).as<ov::intel_npu::level_zero::ZeroContext>();
1038+
1039+
{
1040+
ov::Core internal_core;
1041+
context1 = internal_core.get_default_context(target_device);
1042+
}
1043+
1044+
{
1045+
ov::Core internal_core;
1046+
context2 = internal_core.get_default_context(target_device);
1047+
}
1048+
1049+
EXPECT_EQ(context0.get(), context1.get_params().at(ov::intel_npu::l0_context.name()).as<void*>());
1050+
EXPECT_EQ(context1.get_params().at(ov::intel_npu::l0_context.name()).as<void*>(),
1051+
context2.get_params().at(ov::intel_npu::l0_context.name()).as<void*>());
1052+
}
1053+
10211054
} // namespace behavior
10221055
} // namespace test
10231056
} // namespace ov

0 commit comments

Comments
 (0)