feature: add support for query l3 bank count in xe-prelim
Related-To: NEO-11125 Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
parent
ce122fb1fa
commit
bc5237ca8a
|
@ -443,9 +443,10 @@ bool IoctlHelperXe::setGpuCpuTimes(TimeStampData *pGpuCpuTime, OSTime *osTime) {
|
|||
}
|
||||
|
||||
void IoctlHelperXe::getTopologyData(size_t nTiles, std::vector<std::bitset<8>> *geomDss, std::vector<std::bitset<8>> *computeDss,
|
||||
std::vector<std::bitset<8>> *euDss, DrmQueryTopologyData &topologyData, bool &isComputeDssEmpty) {
|
||||
std::vector<std::bitset<8>> *euDss, std::vector<std::bitset<8>> *l3BanksMask, DrmQueryTopologyData &topologyData, bool &isComputeDssEmpty) {
|
||||
int subSliceCount = 0;
|
||||
int euPerDss = 0;
|
||||
int l3Banks = 0;
|
||||
|
||||
for (auto tileId = 0u; tileId < nTiles; tileId++) {
|
||||
|
||||
|
@ -467,9 +468,15 @@ void IoctlHelperXe::getTopologyData(size_t nTiles, std::vector<std::bitset<8>> *
|
|||
euPerDssPerTile += euDss[tileId][byte].count();
|
||||
}
|
||||
|
||||
int l3BanksPerTile = 0;
|
||||
for (auto byte = 0u; byte < l3BanksMask[tileId].size(); byte++) {
|
||||
l3BanksPerTile += l3BanksMask[tileId][byte].count();
|
||||
}
|
||||
|
||||
// pick smallest config
|
||||
subSliceCount = (subSliceCount == 0) ? subSliceCountPerTile : std::min(subSliceCount, subSliceCountPerTile);
|
||||
euPerDss = (euPerDss == 0) ? euPerDssPerTile : std::min(euPerDss, euPerDssPerTile);
|
||||
l3Banks = (l3Banks == 0) ? l3BanksPerTile : std::min(l3Banks, l3BanksPerTile);
|
||||
|
||||
// pick max config
|
||||
topologyData.maxSubSlicesPerSlice = std::max(topologyData.maxSubSlicesPerSlice, subSliceCountPerTile);
|
||||
|
@ -480,6 +487,7 @@ void IoctlHelperXe::getTopologyData(size_t nTiles, std::vector<std::bitset<8>> *
|
|||
topologyData.subSliceCount = subSliceCount;
|
||||
topologyData.euCount = subSliceCount * euPerDss;
|
||||
topologyData.maxSlices = 1;
|
||||
topologyData.numL3Banks = l3Banks;
|
||||
}
|
||||
|
||||
void IoctlHelperXe::getTopologyMap(size_t nTiles, std::vector<std::bitset<8>> *dssInfo, TopologyMap &topologyMap) {
|
||||
|
@ -516,6 +524,7 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
|
|||
StackVec<std::vector<std::bitset<8>>, 2> geomDss;
|
||||
StackVec<std::vector<std::bitset<8>>, 2> computeDss;
|
||||
StackVec<std::vector<std::bitset<8>>, 2> euDss;
|
||||
StackVec<std::vector<std::bitset<8>>, 2> l3Banks;
|
||||
|
||||
auto topologySize = queryGtTopology.size();
|
||||
auto dataPtr = queryGtTopology.data();
|
||||
|
@ -524,6 +533,7 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
|
|||
geomDss.resize(numTiles);
|
||||
computeDss.resize(numTiles);
|
||||
euDss.resize(numTiles);
|
||||
l3Banks.resize(numTiles);
|
||||
bool receivedDssInfo = false;
|
||||
while (topologySize >= sizeof(drm_xe_query_topology_mask)) {
|
||||
drm_xe_query_topology_mask *topo = reinterpret_cast<drm_xe_query_topology_mask *>(dataPtr);
|
||||
|
@ -545,6 +555,8 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
|
|||
default:
|
||||
if (isEuPerDssTopologyType(topo->type)) {
|
||||
fillMask(euDss[tileId], topo);
|
||||
} else if (isL3BankTopologyType(topo->type)) {
|
||||
fillMask(l3Banks[tileId], topo);
|
||||
} else {
|
||||
xeLog("Unhandle GT Topo type: %d\n", topo->type);
|
||||
}
|
||||
|
@ -557,7 +569,7 @@ bool IoctlHelperXe::getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTo
|
|||
}
|
||||
|
||||
bool isComputeDssEmpty = false;
|
||||
getTopologyData(numTiles, geomDss.begin(), computeDss.begin(), euDss.begin(), topologyData, isComputeDssEmpty);
|
||||
getTopologyData(numTiles, geomDss.begin(), computeDss.begin(), euDss.begin(), l3Banks.begin(), topologyData, isComputeDssEmpty);
|
||||
|
||||
auto &dssInfo = isComputeDssEmpty ? geomDss : computeDss;
|
||||
getTopologyMap(numTiles, dssInfo.begin(), topologyMap);
|
||||
|
@ -1723,4 +1735,7 @@ void IoctlHelperXe::querySupportedFeatures() {
|
|||
bool IoctlHelperXe::isEuPerDssTopologyType(uint16_t topologyType) const {
|
||||
return topologyType == DRM_XE_TOPO_EU_PER_DSS;
|
||||
}
|
||||
bool IoctlHelperXe::isL3BankTopologyType(uint16_t topologyType) const {
|
||||
return false;
|
||||
}
|
||||
} // namespace NEO
|
||||
|
|
|
@ -113,7 +113,7 @@ class IoctlHelperXe : public IoctlHelper {
|
|||
std::unique_ptr<MemoryInfo> createMemoryInfo() override;
|
||||
size_t getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const override;
|
||||
void setupIpVersion() override;
|
||||
void getTopologyData(size_t nTiles, std::vector<std::bitset<8>> *geomDss, std::vector<std::bitset<8>> *computeDss, std::vector<std::bitset<8>> *euDss, DrmQueryTopologyData &topologyData, bool &isComputeDssEmpty);
|
||||
void getTopologyData(size_t nTiles, std::vector<std::bitset<8>> *geomDss, std::vector<std::bitset<8>> *computeDss, std::vector<std::bitset<8>> *euDss, std::vector<std::bitset<8>> *l3BanksMask, DrmQueryTopologyData &topologyData, bool &isComputeDssEmpty);
|
||||
void getTopologyMap(size_t nTiles, std::vector<std::bitset<8>> *dssInfo, TopologyMap &topologyMap);
|
||||
|
||||
bool setGpuCpuTimes(TimeStampData *pGpuCpuTime, OSTime *osTime) override;
|
||||
|
@ -134,6 +134,7 @@ class IoctlHelperXe : public IoctlHelper {
|
|||
bool resourceRegistrationEnabled() override { return true; }
|
||||
bool isPreemptionSupported() override { return true; }
|
||||
virtual bool isEuPerDssTopologyType(uint16_t topologyType) const;
|
||||
virtual bool isL3BankTopologyType(uint16_t topologyType) const;
|
||||
|
||||
protected:
|
||||
static constexpr uint32_t maxContextSetProperties = 4;
|
||||
|
|
|
@ -15,4 +15,8 @@ bool IoctlHelperXePrelim::isEuPerDssTopologyType(uint16_t topologyType) const {
|
|||
return topologyType == DRM_XE_TOPO_EU_PER_DSS ||
|
||||
topologyType == DRM_XE_TOPO_SIMD16_EU_PER_DSS;
|
||||
}
|
||||
|
||||
bool IoctlHelperXePrelim::isL3BankTopologyType(uint16_t topologyType) const {
|
||||
return topologyType == DRM_XE_TOPO_L3_BANK;
|
||||
}
|
||||
} // namespace NEO
|
||||
|
|
|
@ -14,6 +14,7 @@ class IoctlHelperXePrelim : public IoctlHelperXe {
|
|||
public:
|
||||
using IoctlHelperXe::IoctlHelperXe;
|
||||
bool isEuPerDssTopologyType(uint16_t topologyType) const override;
|
||||
bool isL3BankTopologyType(uint16_t topologyType) const override;
|
||||
};
|
||||
|
||||
} // namespace NEO
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
using namespace NEO;
|
||||
|
||||
struct MockIoctlHelperXe : IoctlHelperXe {
|
||||
static const uint16_t mockL3BankTopologyType = 0x100;
|
||||
|
||||
using IoctlHelperXe::bindInfo;
|
||||
using IoctlHelperXe::contextParamEngine;
|
||||
using IoctlHelperXe::defaultEngine;
|
||||
|
@ -54,6 +56,14 @@ struct MockIoctlHelperXe : IoctlHelperXe {
|
|||
}
|
||||
return IoctlHelperXe::ioctl(fd, request, arg);
|
||||
}
|
||||
bool isL3BankTopologyType(uint16_t topologyType) const override {
|
||||
if (isL3BankTopologyTypeCallBase) {
|
||||
return IoctlHelperXe::isL3BankTopologyType(topologyType);
|
||||
}
|
||||
return topologyType == mockL3BankTopologyType;
|
||||
}
|
||||
|
||||
bool isL3BankTopologyTypeCallBase = true;
|
||||
bool failPerfDisable = false;
|
||||
bool failPerfEnable = false;
|
||||
bool failPerfOpen = false;
|
||||
|
|
|
@ -22,3 +22,14 @@ TEST(IoctlHelperXePrelimTest, givenSimd16EuPerDssTypeWhenCheckingIfTopologyIsEuP
|
|||
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_GEOMETRY));
|
||||
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
|
||||
}
|
||||
|
||||
TEST(IoctlHelperXePrelimTest, givenL3BankTypeWhenCheckingIfTopologyIsL3BankTypeThenSuccessIsReturned) {
|
||||
MockExecutionEnvironment executionEnvironment{};
|
||||
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
|
||||
IoctlHelperXePrelim ioctlHelper{*drm};
|
||||
EXPECT_TRUE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_L3_BANK));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_EU_PER_DSS));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_DSS_GEOMETRY));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_SIMD16_EU_PER_DSS));
|
||||
}
|
||||
|
|
|
@ -2406,6 +2406,15 @@ TEST(IoctlHelperXeTest, givenCorrectEuPerDssTypeWhenCheckingIfTopologyIsEuPerDss
|
|||
EXPECT_FALSE(ioctlHelper.isEuPerDssTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
|
||||
}
|
||||
|
||||
TEST(IoctlHelperXeTest, whenCheckingIfTopologyIsL3BankThenFalseIsReturned) {
|
||||
MockExecutionEnvironment executionEnvironment{};
|
||||
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
|
||||
IoctlHelperXe ioctlHelper{*drm};
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_EU_PER_DSS));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_DSS_GEOMETRY));
|
||||
EXPECT_FALSE(ioctlHelper.isL3BankTopologyType(DRM_XE_TOPO_DSS_COMPUTE));
|
||||
}
|
||||
|
||||
TEST(IoctlHelperXeTest, givenIoctlHelperWhenSettingExtContextThenCallExternalIoctlFunction) {
|
||||
MockExecutionEnvironment executionEnvironment{};
|
||||
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
|
||||
|
@ -2430,3 +2439,28 @@ TEST(IoctlHelperXeTest, givenIoctlHelperWhenSettingExtContextThenCallExternalIoc
|
|||
EXPECT_TRUE(ioctlHelper.ioctl(DrmIoctl::getResetStats, &resetStats));
|
||||
EXPECT_FALSE(ioctlCalled);
|
||||
}
|
||||
TEST(IoctlHelperXeTest, givenL3BankWhenGetTopologyDataAndMapThenResultsAreCorrect) {
|
||||
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
|
||||
xeIoctlHelper->isL3BankTopologyTypeCallBase = false;
|
||||
auto &hwInfo = *executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo();
|
||||
|
||||
xeIoctlHelper->initialize();
|
||||
|
||||
for (auto gtId = 0u; gtId < 4u; gtId++) {
|
||||
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0b11'1111, 0, 0, 0, 0, 0, 0, 0});
|
||||
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0, 0, 0, 0, 0, 0, 0, 0});
|
||||
drm->addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0});
|
||||
drm->addMockedQueryTopologyData(gtId, MockIoctlHelperXe::mockL3BankTopologyType, 8, {0b1111'0011, 0b1001'1111, 0, 0, 0, 0, 0, 0});
|
||||
}
|
||||
DrmQueryTopologyData topologyData{};
|
||||
TopologyMap topologyMap{};
|
||||
|
||||
auto result = xeIoctlHelper->getTopologyDataAndMap(hwInfo, topologyData, topologyMap);
|
||||
ASSERT_TRUE(result);
|
||||
|
||||
// verify topology data
|
||||
EXPECT_EQ(12, topologyData.numL3Banks);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue