L0 support for expose sub devices as API devices

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2022-05-11 09:55:37 +00:00
committed by Compute-Runtime-Automation
parent c021e2ec5e
commit a31a674c38
6 changed files with 88 additions and 9 deletions

View File

@@ -254,8 +254,22 @@ DriverHandle *DriverHandle::create(std::vector<std::unique_ptr<NEO::Device>> dev
}
ze_result_t DriverHandleImp::getDevice(uint32_t *pCount, ze_device_handle_t *phDevices) {
bool exposeSubDevices = false;
if (NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.get() != -1) {
exposeSubDevices = NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.get();
}
if (*pCount == 0) {
*pCount = this->numDevices;
if (exposeSubDevices) {
for (auto &device : this->devices) {
auto deviceImpl = static_cast<DeviceImp *>(device);
*pCount += (deviceImpl->numSubDevices > 0 ? deviceImpl->numSubDevices : 1u);
}
} else {
*pCount = this->numDevices;
}
return ZE_RESULT_SUCCESS;
}
@@ -263,8 +277,22 @@ ze_result_t DriverHandleImp::getDevice(uint32_t *pCount, ze_device_handle_t *phD
return ZE_RESULT_ERROR_INVALID_NULL_HANDLE;
}
for (uint32_t i = 0; i < *pCount; i++) {
phDevices[i] = this->devices[i];
uint32_t i = 0;
for (auto device : devices) {
auto deviceImpl = static_cast<DeviceImp *>(device);
if (deviceImpl->numSubDevices > 0 && exposeSubDevices) {
for (auto subdevice : deviceImpl->subDevices) {
phDevices[i++] = subdevice;
if (i == *pCount) {
return ZE_RESULT_SUCCESS;
}
}
} else {
phDevices[i++] = device;
if (i == *pCount) {
return ZE_RESULT_SUCCESS;
}
}
}
return ZE_RESULT_SUCCESS;

View File

@@ -1354,6 +1354,57 @@ TEST_F(TimestampEventCreate, givenEventWhenQueryKernelTimestampThenNotReadyRetur
using EventPoolCreateMultiDevice = Test<MultiDeviceFixture>;
TEST_F(EventPoolCreateMultiDevice, givenReturnSubDevicesAsApiDevicesWhenCallZeGetDevicesThenSubDevicesAreReturnedAsSeparateDevices) {
DebugManagerStateRestore restorer;
NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.set(1);
uint32_t deviceCount = 0;
ze_result_t result = zeDeviceGet(driverHandle.get(), &deviceCount, nullptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(deviceCount, numRootDevices * numSubDevices);
ze_device_handle_t *devices = new ze_device_handle_t[deviceCount];
result = zeDeviceGet(driverHandle.get(), &deviceCount, devices);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
uint32_t i = 0u;
for (const auto device : driverHandle->devices) {
auto deviceImpl = static_cast<DeviceImp *>(device);
for (const auto subdevice : deviceImpl->subDevices) {
EXPECT_EQ(devices[i], subdevice);
i++;
}
}
static_cast<DeviceImp *>(driverHandle->devices[1])->numSubDevices = 0;
uint32_t deviceCount2 = 0;
result = zeDeviceGet(driverHandle.get(), &deviceCount2, nullptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(deviceCount2, (numRootDevices - 1) * numSubDevices + 1);
ze_device_handle_t *devices2 = new ze_device_handle_t[deviceCount2];
result = zeDeviceGet(driverHandle.get(), &deviceCount2, devices2);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
i = 0u;
for (const auto device : driverHandle->devices) {
auto deviceImpl = static_cast<DeviceImp *>(device);
if (deviceImpl->numSubDevices > 0) {
for (const auto subdevice : deviceImpl->subDevices) {
EXPECT_EQ(devices2[i], subdevice);
i++;
}
} else {
EXPECT_EQ(devices2[i], device);
i++;
}
}
static_cast<DeviceImp *>(driverHandle->devices[1])->numSubDevices = numSubDevices;
delete[] devices2;
delete[] devices;
}
TEST_F(EventPoolCreateMultiDevice, whenCreatingEventPoolWithMultipleDevicesThenEventPoolCreateSucceeds) {
ze_event_pool_desc_t eventPoolDesc = {};
eventPoolDesc.stype = ZE_STRUCTURE_TYPE_EVENT_POOL_DESC;