Expose all created platforms

Sort devices properly

Related-To: NEO-3691
Change-Id: I23eb3caccb3161fef022ec5ab3674847770226c8
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2020-03-10 12:58:35 +01:00
committed by sys_ocldev
parent fdcc07a121
commit 4d045a613d
4 changed files with 64 additions and 21 deletions

View File

@ -107,15 +107,18 @@ cl_int CL_API_CALL clGetPlatformIDs(cl_uint numEntries,
break;
}
}
cl_uint numPlatformsToExpose = std::min(numEntries, static_cast<cl_uint>(platformsImpl.size()));
if (numEntries == 0) {
numPlatformsToExpose = static_cast<cl_uint>(platformsImpl.size());
}
if (platforms) {
// we only have one platform so we can program that directly
platforms[0] = platformsImpl[0].get();
for (auto i = 0u; i < numPlatformsToExpose; i++) {
platforms[i] = platformsImpl[i].get();
}
}
// we only have a single platform at this time, so return 1 if num_platforms
// is non-nullptr
if (numPlatforms) {
*numPlatforms = 1;
*numPlatforms = numPlatformsToExpose;
}
} while (false);
TRACING_EXIT(clGetPlatformIDs, &retVal);

View File

@ -273,7 +273,9 @@ std::vector<DeviceVector> Platform::groupDevices(DeviceVector devices) {
auto platformId = platformsMap[productFamily];
outDevices[platformId].push_back(std::move(device));
}
std::reverse(outDevices.begin(), outDevices.end());
std::sort(outDevices.begin(), outDevices.end(), [](DeviceVector &lhs, DeviceVector &rhs) -> bool {
return lhs[0]->getHardwareInfo().platform.eProductFamily > rhs[0]->getHardwareInfo().platform.eProductFamily;
});
return outDevices;
}

View File

@ -5,6 +5,7 @@
*
*/
#include "shared/source/device/root_device.h"
#include "shared/source/os_interface/device_factory.h"
#include "shared/test/unit_test/helpers/ult_hw_config.h"
@ -84,6 +85,50 @@ TEST(clGetPlatformIDsNegativeTests, whenFailToCreateDeviceThenClGetPlatfomsIdsRe
platformsImpl.clear();
}
TEST(clGetPlatformIDsMultiPlatformTest, whenCreateDevicesWithDifferentProductFamilyThenClGetPlatformIdsCreatesMultiplePlatformsProperlySorted) {
DebugManagerStateRestore restorer;
const size_t numRootDevices = 2u;
DebugManager.flags.CreateMultipleRootDevices.set(numRootDevices);
VariableBackup<decltype(DeviceFactory::createRootDeviceFunc)> createFuncBackup{&DeviceFactory::createRootDeviceFunc};
DeviceFactory::createRootDeviceFunc = [](ExecutionEnvironment &executionEnvironment, uint32_t rootDeviceIndex) -> std::unique_ptr<Device> {
auto device = std::unique_ptr<Device>(Device::create<RootDevice>(&executionEnvironment, rootDeviceIndex));
auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo();
if (rootDeviceIndex == 0) {
hwInfo->platform.eProductFamily = IGFX_SKYLAKE;
} else {
hwInfo->platform.eProductFamily = IGFX_KABYLAKE;
}
return device;
};
platformsImpl.clear();
cl_int retVal = CL_SUCCESS;
cl_platform_id platformsRet[2];
cl_uint numPlatforms = 0;
retVal = clGetPlatformIDs(0, nullptr, &numPlatforms);
EXPECT_EQ(2u, numPlatforms);
EXPECT_EQ(CL_SUCCESS, retVal);
numPlatforms = 0u;
retVal = clGetPlatformIDs(2u, platformsRet, &numPlatforms);
EXPECT_EQ(2u, numPlatforms);
EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_NE(nullptr, platformsRet[0]);
auto platform0 = castToObject<Platform>(platformsRet[0]);
EXPECT_EQ(1u, platform0->getNumDevices());
EXPECT_EQ(IGFX_KABYLAKE, platform0->getClDevice(0)->getHardwareInfo().platform.eProductFamily);
EXPECT_EQ(1u, platform0->getClDevice(0)->getRootDeviceIndex());
EXPECT_NE(nullptr, platformsRet[1]);
auto platform1 = castToObject<Platform>(platformsRet[1]);
EXPECT_EQ(1u, platform1->getNumDevices());
EXPECT_EQ(IGFX_SKYLAKE, platform1->getClDevice(0)->getHardwareInfo().platform.eProductFamily);
EXPECT_EQ(0u, platform1->getClDevice(0)->getRootDeviceIndex());
platformsImpl.clear();
}
TEST(clGetPlatformIDsNegativeTests, whenFailToCreatePlatformThenClGetPlatfomsIdsReturnsOutOfHostMemoryError) {
VariableBackup<decltype(Platform::createFunc)> createFuncBackup{&Platform::createFunc};
Platform::createFunc = [](ExecutionEnvironment &executionEnvironment) -> std::unique_ptr<Platform> {

View File

@ -424,13 +424,6 @@ TEST(PlatformInitLoopTests, givenPlatformWithDebugSettingWhenInitIsCalledThenItE
}
TEST(PlatformGroupDevicesTest, whenMultipleDevicesAreCreatedThenGroupDevicesCreatesVectorPerEachProductFamily) {
struct MockRootDeviceEnvironment : RootDeviceEnvironment {
using RootDeviceEnvironment::RootDeviceEnvironment;
const HardwareInfo *getHardwareInfo() const override {
return &ownHardwareInfo;
}
HardwareInfo ownHardwareInfo = *platformDevices[0];
};
DebugManagerStateRestore restorer;
const size_t numRootDevices = 5u;
@ -444,16 +437,16 @@ TEST(PlatformGroupDevicesTest, whenMultipleDevicesAreCreatedThenGroupDevicesCrea
EXPECT_EQ(numRootDevices, inputDevices.size());
auto skl0Device = inputDevices[0].get();
auto skl1Device = inputDevices[1].get();
auto skl2Device = inputDevices[2].get();
auto kbl0Device = inputDevices[3].get();
auto kbl0Device = inputDevices[1].get();
auto skl1Device = inputDevices[2].get();
auto skl2Device = inputDevices[3].get();
auto cfl0Device = inputDevices[4].get();
static_cast<MockRootDeviceEnvironment &>(*executionEnvironment->rootDeviceEnvironments[0]).ownHardwareInfo.platform.eProductFamily = IGFX_SKYLAKE;
static_cast<MockRootDeviceEnvironment &>(*executionEnvironment->rootDeviceEnvironments[1]).ownHardwareInfo.platform.eProductFamily = IGFX_SKYLAKE;
static_cast<MockRootDeviceEnvironment &>(*executionEnvironment->rootDeviceEnvironments[2]).ownHardwareInfo.platform.eProductFamily = IGFX_SKYLAKE;
static_cast<MockRootDeviceEnvironment &>(*executionEnvironment->rootDeviceEnvironments[3]).ownHardwareInfo.platform.eProductFamily = IGFX_KABYLAKE;
static_cast<MockRootDeviceEnvironment &>(*executionEnvironment->rootDeviceEnvironments[4]).ownHardwareInfo.platform.eProductFamily = IGFX_COFFEELAKE;
executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo()->platform.eProductFamily = IGFX_SKYLAKE;
executionEnvironment->rootDeviceEnvironments[1]->getMutableHardwareInfo()->platform.eProductFamily = IGFX_KABYLAKE;
executionEnvironment->rootDeviceEnvironments[2]->getMutableHardwareInfo()->platform.eProductFamily = IGFX_SKYLAKE;
executionEnvironment->rootDeviceEnvironments[3]->getMutableHardwareInfo()->platform.eProductFamily = IGFX_SKYLAKE;
executionEnvironment->rootDeviceEnvironments[4]->getMutableHardwareInfo()->platform.eProductFamily = IGFX_COFFEELAKE;
auto groupedDevices = Platform::groupDevices(std::move(inputDevices));