Skip to content

Commit 72080bb

Browse files
Jaime ArteagaCompute-Runtime-Automation
authored andcommitted
Add support for new affinity mask format (2)
Change-Id: I8a1d277ff86b0fbdcde96d4d02d6a235a56e197b Signed-off: Jaime Arteaga <jaime.a.arteaga.molina@intel.com>
1 parent 396fcbb commit 72080bb

File tree

2 files changed

+95
-11
lines changed

2 files changed

+95
-11
lines changed

level_zero/core/source/driver/driver_handle_imp.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,21 @@ uint32_t DriverHandleImp::parseAffinityMask(std::vector<std::unique_ptr<NEO::Dev
153153
size_t posNextComma = this->affinityMaskString.find_first_of(",", pos);
154154
std::string rootDeviceString = this->affinityMaskString.substr(pos, std::min(posNextDot, posNextComma) - pos);
155155
uint32_t rootDeviceIndex = static_cast<uint32_t>(std::stoul(rootDeviceString, nullptr, 0));
156-
pos += rootDeviceString.size();
157-
if (posNextDot != std::string::npos &&
158-
this->affinityMaskString.at(pos) == '.' && posNextDot < posNextComma) {
159-
pos++;
160-
std::string subDeviceString = this->affinityMaskString.substr(pos, posNextComma - pos);
161-
uint32_t subDeviceIndex = static_cast<uint32_t>(std::stoul(subDeviceString, nullptr, 0));
162-
affinityMaskBitSet[rootDeviceIndex][subDeviceIndex] = true;
163-
} else {
164-
std::fill(affinityMaskBitSet[rootDeviceIndex].begin(),
165-
affinityMaskBitSet[rootDeviceIndex].end(),
166-
true);
156+
if (rootDeviceIndex < neoDevices.size()) {
157+
pos += rootDeviceString.size();
158+
if (posNextDot != std::string::npos &&
159+
this->affinityMaskString.at(pos) == '.' && posNextDot < posNextComma) {
160+
pos++;
161+
std::string subDeviceString = this->affinityMaskString.substr(pos, posNextComma - pos);
162+
uint32_t subDeviceIndex = static_cast<uint32_t>(std::stoul(subDeviceString, nullptr, 0));
163+
if (subDeviceIndex < neoDevices[rootDeviceIndex]->getNumAvailableDevices()) {
164+
affinityMaskBitSet[rootDeviceIndex][subDeviceIndex] = true;
165+
}
166+
} else {
167+
std::fill(affinityMaskBitSet[rootDeviceIndex].begin(),
168+
affinityMaskBitSet[rootDeviceIndex].end(),
169+
true);
170+
}
167171
}
168172
if (posNextComma == std::string::npos) {
169173
break;

level_zero/core/test/unit_tests/sources/driver/test_driver.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,5 +527,85 @@ INSTANTIATE_TEST_SUITE_P(DriverTestMultipleDeviceWithAffinityMaskTests,
527527
::testing::Combine(
528528
::testing::ValuesIn(maskArray.masks),
529529
::testing::ValuesIn(maskArray.masks)));
530+
531+
TEST_F(DriverTestMultipleDeviceWithAffinityMask,
532+
whenSettingAffinityMaskWithDeviceLargerThanAvailableDevicesThenRootDeviceValueIsIgnored) {
533+
L0::DriverHandleImp *driverHandle = new DriverHandleImp;
534+
535+
constexpr uint32_t totalRootDevices = 2;
536+
uint32_t subDevice1Index = 0;
537+
driverHandle->affinityMaskString = "0,23,1." + std::to_string(subDevice1Index);
538+
539+
ze_result_t res = driverHandle->initialize(std::move(devices));
540+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
541+
542+
uint32_t deviceCount = 0;
543+
res = zeDeviceGet(driverHandle->toHandle(), &deviceCount, nullptr);
544+
545+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
546+
EXPECT_EQ(deviceCount, totalRootDevices);
547+
548+
std::vector<ze_device_handle_t> phDevices(deviceCount);
549+
res = zeDeviceGet(driverHandle->toHandle(), &deviceCount, phDevices.data());
550+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
551+
552+
for (uint32_t i = 0; i < deviceCount; i++) {
553+
ze_device_handle_t hDevice = phDevices[i];
554+
EXPECT_NE(nullptr, hDevice);
555+
556+
DeviceImp *device = reinterpret_cast<DeviceImp *>(L0::Device::fromHandle(hDevice));
557+
558+
uint32_t subDeviceCount = 0;
559+
res = zeDeviceGetSubDevices(hDevice, &subDeviceCount, nullptr);
560+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
561+
if (i == 0) {
562+
EXPECT_EQ(4u, subDeviceCount);
563+
} else {
564+
ze_device_handle_t hSubDevice;
565+
res = zeDeviceGetSubDevices(hDevice, &subDeviceCount, &hSubDevice);
566+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
567+
568+
DeviceImp *subDevice = reinterpret_cast<DeviceImp *>(L0::Device::fromHandle(hSubDevice));
569+
570+
EXPECT_EQ(1u, subDeviceCount);
571+
EXPECT_EQ(subDevice->neoDevice, device->neoDevice->getDeviceById(subDevice1Index));
572+
}
573+
}
574+
575+
delete driverHandle;
576+
L0::GlobalDriver = nullptr;
577+
}
578+
579+
TEST_F(DriverTestMultipleDeviceWithAffinityMask,
580+
whenSettingAffinityMaskWithSubDeviceLargerThanAvailableSubDevicesThenSubDeviceValueIsIgnored) {
581+
L0::DriverHandleImp *driverHandle = new DriverHandleImp;
582+
583+
driverHandle->affinityMaskString = "0,1.77";
584+
585+
ze_result_t res = driverHandle->initialize(std::move(devices));
586+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
587+
588+
uint32_t deviceCount = 0;
589+
res = zeDeviceGet(driverHandle->toHandle(), &deviceCount, nullptr);
590+
591+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
592+
EXPECT_EQ(deviceCount, 1u);
593+
594+
std::vector<ze_device_handle_t> phDevices(deviceCount);
595+
res = zeDeviceGet(driverHandle->toHandle(), &deviceCount, phDevices.data());
596+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
597+
598+
ze_device_handle_t hDevice = phDevices[0];
599+
EXPECT_NE(nullptr, hDevice);
600+
601+
uint32_t subDeviceCount = 0;
602+
res = zeDeviceGetSubDevices(hDevice, &subDeviceCount, nullptr);
603+
EXPECT_EQ(ZE_RESULT_SUCCESS, res);
604+
EXPECT_EQ(4u, subDeviceCount);
605+
606+
delete driverHandle;
607+
L0::GlobalDriver = nullptr;
608+
}
609+
530610
} // namespace ult
531611
} // namespace L0

0 commit comments

Comments
 (0)