Query engine info with distances

If prelim kernel is being used, query distances
and set correctly number of available engines

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2022-01-04 14:48:05 +00:00
committed by Compute-Runtime-Automation
parent 54d377d025
commit 26a24e8fde
18 changed files with 651 additions and 70 deletions

View File

@@ -1,5 +1,5 @@
#
# Copyright (C) 2019-2021 Intel Corporation
# Copyright (C) 2019-2022 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
@@ -52,7 +52,8 @@ set(NEO_CORE_OS_INTERFACE_LINUX
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_prelim.cpp
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}ioctl_helper_getter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/engine_info.h
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}engine_info_impl.h
${CMAKE_CURRENT_SOURCE_DIR}/engine_info.cpp
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}engine_info_extended.cpp
${CMAKE_CURRENT_SOURCE_DIR}/flags${BRANCH_DIR_SUFFIX}drm_query_flags.h
${CMAKE_CURRENT_SOURCE_DIR}/memory_info.h
${CMAKE_CURRENT_SOURCE_DIR}/memory_info.cpp

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2021 Intel Corporation
* Copyright (C) 2018-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -950,4 +950,85 @@ bool Drm::queryMemoryInfo() {
return false;
}
bool Drm::queryEngineInfo(bool isSysmanEnabled) {
auto ioctlHelper = IoctlHelper::get(this);
auto enginesQuery = this->query(ioctlHelper->getEngineInfoIoctlVal(), DrmQueryItemFlags::empty);
if (enginesQuery.empty()) {
return false;
}
auto engines = ioctlHelper->translateToEngineCaps(enginesQuery);
auto memInfo = memoryInfo.get();
if (!memInfo) {
return false;
}
auto &memoryRegions = memInfo->getDrmRegionInfos();
auto tileCount = 0u;
std::vector<DistanceInfo> distanceInfos;
for (const auto &region : memoryRegions) {
if (I915_MEMORY_CLASS_DEVICE == region.region.memoryClass) {
tileCount++;
DistanceInfo distanceInfo{};
distanceInfo.region = region.region;
for (const auto &engine : engines) {
switch (engine.engine.engineClass) {
case I915_ENGINE_CLASS_RENDER:
case I915_ENGINE_CLASS_COPY:
distanceInfo.engine = engine.engine;
distanceInfos.push_back(distanceInfo);
break;
case I915_ENGINE_CLASS_VIDEO:
case I915_ENGINE_CLASS_VIDEO_ENHANCE:
if (isSysmanEnabled == true) {
distanceInfo.engine = engine.engine;
distanceInfos.push_back(distanceInfo);
}
break;
default:
if (engine.engine.engineClass == ioctlHelper->getComputeEngineClass()) {
distanceInfo.engine = engine.engine;
distanceInfos.push_back(distanceInfo);
}
break;
}
}
}
}
auto hwInfo = rootDeviceEnvironment.getMutableHardwareInfo();
if (tileCount == 0u) {
this->engineInfo.reset(new EngineInfo(this, hwInfo, engines));
return true;
}
std::vector<drm_i915_query_item> queryItems{distanceInfos.size()};
auto ret = ioctlHelper->queryDistances(this, queryItems, distanceInfos);
if (ret != 0) {
return false;
}
const bool queryUnsupported = std::all_of(queryItems.begin(), queryItems.end(),
[](const drm_i915_query_item &item) { return item.length == -EINVAL; });
if (queryUnsupported) {
DEBUG_BREAK_IF(tileCount != 1);
this->engineInfo.reset(new EngineInfo(this, hwInfo, engines));
return true;
}
memInfo->assignRegionsFromDistances(distanceInfos);
auto &multiTileArchInfo = const_cast<GT_MULTI_TILE_ARCH_INFO &>(hwInfo->gtSystemInfo.MultiTileArchInfo);
multiTileArchInfo.IsValid = true;
multiTileArchInfo.TileCount = tileCount;
multiTileArchInfo.TileMask = static_cast<uint8_t>(maxNBitValue(tileCount));
this->engineInfo.reset(new EngineInfo(this, hwInfo, tileCount, distanceInfos, queryItems, engines));
return true;
}
} // namespace NEO

View File

@@ -9,7 +9,7 @@
#include "shared/source/helpers/string.h"
#include "shared/source/os_interface/linux/cache_info_impl.h"
#include "shared/source/os_interface/linux/drm_engine_mapper.h"
#include "shared/source/os_interface/linux/engine_info_impl.h"
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "shared/source/os_interface/linux/memory_info.h"
#include "shared/source/os_interface/linux/sys_calls.h"
@@ -32,17 +32,6 @@ std::string getIoctlParamStringRemaining(int param) {
}
} // namespace IoctlToStringHelper
bool Drm::queryEngineInfo(bool isSysmanEnabled) {
auto ioctlHelper = IoctlHelper::get(this);
auto dataQuery = this->query(ioctlHelper->getEngineInfoIoctlVal(), DrmQueryItemFlags::empty);
if (dataQuery.empty()) {
return false;
}
auto engines = ioctlHelper->translateToEngineCaps(dataQuery);
this->engineInfo.reset(new EngineInfoImpl(engines));
return true;
}
unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType, bool engineInstancedDevice) {
return DrmEngineMapper::engineNodeMap(engineType);
}

View File

@@ -0,0 +1,145 @@
/*
* Copyright (C) 2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/helpers/bit_helpers.h"
#include "shared/source/helpers/constants.h"
#include "shared/source/helpers/debug_helpers.h"
#include "shared/source/helpers/engine_node_helper.h"
#include "shared/source/helpers/hw_info.h"
#include <array>
namespace NEO {
namespace DrmEngineMappingHelper {
constexpr std::array<aub_stream::EngineType, 9> engineMapping = {{aub_stream::ENGINE_BCS, aub_stream::ENGINE_BCS1, aub_stream::ENGINE_BCS2,
aub_stream::ENGINE_BCS3, aub_stream::ENGINE_BCS4, aub_stream::ENGINE_BCS5,
aub_stream::ENGINE_BCS6, aub_stream::ENGINE_BCS7, aub_stream::ENGINE_BCS8}};
} // namespace DrmEngineMappingHelper
EngineInfo::EngineInfo(Drm *drm, HardwareInfo *hwInfo, const std::vector<EngineCapabilities> &engineInfos)
: engines(engineInfos), tileToEngineToInstanceMap(1) {
auto computeEngines = 0u;
BcsInfoMask bcsInfoMask = 0;
uint32_t numHostLinkCopyEngines = 0;
uint32_t numScaleUpLinkCopyEngines = 0;
for (const auto &engineInfo : engineInfos) {
auto &engine = engineInfo.engine;
tileToEngineMap.emplace(0, engine);
switch (engine.engineClass) {
case I915_ENGINE_CLASS_RENDER:
tileToEngineToInstanceMap[0][EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, *hwInfo)] = engine;
break;
case I915_ENGINE_CLASS_COPY:
assignCopyEngine(EngineInfo::getBaseCopyEngineType(engineInfo.capabilities), 0, engine,
bcsInfoMask, numHostLinkCopyEngines, numScaleUpLinkCopyEngines);
break;
default:
if (engine.engineClass == IoctlHelper::get(drm)->getComputeEngineClass()) {
tileToEngineToInstanceMap[0][static_cast<aub_stream::EngineType>(aub_stream::ENGINE_CCS + computeEngines)] = engine;
computeEngines++;
}
break;
}
}
setSupportedEngiesInfo(hwInfo, computeEngines, bcsInfoMask);
}
EngineInfo::EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<drm_i915_query_item> &queryItems, const std::vector<EngineCapabilities> &engineInfos)
: engines(engineInfos), tileToEngineToInstanceMap(tileCount) {
auto tile = 0u;
auto computeEnginesPerTile = 0u;
auto copyEnginesPerTile = 0u;
for (auto i = 0u; i < distanceInfos.size(); i++) {
if (i > 0u && distanceInfos[i].region.memoryInstance != distanceInfos[i - 1u].region.memoryInstance) {
tile++;
computeEnginesPerTile = 0u;
copyEnginesPerTile = 0u;
}
if (queryItems[i].length < 0 || distanceInfos[i].distance != 0)
continue;
auto engine = distanceInfos[i].engine;
tileToEngineMap.emplace(tile, engine);
switch (engine.engineClass) {
case I915_ENGINE_CLASS_RENDER:
tileToEngineToInstanceMap[tile][EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, *hwInfo)] = engine;
break;
case I915_ENGINE_CLASS_COPY:
tileToEngineToInstanceMap[tile][DrmEngineMappingHelper::engineMapping[copyEnginesPerTile]] = engine;
copyEnginesPerTile++;
break;
default:
if (engine.engineClass == IoctlHelper::get(drm)->getComputeEngineClass()) {
tileToEngineToInstanceMap[tile][static_cast<aub_stream::EngineType>(aub_stream::ENGINE_CCS + computeEnginesPerTile)] = engine;
computeEnginesPerTile++;
}
break;
}
}
BcsInfoMask bcsInfoMask = maxNBitValue(copyEnginesPerTile);
setSupportedEngiesInfo(hwInfo, computeEnginesPerTile, bcsInfoMask);
}
const EngineClassInstance *EngineInfo::getEngineInstance(uint32_t tile, aub_stream::EngineType engineType) const {
if (tile >= tileToEngineToInstanceMap.size()) {
return nullptr;
}
auto &engineToInstanceMap = tileToEngineToInstanceMap[tile];
auto iter = engineToInstanceMap.find(engineType);
if (iter == engineToInstanceMap.end()) {
return nullptr;
}
return &iter->second;
}
void EngineInfo::setSupportedEngiesInfo(HardwareInfo *hwInfo, uint32_t numComputeEngines, const BcsInfoMask &bcsInfoMask) {
auto &ccsInfo = hwInfo->gtSystemInfo.CCSInfo;
if (numComputeEngines > 0u) {
hwInfo->featureTable.flags.ftrCCSNode = true;
ccsInfo.IsValid = true;
ccsInfo.NumberOfCCSEnabled = numComputeEngines;
ccsInfo.Instances.CCSEnableMask = static_cast<uint32_t>(maxNBitValue(numComputeEngines));
} else {
hwInfo->capabilityTable.defaultEngineType = EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, *hwInfo);
hwInfo->featureTable.flags.ftrCCSNode = false;
ccsInfo.IsValid = false;
ccsInfo.NumberOfCCSEnabled = 0;
ccsInfo.Instances.CCSEnableMask = 0;
}
hwInfo->featureTable.ftrBcsInfo = bcsInfoMask;
}
uint32_t EngineInfo::getEngineTileIndex(const EngineClassInstance &engine) {
uint32_t tile = 0;
if (tileToEngineMap.empty()) {
return tile; //Empty map
}
for (auto itr = tileToEngineMap.begin(); itr != tileToEngineMap.end(); itr++) {
if ((itr->second.engineClass == engine.engineClass) && (itr->second.engineInstance == engine.engineInstance)) {
tile = itr->first;
break;
}
}
return tile;
}
void EngineInfo::getListOfEnginesOnATile(uint32_t tile, std::vector<EngineClassInstance> &listOfEngines) {
auto range = tileToEngineMap.equal_range(tile);
for (auto itr = range.first; itr != range.second; ++itr) {
listOfEngines.push_back(itr->second);
}
}
} // namespace NEO

View File

@@ -1,19 +1,49 @@
/*
* Copyright (C) 2019-2020 Intel Corporation
* Copyright (C) 2019-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "drm/i915_drm.h"
#include "engine_node.h"
#include "sku_info.h"
#include <cstdint>
#include <map>
#include <vector>
namespace NEO {
struct HardwareInfo;
class Drm;
struct EngineInfo {
EngineInfo() = default;
virtual ~EngineInfo() = 0;
public:
using EngineToInstanceMap = std::map<aub_stream::EngineType, EngineClassInstance>;
EngineInfo(Drm *drm, HardwareInfo *hwInfo, const std::vector<EngineCapabilities> &engineInfos);
EngineInfo(Drm *drm, HardwareInfo *hwInfo, uint32_t tileCount, const std::vector<DistanceInfo> &distanceInfos, const std::vector<drm_i915_query_item> &queryItems, const std::vector<EngineCapabilities> &engineInfos);
~EngineInfo() = default;
const EngineClassInstance *getEngineInstance(uint32_t tile, aub_stream::EngineType engineType) const;
uint32_t getEngineTileIndex(const EngineClassInstance &engine);
void getListOfEnginesOnATile(uint32_t tile, std::vector<EngineClassInstance> &listOfEngines);
std::vector<EngineCapabilities> engines;
protected:
static aub_stream::EngineType getBaseCopyEngineType(uint64_t capabilities);
static void setSupportedEngiesInfo(HardwareInfo *hwInfo, uint32_t numComputeEngines, const BcsInfoMask &bcsInfoMask);
void assignCopyEngine(aub_stream::EngineType baseEngineType, uint32_t tileId, const EngineClassInstance &engine,
BcsInfoMask &bcsInfoMask, uint32_t &numHostLinkCopyEngines, uint32_t &numScaleUpLinkCopyEngines);
std::vector<EngineToInstanceMap> tileToEngineToInstanceMap;
std::multimap<uint32_t, EngineClassInstance> tileToEngineMap;
};
inline EngineInfo::~EngineInfo() {}
} // namespace NEO

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/helpers/bit_helpers.h"
#include "shared/source/helpers/debug_helpers.h"
#include "shared/source/helpers/engine_node_helper.h"
#include "shared/source/os_interface/linux/engine_info.h"
namespace NEO {
aub_stream::EngineType EngineInfo::getBaseCopyEngineType(uint64_t capabilities) {
return aub_stream::EngineType::ENGINE_BCS;
}
void EngineInfo::assignCopyEngine(aub_stream::EngineType baseEngineType, uint32_t tileId, const EngineClassInstance &engine,
BcsInfoMask &bcsInfoMask, uint32_t &numHostLinkCopyEngines, uint32_t &numScaleUpLinkCopyEngines) {
// Main copy engine:
UNRECOVERABLE_IF(baseEngineType != aub_stream::ENGINE_BCS);
UNRECOVERABLE_IF(bcsInfoMask.test(0));
tileToEngineToInstanceMap[tileId][aub_stream::ENGINE_BCS] = engine;
bcsInfoMask.set(0, true);
}
} // namespace NEO

View File

@@ -1,32 +0,0 @@
/*
* Copyright (C) 2020-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/helpers/basic_math.h"
#include "shared/source/helpers/debug_helpers.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/source/os_interface/linux/engine_info.h"
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "drm/i915_drm.h"
#include <cstddef>
#include <cstdint>
#include <vector>
namespace NEO {
struct EngineInfoImpl : public EngineInfo {
~EngineInfoImpl() override = default;
EngineInfoImpl(const std::vector<EngineCapabilities> &engineInfos) : engines(engineInfos) {
}
std::vector<EngineCapabilities> engines;
};
} // namespace NEO

View File

@@ -70,6 +70,7 @@ class IoctlHelper {
virtual int32_t getEngineInfoIoctlVal() = 0;
virtual std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) = 0;
virtual uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) = 0;
virtual int32_t getComputeEngineClass() = 0;
};
class IoctlHelperUpstream : public IoctlHelper {
@@ -90,6 +91,7 @@ class IoctlHelperUpstream : public IoctlHelper {
int32_t getEngineInfoIoctlVal() override;
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
int32_t getComputeEngineClass() override;
};
template <PRODUCT_FAMILY gfxProduct>
@@ -121,6 +123,7 @@ class IoctlHelperPrelim20 : public IoctlHelper {
int32_t getEngineInfoIoctlVal() override;
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
int32_t getComputeEngineClass() override;
};
} // namespace NEO

View File

@@ -235,4 +235,8 @@ uint32_t IoctlHelperPrelim20::queryDistances(Drm *drm, std::vector<drm_i915_quer
return ret;
}
int32_t IoctlHelperPrelim20::getComputeEngineClass() {
return PRELIM_I915_ENGINE_CLASS_COMPUTE;
}
} // namespace NEO

View File

@@ -126,4 +126,8 @@ uint32_t IoctlHelperUpstream::queryDistances(Drm *drm, std::vector<drm_i915_quer
return 0;
}
int32_t IoctlHelperUpstream::getComputeEngineClass() {
return 4;
}
} // namespace NEO

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2021 Intel Corporation
* Copyright (C) 2018-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -11,6 +11,7 @@
#include "shared/source/helpers/hw_helper.h"
#include "shared/source/helpers/string.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/test/common/helpers/default_hw_info.h"
#include <cstdio>
#include <fstream>
@@ -215,7 +216,9 @@ class DrmMockEngine : public DrmMock {
uint32_t i915QuerySuccessCount = std::numeric_limits<uint32_t>::max();
uint32_t queryEngineInfoSuccessCount = std::numeric_limits<uint32_t>::max();
DrmMockEngine(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMock(rootDeviceEnvironment) {}
DrmMockEngine(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMock(rootDeviceEnvironment) {
rootDeviceEnvironment.setHwInfo(defaultHwInfo.get());
}
int handleRemainingRequests(unsigned long request, void *arg) override;