feat(zebin): add thread scheduling mode support

Resolves: NEO-7197

Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
Krystian Chmielewski
2022-08-12 14:58:41 +00:00
committed by Compute-Runtime-Automation
parent 01b324953e
commit 18adbed233
22 changed files with 149 additions and 52 deletions

View File

@@ -151,6 +151,12 @@ static constexpr ConstStringRef simdSize("simd_size");
static constexpr ConstStringRef slmSize("slm_size");
static constexpr ConstStringRef subgroupIndependentForwardProgress("subgroup_independent_forward_progress");
static constexpr ConstStringRef workGroupWalkOrderDimensions("work_group_walk_order_dimensions");
static constexpr ConstStringRef threadSchedulingMode("thread_scheduling_mode");
namespace ThreadSchedulingMode {
static constexpr ConstStringRef ageBased("age_based");
static constexpr ConstStringRef roundRobin("round_robin");
static constexpr ConstStringRef roundRobinStall("round_robin_stall");
} // namespace ThreadSchedulingMode
} // namespace ExecutionEnv
namespace DebugEnv {
@@ -325,6 +331,14 @@ struct Version {
namespace Kernel {
namespace ExecutionEnv {
enum ThreadSchedulingMode : uint8_t {
ThreadSchedulingModeUnknown,
ThreadSchedulingModeAgeBased,
ThreadSchedulingModeRoundRobin,
ThreadSchedulingModeRoundRobinStall,
ThreadSchedulingModeMax
};
using ActualKernelStartOffsetT = int32_t;
using BarrierCountT = int32_t;
using DisableMidThreadPreemptionT = bool;
@@ -350,6 +364,7 @@ using SimdSizeT = int32_t;
using SlmSizeT = int32_t;
using SubgroupIndependentForwardProgressT = bool;
using WorkgroupWalkOrderDimensionsT = int32_t[3];
using ThreadSchedulingModeT = ThreadSchedulingMode;
namespace Defaults {
static constexpr BarrierCountT barrierCount = 0;
@@ -374,6 +389,7 @@ static constexpr RequireDisableEUFusionT requireDisableEUFusion = false;
static constexpr SlmSizeT slmSize = 0;
static constexpr SubgroupIndependentForwardProgressT subgroupIndependentForwardProgress = false;
static constexpr WorkgroupWalkOrderDimensionsT workgroupWalkOrderDimensions = {0, 1, 2};
static constexpr ThreadSchedulingModeT threadSchedulingMode = ThreadSchedulingModeUnknown;
} // namespace Defaults
static constexpr ConstStringRef required[] = {
@@ -402,6 +418,7 @@ struct ExecutionEnvBaseT {
SlmSizeT slmSize = Defaults::slmSize;
SubgroupIndependentForwardProgressT subgroupIndependentForwardProgress = Defaults::subgroupIndependentForwardProgress;
WorkgroupWalkOrderDimensionsT workgroupWalkOrderDimensions{Defaults::workgroupWalkOrderDimensions[0], Defaults::workgroupWalkOrderDimensions[1], Defaults::workgroupWalkOrderDimensions[2]};
ThreadSchedulingModeT threadSchedulingMode = Defaults::threadSchedulingMode;
};
struct ExperimentalPropertiesBaseT {

View File

@@ -58,6 +58,7 @@ static constexpr LookupArray<ConstStringRef, ArgType, 34> lookup({{{packedLocalI
{searchPathType, ArgType::ArgTypeVmeSearchPathType}}});
static_assert(lookup.size() == ArgType::ArgTypeMax - 1, "Every enum field must be present");
} // namespace ArgType
namespace MemoryAddressingMode {
namespace AddrModeTag = Tags::Kernel::PayloadArgument::MemoryAddressingMode;
using AddrMode = Types::Kernel::PayloadArgument::MemoryAddressingMode;
@@ -68,6 +69,7 @@ static constexpr LookupArray<ConstStringRef, AddrMode, 4> lookup({{{AddrModeTag:
static constexpr ConstStringRef name = "addressing mode";
static_assert(lookup.size() == AddrMode::MemoryAddressIngModeMax - 1, "Every enum field must be present");
} // namespace MemoryAddressingMode
namespace AddressSpace {
using namespace Tags::Kernel::PayloadArgument::AddrSpace;
using AddrSpace = Types::Kernel::PayloadArgument::AddressSpace;
@@ -80,6 +82,7 @@ static constexpr LookupArray<ConstStringRef, AddrSpace, 5> lookup({{{global, Add
{sampler, AddrSpace::AddressSpaceSampler}}});
static_assert(lookup.size() == AddrSpace::AddressSpaceMax - 1, "Every enum field must be present");
} // namespace AddressSpace
namespace AccessType {
using namespace Tags::Kernel::PayloadArgument::AccessType;
using AccessType = Types::Kernel::PayloadArgument::AccessType;
@@ -90,6 +93,7 @@ static constexpr LookupArray<ConstStringRef, AccessType, 3> lookup({{{readonly,
{readwrite, AccessType::AccessTypeReadwrite}}});
static_assert(lookup.size() == AccessType::AccessTypeMax - 1, "Every enum field must be present");
} // namespace AccessType
namespace AllocationType {
using namespace Tags::Kernel::PerThreadMemoryBuffer::AllocationType;
using AllocType = Types::Kernel::PerThreadMemoryBuffer::AllocationType;
@@ -99,6 +103,7 @@ static constexpr LookupArray<ConstStringRef, AllocType, 3> lookup({{{global, All
{slm, AllocType::AllocationTypeSlm}}});
static_assert(lookup.size() == AllocType::AllocationTypeMax - 1, "Every enum field must be present");
} // namespace AllocationType
namespace MemoryUsage {
using namespace NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PerThreadMemoryBuffer::MemoryUsage;
using MemoryUsage = NEO::Elf::ZebinKernelMetadata::Types::Kernel::PerThreadMemoryBuffer::MemoryUsage;
@@ -108,6 +113,7 @@ static constexpr LookupArray<ConstStringRef, MemoryUsage, 3> lookup({{{privateSp
{singleSpace, MemoryUsage::MemoryUsageSingleSpace}}});
static_assert(lookup.size() == MemoryUsage::MemoryUsageMax - 1, "Every enum field must be present");
} // namespace MemoryUsage
namespace ImageType {
using namespace Tags::Kernel::PayloadArgument::ImageType;
using ImageType = Types::Kernel::PayloadArgument::ImageType;
@@ -130,6 +136,7 @@ static constexpr LookupArray<ConstStringRef, ImageType, 16> lookup({{{imageTypeB
{imageType2DMediaBlock, ImageType::ImageType2DMediaBlock}}});
static_assert(lookup.size() == ImageType::ImageTypeMax - 1, "Every enum field must be present");
} // namespace ImageType
namespace SamplerType {
using namespace Tags::Kernel::PayloadArgument::SamplerType;
using SamplerType = Types::Kernel::PayloadArgument::SamplerType;
@@ -149,6 +156,16 @@ static constexpr LookupArray<ConstStringRef, SamplerType, 12> lookup({{{samplerT
static_assert(lookup.size() == SamplerType::SamplerTypeMax - 1, "Every enum field must be present");
} // namespace SamplerType
namespace ThreadSchedulingMode {
using namespace Tags::Kernel::ExecutionEnv::ThreadSchedulingMode;
using ThreadSchedulingMode = Types::Kernel::ExecutionEnv::ThreadSchedulingMode;
static constexpr ConstStringRef name = "thread scheduling mode";
static constexpr LookupArray<ConstStringRef, ThreadSchedulingMode, 3> lookup({{{ageBased, ThreadSchedulingMode::ThreadSchedulingModeAgeBased},
{roundRobin, ThreadSchedulingMode::ThreadSchedulingModeRoundRobin},
{roundRobinStall, ThreadSchedulingMode::ThreadSchedulingModeRoundRobinStall}}});
static_assert(lookup.size() == ThreadSchedulingMode::ThreadSchedulingModeMax - 1, "Every enum field must be present");
} // namespace ThreadSchedulingMode
template <typename T>
struct EnumLooker {};
@@ -157,39 +174,52 @@ struct EnumLooker<Types::Kernel::ArgType> {
static constexpr ConstStringRef name = ArgType::name;
static constexpr auto members = ArgType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::MemoryAddressingMode> {
static constexpr ConstStringRef name = MemoryAddressingMode::name;
static constexpr auto members = MemoryAddressingMode::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::AddressSpace> {
static constexpr ConstStringRef name = AddressSpace::name;
static constexpr auto members = AddressSpace::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::AccessType> {
static constexpr ConstStringRef name = AccessType::name;
static constexpr auto members = AccessType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PerThreadMemoryBuffer::AllocationType> {
static constexpr ConstStringRef name = AllocationType::name;
static constexpr auto members = AllocationType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PerThreadMemoryBuffer::MemoryUsage> {
static constexpr ConstStringRef name = MemoryUsage::name;
static constexpr auto members = MemoryUsage::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::ImageType> {
static constexpr ConstStringRef name = ImageType::name;
static constexpr auto members = ImageType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::SamplerType> {
static constexpr ConstStringRef name = SamplerType::name;
static constexpr auto members = SamplerType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::ExecutionEnv::ThreadSchedulingMode> {
static constexpr ConstStringRef name = ThreadSchedulingMode::name;
static constexpr auto members = ThreadSchedulingMode::lookup;
};
} // namespace NEO::Zebin::ZeInfo::EnumLookup