mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-18 22:08:53 +08:00
Zebin: Add test for default execEnv values
Added test checking population of Kernel Descriptor with default execution environment values. Sorting. Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
c20ec6c148
commit
620484010d
@@ -293,6 +293,9 @@ using HasDpasT = bool;
|
||||
using HasFenceForImageAccessT = bool;
|
||||
using HasGlobalAtomicsT = bool;
|
||||
using HasMultiScratchSpacesT = bool;
|
||||
using HasNonKernelArgAtomicT = int32_t;
|
||||
using HasNonKernelArgLoadT = int32_t;
|
||||
using HasNonKernelArgStoreT = int32_t;
|
||||
using HasNoStatelessWriteT = bool;
|
||||
using HwPreemptionModeT = int32_t;
|
||||
using OffsetToSkipPerThreadDataLoadT = int32_t;
|
||||
@@ -303,9 +306,6 @@ using SimdSizeT = int32_t;
|
||||
using SlmSizeT = int32_t;
|
||||
using SubgroupIndependentForwardProgressT = bool;
|
||||
using WorkgroupWalkOrderDimensionsT = int32_t[3];
|
||||
using HasNonKernelArgLoad = int32_t;
|
||||
using HasNonKernelArgStore = int32_t;
|
||||
using HasNonKernelArgAtomic = int32_t;
|
||||
|
||||
namespace Defaults {
|
||||
static constexpr BarrierCountT barrierCount = 0;
|
||||
@@ -316,6 +316,9 @@ static constexpr HasDpasT hasDpas = false;
|
||||
static constexpr HasFenceForImageAccessT hasFenceForImageAccess = false;
|
||||
static constexpr HasGlobalAtomicsT hasGlobalAtomics = false;
|
||||
static constexpr HasMultiScratchSpacesT hasMultiScratchSpaces = false;
|
||||
static constexpr HasNonKernelArgAtomicT hasNonKernelArgAtomic = false;
|
||||
static constexpr HasNonKernelArgLoadT hasNonKernelArgLoad = false;
|
||||
static constexpr HasNonKernelArgStoreT hasNonKernelArgStore = false;
|
||||
static constexpr HasNoStatelessWriteT hasNoStatelessWrite = false;
|
||||
static constexpr HwPreemptionModeT hwPreemptionMode = -1;
|
||||
static constexpr OffsetToSkipPerThreadDataLoadT offsetToSkipPerThreadDataLoad = 0;
|
||||
@@ -325,9 +328,6 @@ static constexpr RequiredWorkGroupSizeT requiredWorkGroupSize = {0, 0, 0};
|
||||
static constexpr SlmSizeT slmSize = 0;
|
||||
static constexpr SubgroupIndependentForwardProgressT subgroupIndependentForwardProgress = false;
|
||||
static constexpr WorkgroupWalkOrderDimensionsT workgroupWalkOrderDimensions = {0, 1, 2};
|
||||
static constexpr HasNonKernelArgLoad hasNonKernelArgLoad = false;
|
||||
static constexpr HasNonKernelArgStore hasNonKernelArgStore = false;
|
||||
static constexpr HasNonKernelArgAtomic hasNonKernelArgAtomic = false;
|
||||
} // namespace Defaults
|
||||
|
||||
static constexpr ConstStringRef required[] = {
|
||||
@@ -359,9 +359,9 @@ struct ExecutionEnvBaseT {
|
||||
};
|
||||
|
||||
struct ExperimentalPropertiesBaseT {
|
||||
HasNonKernelArgLoad hasNonKernelArgLoad = Defaults::hasNonKernelArgLoad;
|
||||
HasNonKernelArgStore hasNonKernelArgStore = Defaults::hasNonKernelArgStore;
|
||||
HasNonKernelArgAtomic hasNonKernelArgAtomic = Defaults::hasNonKernelArgAtomic;
|
||||
HasNonKernelArgLoadT hasNonKernelArgLoad = Defaults::hasNonKernelArgLoad;
|
||||
HasNonKernelArgStoreT hasNonKernelArgStore = Defaults::hasNonKernelArgStore;
|
||||
HasNonKernelArgAtomicT hasNonKernelArgAtomic = Defaults::hasNonKernelArgAtomic;
|
||||
};
|
||||
|
||||
} // namespace ExecutionEnv
|
||||
|
||||
@@ -1000,29 +1000,27 @@ NEO::DecodeError populateKernelDescriptor(NEO::ProgramInfo &dst, NEO::Elf::Elf<N
|
||||
kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic = outExperimentalProperties.hasNonKernelArgAtomic;
|
||||
}
|
||||
|
||||
kernelDescriptor.kernelAttributes.barrierCount = execEnv.barrierCount;
|
||||
kernelDescriptor.kernelAttributes.flags.requiresDisabledMidThreadPreemption = execEnv.disableMidThreadPreemption;
|
||||
kernelDescriptor.kernelAttributes.numGrfRequired = execEnv.grfCount;
|
||||
if (execEnv.has4GBBuffers) {
|
||||
kernelDescriptor.kernelAttributes.bufferAddressingMode = KernelDescriptor::Stateless;
|
||||
}
|
||||
kernelDescriptor.kernelAttributes.flags.usesDeviceSideEnqueue = execEnv.hasDeviceEnqueue;
|
||||
kernelDescriptor.kernelAttributes.flags.usesFencesForReadWriteImages = execEnv.hasFenceForImageAccess;
|
||||
kernelDescriptor.kernelAttributes.flags.useGlobalAtomics = execEnv.hasGlobalAtomics;
|
||||
kernelDescriptor.kernelAttributes.flags.usesStatelessWrites = (false == execEnv.hasNoStatelessWrite);
|
||||
kernelDescriptor.kernelAttributes.flags.usesSpecialPipelineSelectMode = execEnv.hasDpas;
|
||||
kernelDescriptor.entryPoints.skipPerThreadDataLoad = execEnv.offsetToSkipPerThreadDataLoad;
|
||||
kernelDescriptor.entryPoints.skipSetFFIDGP = execEnv.offsetToSkipSetFfidGp;
|
||||
kernelDescriptor.kernelMetadata.requiredSubGroupSize = execEnv.requiredSubGroupSize;
|
||||
kernelDescriptor.kernelAttributes.simdSize = execEnv.simdSize;
|
||||
kernelDescriptor.kernelAttributes.slmInlineSize = execEnv.slmSize;
|
||||
kernelDescriptor.kernelAttributes.flags.requiresDisabledMidThreadPreemption = execEnv.disableMidThreadPreemption;
|
||||
kernelDescriptor.kernelAttributes.flags.requiresSubgroupIndependentForwardProgress = execEnv.subgroupIndependentForwardProgress;
|
||||
kernelDescriptor.kernelAttributes.flags.useGlobalAtomics = execEnv.hasGlobalAtomics;
|
||||
kernelDescriptor.kernelAttributes.flags.usesDeviceSideEnqueue = execEnv.hasDeviceEnqueue;
|
||||
kernelDescriptor.kernelAttributes.flags.usesFencesForReadWriteImages = execEnv.hasFenceForImageAccess;
|
||||
kernelDescriptor.kernelAttributes.flags.usesSpecialPipelineSelectMode = execEnv.hasDpas;
|
||||
kernelDescriptor.kernelAttributes.flags.usesStatelessWrites = (false == execEnv.hasNoStatelessWrite);
|
||||
kernelDescriptor.kernelAttributes.barrierCount = execEnv.barrierCount;
|
||||
kernelDescriptor.kernelAttributes.bufferAddressingMode = (execEnv.has4GBBuffers) ? KernelDescriptor::Stateless : KernelDescriptor::BindfulAndStateless;
|
||||
kernelDescriptor.kernelAttributes.numGrfRequired = execEnv.grfCount;
|
||||
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[0]);
|
||||
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[1] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[1]);
|
||||
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[2] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[2]);
|
||||
kernelDescriptor.kernelAttributes.simdSize = execEnv.simdSize;
|
||||
kernelDescriptor.kernelAttributes.slmInlineSize = execEnv.slmSize;
|
||||
kernelDescriptor.kernelAttributes.workgroupWalkOrder[0] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[0]);
|
||||
kernelDescriptor.kernelAttributes.workgroupWalkOrder[1] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[1]);
|
||||
kernelDescriptor.kernelAttributes.workgroupWalkOrder[2] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[2]);
|
||||
kernelDescriptor.kernelMetadata.requiredSubGroupSize = execEnv.requiredSubGroupSize;
|
||||
|
||||
if ((kernelDescriptor.kernelAttributes.simdSize != 1) && (kernelDescriptor.kernelAttributes.simdSize != 8) && (kernelDescriptor.kernelAttributes.simdSize != 16) && (kernelDescriptor.kernelAttributes.simdSize != 32)) {
|
||||
outErrReason.append("DeviceBinaryFormat::Zebin : Invalid simd size : " + std::to_string(kernelDescriptor.kernelAttributes.simdSize) + " in context of : " + kernelDescriptor.kernelMetadata.kernelName + ". Expected 1, 8, 16 or 32. Got : " + std::to_string(kernelDescriptor.kernelAttributes.simdSize) + "\n");
|
||||
|
||||
@@ -2593,6 +2593,59 @@ kernels:
|
||||
EXPECT_EQ(32, programInfo.kernelInfos[1]->kernelDescriptor.kernelAttributes.simdSize);
|
||||
}
|
||||
|
||||
TEST(PopulateKernelDescriptor, GivenMinimalExecutionEnvThenPopulateKernelDescriptorWithDefaults) {
|
||||
std::string zeinfo = R"===(
|
||||
kernels:
|
||||
- name : some_kernel
|
||||
execution_env:
|
||||
simd_size: 32
|
||||
grf_count: 128
|
||||
)===";
|
||||
NEO::ProgramInfo programInfo;
|
||||
ZebinTestData::ValidEmptyProgram zebin;
|
||||
zebin.appendSection(NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str() + "some_kernel", {});
|
||||
std::string errors, warnings;
|
||||
auto elf = NEO::Elf::decodeElf(zebin.storage, errors, warnings);
|
||||
ASSERT_NE(nullptr, elf.elfFileHeader) << errors << " " << warnings;
|
||||
|
||||
NEO::Yaml::YamlParser parser;
|
||||
bool parseSuccess = parser.parse(zeinfo, errors, warnings);
|
||||
ASSERT_TRUE(parseSuccess) << errors << " " << warnings;
|
||||
|
||||
NEO::ZebinSections zebinSections;
|
||||
auto extractErr = NEO::extractZebinSections(elf, zebinSections, errors, warnings);
|
||||
ASSERT_EQ(NEO::DecodeError::Success, extractErr) << errors << " " << warnings;
|
||||
|
||||
auto &kernelNode = *parser.createChildrenRange(*parser.findNodeWithKeyDfs("kernels")).begin();
|
||||
auto err = NEO::populateKernelDescriptor(programInfo, elf, zebinSections, parser, kernelNode, errors, warnings);
|
||||
EXPECT_EQ(NEO::DecodeError::Success, err);
|
||||
EXPECT_TRUE(errors.empty()) << errors;
|
||||
EXPECT_TRUE(warnings.empty()) << warnings;
|
||||
ASSERT_EQ(1U, programInfo.kernelInfos.size());
|
||||
|
||||
namespace Defaults = NEO::Elf::ZebinKernelMetadata::Types::Kernel::ExecutionEnv::Defaults;
|
||||
const auto &kernelDescriptor = programInfo.kernelInfos[0]->kernelDescriptor;
|
||||
EXPECT_EQ(kernelDescriptor.entryPoints.skipPerThreadDataLoad, static_cast<NEO::InstructionsSegmentOffset>(Defaults::offsetToSkipPerThreadDataLoad));
|
||||
EXPECT_EQ(kernelDescriptor.entryPoints.skipSetFFIDGP, static_cast<NEO::InstructionsSegmentOffset>(Defaults::offsetToSkipSetFfidGp));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.requiresDisabledMidThreadPreemption, Defaults::disableMidThreadPreemption);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.requiresSubgroupIndependentForwardProgress, Defaults::subgroupIndependentForwardProgress);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.useGlobalAtomics, Defaults::hasGlobalAtomics);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.usesDeviceSideEnqueue, Defaults::hasDeviceEnqueue);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.usesFencesForReadWriteImages, Defaults::hasFenceForImageAccess);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.usesSpecialPipelineSelectMode, Defaults::hasDpas);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.flags.usesStatelessWrites, (false == Defaults::hasNoStatelessWrite));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.barrierCount, static_cast<uint8_t>(Defaults::barrierCount));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.bufferAddressingMode, (Defaults::has4GBBuffers) ? KernelDescriptor::Stateless : KernelDescriptor::BindfulAndStateless);
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0], static_cast<uint16_t>(Defaults::requiredWorkGroupSize[0]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.requiredWorkgroupSize[1], static_cast<uint16_t>(Defaults::requiredWorkGroupSize[1]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.requiredWorkgroupSize[2], static_cast<uint16_t>(Defaults::requiredWorkGroupSize[2]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.slmInlineSize, static_cast<uint32_t>(Defaults::slmSize));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.workgroupWalkOrder[0], static_cast<uint8_t>(Defaults::workgroupWalkOrderDimensions[0]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.workgroupWalkOrder[1], static_cast<uint8_t>(Defaults::workgroupWalkOrderDimensions[1]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelAttributes.workgroupWalkOrder[2], static_cast<uint8_t>(Defaults::workgroupWalkOrderDimensions[2]));
|
||||
EXPECT_EQ(kernelDescriptor.kernelMetadata.requiredSubGroupSize, static_cast<uint8_t>(Defaults::requiredSubGroupSize));
|
||||
}
|
||||
|
||||
TEST(PopulateKernelDescriptor, WhenValidationOfZeinfoSectionsCountFailsThenDecodingFails) {
|
||||
NEO::ConstStringRef zeinfo = R"===(
|
||||
kernels:
|
||||
|
||||
Reference in New Issue
Block a user