Skip to content

Commit a31a674

Browse files
L0 support for expose sub devices as API devices
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
1 parent c021e2e commit a31a674

File tree

6 files changed

+88
-9
lines changed

6 files changed

+88
-9
lines changed

level_zero/core/source/driver/driver_handle_imp.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,17 +254,45 @@ DriverHandle *DriverHandle::create(std::vector<std::unique_ptr<NEO::Device>> dev
254254
}
255255

256256
ze_result_t DriverHandleImp::getDevice(uint32_t *pCount, ze_device_handle_t *phDevices) {
257+
bool exposeSubDevices = false;
258+
259+
if (NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.get() != -1) {
260+
exposeSubDevices = NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.get();
261+
}
262+
257263
if (*pCount == 0) {
258-
*pCount = this->numDevices;
264+
if (exposeSubDevices) {
265+
for (auto &device : this->devices) {
266+
auto deviceImpl = static_cast<DeviceImp *>(device);
267+
*pCount += (deviceImpl->numSubDevices > 0 ? deviceImpl->numSubDevices : 1u);
268+
}
269+
} else {
270+
*pCount = this->numDevices;
271+
}
272+
259273
return ZE_RESULT_SUCCESS;
260274
}
261275

262276
if (phDevices == nullptr) {
263277
return ZE_RESULT_ERROR_INVALID_NULL_HANDLE;
264278
}
265279

266-
for (uint32_t i = 0; i < *pCount; i++) {
267-
phDevices[i] = this->devices[i];
280+
uint32_t i = 0;
281+
for (auto device : devices) {
282+
auto deviceImpl = static_cast<DeviceImp *>(device);
283+
if (deviceImpl->numSubDevices > 0 && exposeSubDevices) {
284+
for (auto subdevice : deviceImpl->subDevices) {
285+
phDevices[i++] = subdevice;
286+
if (i == *pCount) {
287+
return ZE_RESULT_SUCCESS;
288+
}
289+
}
290+
} else {
291+
phDevices[i++] = device;
292+
if (i == *pCount) {
293+
return ZE_RESULT_SUCCESS;
294+
}
295+
}
268296
}
269297

270298
return ZE_RESULT_SUCCESS;

level_zero/core/test/unit_tests/sources/event/test_event.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,6 +1354,57 @@ TEST_F(TimestampEventCreate, givenEventWhenQueryKernelTimestampThenNotReadyRetur
13541354

13551355
using EventPoolCreateMultiDevice = Test<MultiDeviceFixture>;
13561356

1357+
TEST_F(EventPoolCreateMultiDevice, givenReturnSubDevicesAsApiDevicesWhenCallZeGetDevicesThenSubDevicesAreReturnedAsSeparateDevices) {
1358+
DebugManagerStateRestore restorer;
1359+
NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.set(1);
1360+
1361+
uint32_t deviceCount = 0;
1362+
ze_result_t result = zeDeviceGet(driverHandle.get(), &deviceCount, nullptr);
1363+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1364+
EXPECT_EQ(deviceCount, numRootDevices * numSubDevices);
1365+
1366+
ze_device_handle_t *devices = new ze_device_handle_t[deviceCount];
1367+
result = zeDeviceGet(driverHandle.get(), &deviceCount, devices);
1368+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1369+
1370+
uint32_t i = 0u;
1371+
for (const auto device : driverHandle->devices) {
1372+
auto deviceImpl = static_cast<DeviceImp *>(device);
1373+
for (const auto subdevice : deviceImpl->subDevices) {
1374+
EXPECT_EQ(devices[i], subdevice);
1375+
i++;
1376+
}
1377+
}
1378+
1379+
static_cast<DeviceImp *>(driverHandle->devices[1])->numSubDevices = 0;
1380+
uint32_t deviceCount2 = 0;
1381+
result = zeDeviceGet(driverHandle.get(), &deviceCount2, nullptr);
1382+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1383+
EXPECT_EQ(deviceCount2, (numRootDevices - 1) * numSubDevices + 1);
1384+
ze_device_handle_t *devices2 = new ze_device_handle_t[deviceCount2];
1385+
1386+
result = zeDeviceGet(driverHandle.get(), &deviceCount2, devices2);
1387+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
1388+
1389+
i = 0u;
1390+
for (const auto device : driverHandle->devices) {
1391+
auto deviceImpl = static_cast<DeviceImp *>(device);
1392+
if (deviceImpl->numSubDevices > 0) {
1393+
for (const auto subdevice : deviceImpl->subDevices) {
1394+
EXPECT_EQ(devices2[i], subdevice);
1395+
i++;
1396+
}
1397+
} else {
1398+
EXPECT_EQ(devices2[i], device);
1399+
i++;
1400+
}
1401+
}
1402+
1403+
static_cast<DeviceImp *>(driverHandle->devices[1])->numSubDevices = numSubDevices;
1404+
delete[] devices2;
1405+
delete[] devices;
1406+
}
1407+
13571408
TEST_F(EventPoolCreateMultiDevice, whenCreatingEventPoolWithMultipleDevicesThenEventPoolCreateSucceeds) {
13581409
ze_event_pool_desc_t eventPoolDesc = {};
13591410
eventPoolDesc.stype = ZE_STRUCTURE_TYPE_EVENT_POOL_DESC;

opencl/source/api/api.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ cl_int CL_API_CALL clGetDeviceIDs(cl_platform_id platform,
248248
for (auto platformDeviceIndex = 0u; platformDeviceIndex < numDev; platformDeviceIndex++) {
249249
bool exposeSubDevices = false;
250250

251-
if (DebugManager.flags.ReturnSubDevicesAsClDeviceIDs.get() != -1) {
252-
exposeSubDevices = DebugManager.flags.ReturnSubDevicesAsClDeviceIDs.get();
251+
if (DebugManager.flags.ReturnSubDevicesAsApiDevices.get() != -1) {
252+
exposeSubDevices = DebugManager.flags.ReturnSubDevicesAsApiDevices.get();
253253
}
254254

255255
ClDevice *device = pPlatform->getClDevice(platformDeviceIndex);

opencl/test/unit_test/api/cl_get_device_ids_tests.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,15 @@ TEST(clGetDeviceIDsTest, givenMultipleRootDevicesWhenGetDeviceIdsButNumEntriesIs
146146
EXPECT_EQ(devices[numEntries], dummyDevice);
147147
}
148148

149-
TEST(clGetDeviceIDsTest, givenReturnSubDevicesAsClDeviceIDsWhenCallClGetDeviceIDsThenSubDevicesAreReturnedAsSeparateClDevices) {
149+
TEST(clGetDeviceIDsTest, givenReturnSubDevicesAsApiDevicesWhenCallClGetDeviceIDsThenSubDevicesAreReturnedAsSeparateClDevices) {
150150
platformsImpl->clear();
151151
constexpr auto numRootDevices = 3u;
152152
VariableBackup<UltHwConfig> backup(&ultHwConfig);
153153
ultHwConfig.useMockedPrepareDeviceEnvironmentsFunc = false;
154154
DebugManagerStateRestore restorer;
155155
DebugManager.flags.CreateMultipleRootDevices.set(numRootDevices);
156156
DebugManager.flags.CreateMultipleSubDevices.set(numRootDevices);
157-
DebugManager.flags.ReturnSubDevicesAsClDeviceIDs.set(1);
157+
DebugManager.flags.ReturnSubDevicesAsApiDevices.set(1);
158158
cl_uint maxNumDevices;
159159
auto retVal = clGetDeviceIDs(nullptr, CL_DEVICE_TYPE_ALL, 0, nullptr, &maxNumDevices);
160160
EXPECT_EQ(retVal, CL_SUCCESS);

opencl/test/unit_test/test_files/igdrcl.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ EnableLocalMemory = -1
146146
EnableStatelessToStatefulBufferOffsetOpt = -1
147147
CreateMultipleRootDevices = 0
148148
CreateMultipleSubDevices = 0
149-
ReturnSubDevicesAsClDeviceIDs = -1
149+
ReturnSubDevicesAsApiDevices = -1
150150
LimitAmountOfReturnedDevices = 0
151151
Enable64kbpages = -1
152152
OverrideEnableKmdNotify = -1

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memo
327327
DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Low Filtering Precision Sampler mode")
328328
DECLARE_DEBUG_VARIABLE(bool, EngineInstancedSubDevices, false, "Create subdevices assigned to specific engine")
329329
DECLARE_DEBUG_VARIABLE(bool, AllowSingleTileEngineInstancedSubDevices, false, "Create subdevices assigned to specific engine on single tile config")
330-
DECLARE_DEBUG_VARIABLE(int32_t, ReturnSubDevicesAsClDeviceIDs, -1, "Expose each subdevice as a separate device during clGetDeviceIDs API call")
330+
DECLARE_DEBUG_VARIABLE(int32_t, ReturnSubDevicesAsApiDevices, -1, "Expose each subdevice as a separate device during clGetDeviceIDs API call")
331331
DECLARE_DEBUG_VARIABLE(int32_t, ForceRunAloneContext, -1, "Control creation of run-alone HW context, -1:default, 0:disable, 1:enable")
332332
DECLARE_DEBUG_VARIABLE(int32_t, AddClGlSharing, -1, "Add cl-gl extension")
333333
DECLARE_DEBUG_VARIABLE(int32_t, EnableKernelTunning, -1, "Perform a tunning of enqueue kernel, -1:default(disabled), 0:disable, 1:enable simple kernel tunning, 2:enable full kernel tunning")

0 commit comments

Comments
 (0)