diff --git a/opencl/source/cl_device/cl_device.cpp b/opencl/source/cl_device/cl_device.cpp index 2a3bb17cbf..e5a17b5197 100644 --- a/opencl/source/cl_device/cl_device.cpp +++ b/opencl/source/cl_device/cl_device.cpp @@ -48,12 +48,15 @@ ClDevice::ClDevice(Device &device, ClDevice &rootClDevice, Platform *platform) : auto pClSubDevice = std::make_unique(*subDevice, rootClDevice, platform); pClSubDevice->incRefInternal(); pClSubDevice->decRefApi(); + pClSubDevice->internalParentDevice = this; - auto &deviceInfo = pClSubDevice->deviceInfo; - deviceInfo.parentDevice = this; - deviceInfo.partitionType[0] = CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN; - deviceInfo.partitionType[1] = CL_DEVICE_AFFINITY_DOMAIN_NUMA; - deviceInfo.partitionType[2] = 0; + if (!device.getExecutionEnvironment()->isExposingSubDevicesAsDevices()) { + auto &deviceInfo = pClSubDevice->deviceInfo; + deviceInfo.parentDevice = this; + deviceInfo.partitionType[0] = CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN; + deviceInfo.partitionType[1] = CL_DEVICE_AFFINITY_DOMAIN_NUMA; + deviceInfo.partitionType[2] = 0; + } subDevices.push_back(std::move(pClSubDevice)); } @@ -70,25 +73,25 @@ ClDevice::~ClDevice() { } void ClDevice::incRefInternal() { - if (deviceInfo.parentDevice == nullptr) { + if (internalParentDevice == nullptr) { BaseObject<_cl_device_id>::incRefInternal(); return; } - auto pParentDevice = static_cast(deviceInfo.parentDevice); + auto pParentDevice = static_cast(internalParentDevice); pParentDevice->incRefInternal(); } unique_ptr_if_unused ClDevice::decRefInternal() { - if (deviceInfo.parentDevice == nullptr) { + if (internalParentDevice == nullptr) { return BaseObject<_cl_device_id>::decRefInternal(); } - auto pParentDevice = static_cast(deviceInfo.parentDevice); + auto pParentDevice = static_cast(internalParentDevice); return pParentDevice->decRefInternal(); } void ClDevice::retainApi() { auto parentDeviceId = deviceInfo.parentDevice; - if ((parentDeviceId && !getExecutionEnvironment()->isExposingSubDevicesAsDevices())) { + if (parentDeviceId) { auto pParentClDevice = static_cast(parentDeviceId); pParentClDevice->incRefInternal(); this->incRefApi(); @@ -96,7 +99,7 @@ void ClDevice::retainApi() { }; unique_ptr_if_unused ClDevice::releaseApi() { auto parentDeviceId = deviceInfo.parentDevice; - if (!parentDeviceId || getExecutionEnvironment()->isExposingSubDevicesAsDevices()) { + if (!parentDeviceId) { return unique_ptr_if_unused(this, false); } auto pParentClDevice = static_cast(parentDeviceId); diff --git a/opencl/source/cl_device/cl_device.h b/opencl/source/cl_device/cl_device.h index e8f79be801..f5fc613158 100644 --- a/opencl/source/cl_device/cl_device.h +++ b/opencl/source/cl_device/cl_device.h @@ -148,6 +148,7 @@ class ClDevice : public BaseObject<_cl_device_id> { Device &device; ClDevice &rootClDevice; std::vector> subDevices; + cl_device_id internalParentDevice = nullptr; cl_platform_id platformId; std::string name; std::unique_ptr driverInfo; diff --git a/opencl/test/unit_test/api/cl_create_sub_devices_tests.inl b/opencl/test/unit_test/api/cl_create_sub_devices_tests.inl index e8fdf0b2ca..5e4c0dc5b0 100644 --- a/opencl/test/unit_test/api/cl_create_sub_devices_tests.inl +++ b/opencl/test/unit_test/api/cl_create_sub_devices_tests.inl @@ -136,7 +136,7 @@ TEST_F(ClCreateSubDevicesTests, GivenValidInputWhenCreatingSubDevicesThenDeviceA TEST_F(ClCreateSubDevicesTests, GivenValidInputAndReturnSubDevicesAsApiDevicesIsSetWhenCreatingSubDevicesThenDeviceApiReferenceCountIsNotIncreased) { std::unordered_map mockableEnvs = {{"ZE_FLAT_DEVICE_HIERARCHY", "COMPOSITE"}}; VariableBackup *> mockableEnvValuesBackup(&IoFunctions::mockableEnvValues, &mockableEnvs); - DebugManager.flags.ReturnSubDevicesAsApiDevices.set(1); + DebugManager.flags.ReturnSubDevicesAsApiDevices.set(true); setup(2); EXPECT_EQ(0, device->getSubDevice(0)->getRefApiCount()); @@ -189,6 +189,7 @@ struct ClCreateSubDevicesDeviceInfoTests : ClCreateSubDevicesTests { }; TEST_F(ClCreateSubDevicesDeviceInfoTests, WhenGettingSubDeviceRelatedDeviceInfoThenCorrectValuesAreSet) { + DebugManager.flags.ReturnSubDevicesAsApiDevices.set(false); setup(4); auto &rootDeviceInfo = device->getDeviceInfo(); @@ -260,6 +261,7 @@ TEST_F(ClCreateSubDevicesDeviceInfoTests, GivenRootDeviceWithoutSubDevicesWhenGe } TEST_F(ClCreateSubDevicesDeviceInfoTests, WhenGettingSubDeviceRelatedDeviceInfoViaApiThenCorrectValuesAreSet) { + DebugManager.flags.ReturnSubDevicesAsApiDevices.set(false); setup(4); size_t partitionPropertiesReturnValueSize = 0; diff --git a/opencl/test/unit_test/device/sub_device_tests.cpp b/opencl/test/unit_test/device/sub_device_tests.cpp index 0f811b4c49..da26daf53e 100644 --- a/opencl/test/unit_test/device/sub_device_tests.cpp +++ b/opencl/test/unit_test/device/sub_device_tests.cpp @@ -170,6 +170,7 @@ TEST(SubDevicesTest, givenDeviceWithSubDevicesWhenSubDeviceInternalRefCountsAreC TEST(SubDevicesTest, givenClDeviceWithSubDevicesWhenSubDeviceInternalRefCountsAreChangedThenChangeIsPropagatedToRootDevice) { DebugManagerStateRestore restorer; DebugManager.flags.CreateMultipleSubDevices.set(2); + DebugManager.flags.ReturnSubDevicesAsApiDevices.set(false); VariableBackup mockDeviceFlagBackup(&MockDevice::createSingleDevice, false); auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(defaultHwInfo.get())); device->incRefInternal(); diff --git a/shared/test/common/mocks/ult_device_factory.cpp b/shared/test/common/mocks/ult_device_factory.cpp index 08ba520ad3..15cbd233fb 100644 --- a/shared/test/common/mocks/ult_device_factory.cpp +++ b/shared/test/common/mocks/ult_device_factory.cpp @@ -29,6 +29,7 @@ UltDeviceFactory::UltDeviceFactory(uint32_t rootDevicesCount, uint32_t subDevice VariableBackup createRootDeviceFuncBackup{&DeviceFactory::createRootDeviceFunc}; VariableBackup createMemoryManagerFuncBackup{&DeviceFactory::createMemoryManagerFunc}; + DebugManager.flags.ReturnSubDevicesAsApiDevices.set(false); DebugManager.flags.CreateMultipleRootDevices.set(rootDevicesCount); DebugManager.flags.CreateMultipleSubDevices.set(subDevicesCount); createRootDeviceFuncBackup = [](ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex) -> std::unique_ptr {