mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-08 05:56:36 +08:00
L0 support for expose sub devices as API devices
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
c021e2ec5e
commit
a31a674c38
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user