L0 and Ocl Metric Api sub device support

Signed-off-by: Piotr Maciejewski <piotr.maciejewski@intel.com>
This commit is contained in:
Piotr Maciejewski
2020-12-17 13:17:28 +00:00
committed by Compute-Runtime-Automation
parent 6a81edfbe1
commit aa05b5adb4
25 changed files with 491 additions and 83 deletions

View File

@@ -76,7 +76,7 @@ class MetricEnumerationTestLinux : public MetricContextFixture,
TEST_F(MetricEnumerationTestLinux, givenCorrectLinuxDrmAdapterWhenGetMetricsAdapterThenReturnSuccess) {
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;
@@ -112,7 +112,7 @@ TEST_F(MetricEnumerationTestLinux, givenCorrectLinuxMinorPrimaryNodeDrmAdapterWh
const int32_t drmMaxDevices = 64; // From drm_drv.c#110
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;
@@ -150,7 +150,7 @@ TEST_F(MetricEnumerationTestLinux, givenCorrectLinuxMinorRenderNodeDrmAdapterWhe
const int32_t drmMaxDevices = 64; // From drm_drv.c#110
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;
@@ -185,7 +185,7 @@ TEST_F(MetricEnumerationTestLinux, givenCorrectLinuxMinorRenderNodeDrmAdapterWhe
TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterTypeWhenGetMetricsAdapterThenReturnFail) {
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_LUID;
@@ -220,7 +220,7 @@ TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterTypeWhenGe
TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterMajorWhenGetMetricsAdapterThenReturnFail) {
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;
@@ -256,7 +256,7 @@ TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterMajorWhenG
TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterMinorWhenGetMetricsAdapterThenReturnFail) {
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;
@@ -292,7 +292,7 @@ TEST_F(MetricEnumerationTestLinux, givenIcorrectMetricDiscoveryAdapterMinorWhenG
TEST_F(MetricEnumerationTestLinux, givenIcorrectOpenMetricDeviceOnAdapterWhenGetMetricsAdapterThenReturnFail) {
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
adapterGroupParams.AdapterCount = 1;
adapterParams.SystemId.Type = MetricsDiscovery::TAdapterIdType::ADAPTER_ID_TYPE_MAJOR_MINOR;

View File

@@ -160,8 +160,8 @@ class MetricContextFixture : public ContextFixture {
MockMetricsDiscoveryApi mockMetricsDiscoveryApi = {};
// Metrics discovery device
Mock<IAdapterGroup_1_8> adapterGroup;
Mock<IAdapter_1_8> adapter;
Mock<IAdapterGroup_1_9> adapterGroup;
Mock<IAdapter_1_9> adapter;
Mock<IMetricsDevice_1_5> metricsDevice;
MetricsDiscovery::TMetricsDeviceParams_1_2 metricsDeviceParams = {};
};

View File

@@ -18,7 +18,7 @@ Mock<MetricEnumeration>::~Mock() {
MockMetricsDiscoveryApi *Mock<MetricEnumeration>::g_mockApi = nullptr;
TCompletionCode MockMetricsDiscoveryApi::OpenAdapterGroup(IAdapterGroup_1_8 **group) {
TCompletionCode MockMetricsDiscoveryApi::OpenAdapterGroup(IAdapterGroup_1_9 **group) {
return Mock<MetricEnumeration>::g_mockApi->MockOpenAdapterGroup(group);
}
@@ -264,6 +264,11 @@ IAdapter_1_8 *IAdapterGroup_1_8::GetAdapter(uint32_t index) {
return nullptr;
}
IAdapter_1_6 *IAdapterGroup_1_6::GetAdapter(uint32_t index) {
UNRECOVERABLE_IF(true);
return nullptr;
}
IAdapterGroup_1_6 ::~IAdapterGroup_1_6() {
}
@@ -272,7 +277,7 @@ const TAdapterGroupParams_1_6 *IAdapterGroup_1_6::GetParams(void) const {
return nullptr;
}
IAdapter_1_6 *IAdapterGroup_1_6::GetAdapter(uint32_t index) {
IAdapter_1_9 *IAdapterGroup_1_9::GetAdapter(uint32_t index) {
UNRECOVERABLE_IF(true);
return nullptr;
}
@@ -294,6 +299,11 @@ const TAdapterParams_1_8 *IAdapter_1_8::GetParams(void) const {
return nullptr;
}
const TAdapterParams_1_9 *IAdapter_1_9::GetParams(void) const {
UNRECOVERABLE_IF(true);
return nullptr;
}
TCompletionCode IAdapter_1_6 ::Reset() {
UNRECOVERABLE_IF(true);
return CC_ERROR_NOT_SUPPORTED;
@@ -319,4 +329,24 @@ TCompletionCode IAdapter_1_6 ::SaveMetricsDeviceToFile(const char *fileName, voi
return CC_ERROR_NOT_SUPPORTED;
}
const TSubDeviceParams_1_9 *IAdapter_1_9::GetSubDeviceParams(const uint32_t subDeviceIndex) {
UNRECOVERABLE_IF(true);
return nullptr;
}
const TEngineParams_1_9 *IAdapter_1_9::GetEngineParams(const uint32_t subDeviceIndex, const uint32_t engineIndex) {
UNRECOVERABLE_IF(true);
return nullptr;
}
TCompletionCode IAdapter_1_9::OpenMetricsSubDevice(const uint32_t subDeviceIndex, IMetricsDevice_1_5 **metricsDevice) {
UNRECOVERABLE_IF(true);
return CC_ERROR_NOT_SUPPORTED;
}
TCompletionCode IAdapter_1_9::OpenMetricsSubDeviceFromFile(const uint32_t subDeviceIndex, const char *fileName, void *openParams, IMetricsDevice_1_5 **metricsDevice) {
UNRECOVERABLE_IF(true);
return CC_ERROR_NOT_SUPPORTED;
}
} // namespace MetricsDiscovery

View File

@@ -26,8 +26,10 @@ using MetricGroup = WhiteBox<::L0::MetricGroup>;
using MetricsDiscovery::IAdapter_1_6;
using MetricsDiscovery::IAdapter_1_8;
using MetricsDiscovery::IAdapter_1_9;
using MetricsDiscovery::IAdapterGroup_1_6;
using MetricsDiscovery::IAdapterGroup_1_8;
using MetricsDiscovery::IAdapterGroup_1_9;
using MetricsDiscovery::IConcurrentGroup_1_5;
using MetricsDiscovery::IInformation_1_0;
using MetricsDiscovery::IMetric_1_0;
@@ -38,13 +40,16 @@ using MetricsDiscovery::IOverride_1_2;
using MetricsDiscovery::TAdapterGroupParams_1_6;
using MetricsDiscovery::TAdapterParams_1_6;
using MetricsDiscovery::TAdapterParams_1_8;
using MetricsDiscovery::TAdapterParams_1_9;
using MetricsDiscovery::TCompletionCode;
using MetricsDiscovery::TConcurrentGroupParams_1_0;
using MetricsDiscovery::TEngineParams_1_9;
using MetricsDiscovery::TGlobalSymbol_1_0;
using MetricsDiscovery::TMetricParams_1_0;
using MetricsDiscovery::TMetricsDeviceParams_1_2;
using MetricsDiscovery::TMetricSetParams_1_4;
using MetricsDiscovery::TSamplingType;
using MetricsDiscovery::TSubDeviceParams_1_9;
using MetricsDiscovery::TTypedValue_1_0;
struct MockMetricsDiscoveryApi {
@@ -53,31 +58,37 @@ struct MockMetricsDiscoveryApi {
static TCompletionCode MD_STDCALL OpenMetricsDeviceFromFile(const char *fileName, void *openParams, IMetricsDevice_1_5 **device);
static TCompletionCode MD_STDCALL CloseMetricsDevice(IMetricsDevice_1_5 *device);
static TCompletionCode MD_STDCALL SaveMetricsDeviceToFile(const char *fileName, void *saveParams, IMetricsDevice_1_5 *device);
static TCompletionCode MD_STDCALL OpenAdapterGroup(IAdapterGroup_1_8 **adapterGroup);
static TCompletionCode MD_STDCALL OpenAdapterGroup(IAdapterGroup_1_9 **adapterGroup);
// Mocked api functions.
MOCK_METHOD(TCompletionCode, MockOpenMetricsDeviceFromFile, (const char *, void *, IMetricsDevice_1_5 **));
MOCK_METHOD(TCompletionCode, MockCloseMetricsDevice, (IMetricsDevice_1_5 *));
MOCK_METHOD(TCompletionCode, MockSaveMetricsDeviceToFile, (const char *, void *, IMetricsDevice_1_5 *));
MOCK_METHOD(TCompletionCode, MockOpenAdapterGroup, (IAdapterGroup_1_8 * *adapterGroup));
MOCK_METHOD(TCompletionCode, MockOpenAdapterGroup, (IAdapterGroup_1_9 * *adapterGroup));
};
template <>
class Mock<IAdapterGroup_1_8> : public IAdapterGroup_1_8 {
class Mock<IAdapterGroup_1_9> : public IAdapterGroup_1_9 {
public:
Mock(){};
MOCK_METHOD(IAdapter_1_8 *, GetAdapter, (uint32_t), (override));
MOCK_METHOD(IAdapter_1_9 *, GetAdapter, (uint32_t), (override));
MOCK_METHOD(const TAdapterGroupParams_1_6 *, GetParams, (), (const, override));
MOCK_METHOD(TCompletionCode, Close, (), (override));
};
template <>
class Mock<IAdapter_1_8> : public IAdapter_1_8 {
class Mock<IAdapter_1_9> : public IAdapter_1_9 {
public:
Mock(){};
MOCK_METHOD(const TAdapterParams_1_8 *, GetParams, (), (const, override));
// 1.9
MOCK_METHOD(const TSubDeviceParams_1_9 *, GetSubDeviceParams, (const uint32_t subDeviceIndex), (override));
MOCK_METHOD(const TEngineParams_1_9 *, GetEngineParams, (const uint32_t subDeviceIndex, const uint32_t engineIndex), (override));
MOCK_METHOD(TCompletionCode, OpenMetricsSubDevice, (const uint32_t subDeviceIndex, IMetricsDevice_1_5 **metricsDevice), (override));
MOCK_METHOD(TCompletionCode, OpenMetricsSubDeviceFromFile, (const uint32_t subDeviceIndex, const char *fileName, void *openParams, IMetricsDevice_1_5 **metricsDevice), (override));
MOCK_METHOD(const TAdapterParams_1_9 *, GetParams, (), (const, override));
MOCK_METHOD(TCompletionCode, Reset, (), (override));
MOCK_METHOD(TCompletionCode, OpenMetricsDevice, (IMetricsDevice_1_5 **), (override));
MOCK_METHOD(TCompletionCode, OpenMetricsDeviceFromFile, (const char *, void *, IMetricsDevice_1_5 **), (override));
@@ -146,6 +157,7 @@ struct Mock<MetricEnumeration> : public MetricEnumeration {
Mock(::L0::MetricContext &metricContext);
~Mock() override;
using MetricEnumeration::cleanupMetricsDiscovery;
using MetricEnumeration::hMetricsDiscovery;
using MetricEnumeration::initializationState;
using MetricEnumeration::openAdapterGroup;
@@ -157,12 +169,12 @@ struct Mock<MetricEnumeration> : public MetricEnumeration {
// Mock metric enumeration functions.
MOCK_METHOD(bool, isInitialized, (), (override));
MOCK_METHOD(ze_result_t, loadMetricsDiscovery, (), (override));
MOCK_METHOD(MetricsDiscovery::IAdapter_1_8 *, getMetricsAdapter, (), (override));
MOCK_METHOD(MetricsDiscovery::IAdapter_1_9 *, getMetricsAdapter, (), (override));
MOCK_METHOD(bool, getAdapterId, (uint32_t & drmMajor, uint32_t &drmMinor), (override));
// Not mocked metrics enumeration functions.
bool baseIsInitialized() { return MetricEnumeration::isInitialized(); }
IAdapter_1_8 *baseGetMetricsAdapter() { return MetricEnumeration::getMetricsAdapter(); }
IAdapter_1_9 *baseGetMetricsAdapter() { return MetricEnumeration::getMetricsAdapter(); }
bool baseGetAdapterId(uint32_t &adapterMajor, uint32_t &adapterMinor) { return MetricEnumeration::getAdapterId(adapterMajor, adapterMinor); }
ze_result_t baseLoadMetricsDiscovery() { return MetricEnumeration::loadMetricsDiscovery(); }

View File

@@ -1966,22 +1966,94 @@ TEST_F(MetricEnumerationTest, givenNotLoadedMetricsLibraryAndDiscoveryWhenLoadDe
EXPECT_EQ(metricContext.isInitialized(), false);
}
TEST_F(MetricEnumerationTest, givenLoadedMetricsLibraryAndDiscoveryAndMetricsLibraryNotInitializedWhenLoadDependenciesThenReturnFail) {
TEST_F(MetricEnumerationTest, givenRootDeviceWhenLoadDependenciesIsCalledThenLegacyOpenMetricsDeviceWillBeCalled) {
EXPECT_CALL(*mockMetricEnumeration, loadMetricsDiscovery())
.Times(1)
.WillOnce(Return(ZE_RESULT_SUCCESS));
auto &metricContext = device->getMetricContext();
Mock<IAdapterGroup_1_9> mockAdapterGroup;
Mock<IAdapter_1_9> mockAdapter;
Mock<IMetricsDevice_1_5> mockDevice;
EXPECT_CALL(*mockMetricsLibrary, load())
.Times(1)
.WillOnce(Return(true));
mockMetricsLibrary->initializationState = ZE_RESULT_ERROR_NOT_AVAILABLE;
EXPECT_CALL(*mockMetricEnumeration, loadMetricsDiscovery())
.Times(1)
.WillOnce(Return(ZE_RESULT_SUCCESS));
auto &metricContext = device->getMetricContext();
EXPECT_EQ(metricContext.loadDependencies(), false);
EXPECT_EQ(metricContext.isInitialized(), false);
EXPECT_CALL(*Mock<MetricEnumeration>::g_mockApi, MockOpenAdapterGroup(_))
.Times(1)
.WillOnce(DoAll(::testing::SetArgPointee<0>(&mockAdapterGroup), Return(TCompletionCode::CC_OK)));
EXPECT_CALL(*mockMetricEnumeration, getMetricsAdapter())
.Times(1)
.WillOnce(Return(&mockAdapter));
EXPECT_CALL(mockAdapter, OpenMetricsDevice(_))
.Times(1)
.WillOnce(DoAll(::testing::SetArgPointee<0>(&mockDevice), Return(TCompletionCode::CC_OK)));
EXPECT_CALL(mockAdapter, CloseMetricsDevice(_))
.Times(1)
.WillOnce(Return(TCompletionCode::CC_OK));
EXPECT_CALL(mockDevice, GetParams())
.Times(1)
.WillOnce(Return(&metricsDeviceParams));
// Use first sub device.
metricContext.setSubDeviceIndex(0);
mockMetricsLibrary->initializationState = ZE_RESULT_SUCCESS;
EXPECT_EQ(metricContext.loadDependencies(), true);
EXPECT_EQ(metricContext.isInitialized(), true);
EXPECT_EQ(mockMetricEnumeration->baseIsInitialized(), true);
EXPECT_EQ(mockMetricEnumeration->cleanupMetricsDiscovery(), ZE_RESULT_SUCCESS);
}
TEST_F(MetricEnumerationTest, givenSubDeviceWhenLoadDependenciesIsCalledThenOpenMetricsSubDeviceWillBeCalled) {
auto &metricContext = device->getMetricContext();
Mock<IAdapterGroup_1_9> mockAdapterGroup;
Mock<IAdapter_1_9> mockAdapter;
Mock<IMetricsDevice_1_5> mockDevice;
EXPECT_CALL(*mockMetricsLibrary, load())
.Times(1)
.WillOnce(Return(true));
EXPECT_CALL(*mockMetricEnumeration, loadMetricsDiscovery())
.Times(1)
.WillOnce(Return(ZE_RESULT_SUCCESS));
EXPECT_CALL(*Mock<MetricEnumeration>::g_mockApi, MockOpenAdapterGroup(_))
.Times(1)
.WillOnce(DoAll(::testing::SetArgPointee<0>(&mockAdapterGroup), Return(TCompletionCode::CC_OK)));
EXPECT_CALL(*mockMetricEnumeration, getMetricsAdapter())
.Times(1)
.WillOnce(Return(&mockAdapter));
EXPECT_CALL(mockAdapter, OpenMetricsSubDevice(_, _))
.Times(1)
.WillOnce(DoAll(::testing::SetArgPointee<1>(&mockDevice), Return(TCompletionCode::CC_OK)));
EXPECT_CALL(mockAdapter, CloseMetricsDevice(_))
.Times(1)
.WillOnce(Return(TCompletionCode::CC_OK));
EXPECT_CALL(mockDevice, GetParams())
.Times(1)
.WillOnce(Return(&metricsDeviceParams));
// Use first sub device.
metricContext.setSubDeviceIndex(1);
mockMetricsLibrary->initializationState = ZE_RESULT_SUCCESS;
EXPECT_EQ(metricContext.loadDependencies(), true);
EXPECT_EQ(metricContext.isInitialized(), true);
EXPECT_EQ(mockMetricEnumeration->baseIsInitialized(), true);
EXPECT_EQ(mockMetricEnumeration->cleanupMetricsDiscovery(), ZE_RESULT_SUCCESS);
}
} // namespace ult
} // namespace L0

View File

@@ -6,6 +6,7 @@
*/
#include "shared/source/os_interface/device_factory.h"
#include "shared/test/common/mocks/ult_device_factory.h"
#include "test.h"
@@ -879,5 +880,52 @@ TEST_F(MetricQueryPoolTest, givenExecutionQueryTypeAndMetricsLibraryWillFailWhen
EXPECT_EQ(zeEventPoolDestroy(eventPoolHandle), ZE_RESULT_SUCCESS);
}
TEST_F(MetricQueryPoolTest, givenRootDeviceWhenGetSubDeviceClientOptionsIsCalledThenReturnRootDeviceProperties) {
auto &metricContext = device->getMetricContext();
auto &metricsLibrary = metricContext.getMetricsLibrary();
auto subDevice = ClientOptionsData_1_0{};
auto subDeviceIndex = ClientOptionsData_1_0{};
auto subDeviceCount = ClientOptionsData_1_0{};
metricsLibrary.getSubDeviceClientOptions(*device->getNEODevice(), subDevice, subDeviceIndex, subDeviceCount);
// Root device
EXPECT_EQ(subDevice.Type, MetricsLibraryApi::ClientOptionsType::SubDevice);
EXPECT_EQ(subDevice.SubDevice.Enabled, false);
EXPECT_EQ(subDeviceIndex.Type, MetricsLibraryApi::ClientOptionsType::SubDeviceIndex);
EXPECT_EQ(subDeviceIndex.SubDeviceIndex.Index, 0u);
EXPECT_EQ(subDeviceCount.Type, MetricsLibraryApi::ClientOptionsType::SubDeviceCount);
EXPECT_EQ(subDeviceCount.SubDeviceCount.Count, device->getNEODevice()->getNumAvailableDevices());
}
TEST_F(MetricQueryPoolTest, givenSubDeviceWhenGetSubDeviceClientOptionsIsCalledThenReturnSubDeviceProperties) {
auto deviceFactory = std::make_unique<UltDeviceFactory>(1, 4);
auto rootDevice = deviceFactory->rootDevices[0];
auto &metricContext = device->getMetricContext();
auto &metricsLibrary = metricContext.getMetricsLibrary();
auto subDevice = ClientOptionsData_1_0{};
auto subDeviceIndex = ClientOptionsData_1_0{};
auto subDeviceCount = ClientOptionsData_1_0{};
// Sub devices
for (uint32_t i = 0, count = rootDevice->getNumAvailableDevices(); i < count; ++i) {
metricsLibrary.getSubDeviceClientOptions(*rootDevice->subdevices[i], subDevice, subDeviceIndex, subDeviceCount);
EXPECT_EQ(subDevice.Type, MetricsLibraryApi::ClientOptionsType::SubDevice);
EXPECT_EQ(subDevice.SubDevice.Enabled, true);
EXPECT_EQ(subDeviceIndex.Type, MetricsLibraryApi::ClientOptionsType::SubDeviceIndex);
EXPECT_EQ(subDeviceIndex.SubDeviceIndex.Index, i);
EXPECT_EQ(subDeviceCount.Type, MetricsLibraryApi::ClientOptionsType::SubDeviceCount);
EXPECT_EQ(subDeviceCount.SubDeviceCount.Count, rootDevice->getNumAvailableDevices());
}
}
} // namespace ult
} // namespace L0

View File

@@ -29,7 +29,7 @@ TEST_F(MetricEnumerationTestWindows, givenCorrectWindowsAdapterWhenGetMetricsAda
auto &osInterface = rootDevice->osInterface;
auto wddm = new WddmMock(*rootDevice);
auto adapterGroupParams = TAdapterGroupParams_1_6{};
auto adapterParams = TAdapterParams_1_8{};
auto adapterParams = TAdapterParams_1_9{};
osInterface = std::make_unique<NEO::OSInterface>();
osInterface->get()->setWddm(wddm);