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:
Mateusz Jablonski
2024-09-10 16:30:25 +00:00
committed by Compute-Runtime-Automation
parent ce122fb1fa
commit bc5237ca8a
7 changed files with 79 additions and 3 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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