Skip to content

Commit 7dea397

Browse files
Decode collection attributes in exec env
Add support for decoding required work group size and work gorup walk order dimensions in zebin. Related-To: NEO-6088 Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
1 parent 7c6c45f commit 7dea397

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

shared/source/device_binary_format/zebin_decoder.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,23 @@ bool readZeInfoValueChecked(const NEO::Yaml::YamlParser &parser, const NEO::Yaml
216216
return false;
217217
}
218218

219+
template <typename DestinationT, size_t Len>
220+
bool readZeInfoValueCollectionChecked(DestinationT (&vec)[Len], const NEO::Yaml::YamlParser &parser, const NEO::Yaml::Node &node, ConstStringRef context, std::string &outErrReason) {
221+
auto collectionNodes = parser.createChildrenRange(node);
222+
size_t index = 0U;
223+
bool isValid = true;
224+
225+
for (const auto &elementNd : collectionNodes) {
226+
isValid &= readZeInfoValueChecked(parser, elementNd, vec[index++], context, outErrReason);
227+
}
228+
229+
if (index != Len) {
230+
outErrReason.append("DeviceBinaryFormat::Zebin::" + NEO::Elf::SectionsNamesZebin::zeInfo.str() + " : wrong size of collection " + parser.readKey(node).str() + " in context of : " + context.str() + ". Got : " + std::to_string(index) + " expected : " + std::to_string(Len) + "\n");
231+
isValid = false;
232+
}
233+
return isValid;
234+
}
235+
219236
DecodeError readZeInfoExecutionEnvironment(const NEO::Yaml::YamlParser &parser, const NEO::Yaml::Node &node,
220237
NEO::Elf::ZebinKernelMetadata::Types::Kernel::ExecutionEnv::ExecutionEnvBaseT &outExecEnv,
221238
ConstStringRef context,
@@ -251,12 +268,16 @@ DecodeError readZeInfoExecutionEnvironment(const NEO::Yaml::YamlParser &parser,
251268
validExecEnv = validExecEnv & readZeInfoValueChecked(parser, execEnvMetadataNd, outExecEnv.offsetToSkipSetFfidGp, context, outErrReason);
252269
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::requiredSubGroupSize == key) {
253270
validExecEnv = validExecEnv & readZeInfoValueChecked(parser, execEnvMetadataNd, outExecEnv.requiredSubGroupSize, context, outErrReason);
271+
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::requiredWorkGroupSize == key) {
272+
validExecEnv = validExecEnv & readZeInfoValueCollectionChecked(outExecEnv.requiredWorkGroupSize, parser, execEnvMetadataNd, context, outErrReason);
254273
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::simdSize == key) {
255274
validExecEnv = validExecEnv & readZeInfoValueChecked(parser, execEnvMetadataNd, outExecEnv.simdSize, context, outErrReason);
256275
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::slmSize == key) {
257276
validExecEnv = validExecEnv & readZeInfoValueChecked(parser, execEnvMetadataNd, outExecEnv.slmSize, context, outErrReason);
258277
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::subgroupIndependentForwardProgress == key) {
259278
validExecEnv = validExecEnv & readZeInfoValueChecked(parser, execEnvMetadataNd, outExecEnv.subgroupIndependentForwardProgress, context, outErrReason);
279+
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::ExecutionEnv::workGroupWalkOrderDimensions == key) {
280+
validExecEnv = validExecEnv & readZeInfoValueCollectionChecked(outExecEnv.workgroupWalkOrderDimensions, parser, execEnvMetadataNd, context, outErrReason);
260281
} else {
261282
outWarning.append("DeviceBinaryFormat::Zebin::" + NEO::Elf::SectionsNamesZebin::zeInfo.str() + " : Unknown entry \"" + key.str() + "\" in context of " + context.str() + "\n");
262283
}
@@ -965,6 +986,12 @@ NEO::DecodeError populateKernelDescriptor(NEO::ProgramInfo &dst, NEO::Elf::Elf<N
965986
kernelDescriptor.kernelAttributes.simdSize = execEnv.simdSize;
966987
kernelDescriptor.kernelAttributes.slmInlineSize = execEnv.slmSize;
967988
kernelDescriptor.kernelAttributes.flags.requiresSubgroupIndependentForwardProgress = execEnv.subgroupIndependentForwardProgress;
989+
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[0]);
990+
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[1] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[1]);
991+
kernelDescriptor.kernelAttributes.requiredWorkgroupSize[2] = static_cast<uint16_t>(execEnv.requiredWorkGroupSize[2]);
992+
kernelDescriptor.kernelAttributes.workgroupWalkOrder[0] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[0]);
993+
kernelDescriptor.kernelAttributes.workgroupWalkOrder[1] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[1]);
994+
kernelDescriptor.kernelAttributes.workgroupWalkOrder[2] = static_cast<uint8_t>(execEnv.workgroupWalkOrderDimensions[2]);
968995

969996
if ((kernelDescriptor.kernelAttributes.simdSize != 1) && (kernelDescriptor.kernelAttributes.simdSize != 8) && (kernelDescriptor.kernelAttributes.simdSize != 16) && (kernelDescriptor.kernelAttributes.simdSize != 32)) {
970997
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");

shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,14 @@ TEST(ReadZeInfoExecutionEnvironment, GivenValidYamlEntriesThenSetProperMembers)
940940
simd_size : 32
941941
slm_size : 1024
942942
subgroup_independent_forward_progress : true
943+
required_work_group_size:
944+
- 8
945+
- 2
946+
- 1
947+
work_group_walk_order_dimensions:
948+
- 0
949+
- 1
950+
- 2
943951
...
944952
)===";
945953

@@ -973,6 +981,12 @@ TEST(ReadZeInfoExecutionEnvironment, GivenValidYamlEntriesThenSetProperMembers)
973981
EXPECT_EQ(32, execEnv.simdSize);
974982
EXPECT_EQ(1024, execEnv.slmSize);
975983
EXPECT_TRUE(execEnv.subgroupIndependentForwardProgress);
984+
EXPECT_EQ(8, execEnv.requiredWorkGroupSize[0]);
985+
EXPECT_EQ(2, execEnv.requiredWorkGroupSize[1]);
986+
EXPECT_EQ(1, execEnv.requiredWorkGroupSize[2]);
987+
EXPECT_EQ(0, execEnv.workgroupWalkOrderDimensions[0]);
988+
EXPECT_EQ(1, execEnv.workgroupWalkOrderDimensions[1]);
989+
EXPECT_EQ(2, execEnv.workgroupWalkOrderDimensions[2]);
976990
}
977991

978992
TEST(ReadZeInfoExecutionEnvironment, GivenUnknownEntryThenEmmitsWarning) {
@@ -1025,6 +1039,32 @@ TEST(ReadZeInfoExecutionEnvironment, GivenInvalidValueForKnownEntryThenFails) {
10251039
EXPECT_STREQ("DeviceBinaryFormat::Zebin::.ze_info : could not read actual_kernel_start_offset from : [true] in context of : some_kernel\n", errors.c_str());
10261040
}
10271041

1042+
TEST(ReadZeInfoExecutionEnvironment, GivenInvalidLengthForKnownCollectionEntryThenFails) {
1043+
NEO::ConstStringRef yaml = R"===(---
1044+
kernels:
1045+
- name: some_kernel
1046+
execution_env:
1047+
required_work_group_size:
1048+
- 5
1049+
- 2
1050+
...
1051+
)===";
1052+
1053+
std::string parserErrors;
1054+
std::string parserWarnings;
1055+
NEO::Yaml::YamlParser parser;
1056+
bool success = parser.parse(yaml, parserErrors, parserWarnings);
1057+
ASSERT_TRUE(success);
1058+
auto &execEnvNode = *parser.findNodeWithKeyDfs("execution_env");
1059+
std::string errors;
1060+
std::string warnings;
1061+
NEO::Elf::ZebinKernelMetadata::Types::Kernel::ExecutionEnv::ExecutionEnvBaseT execEnv;
1062+
auto err = NEO::readZeInfoExecutionEnvironment(parser, execEnvNode, execEnv, "some_kernel", errors, warnings);
1063+
EXPECT_EQ(NEO::DecodeError::InvalidBinary, err);
1064+
EXPECT_TRUE(warnings.empty()) << warnings;
1065+
EXPECT_STREQ("DeviceBinaryFormat::Zebin::.ze_info : wrong size of collection required_work_group_size in context of : some_kernel. Got : 2 expected : 3\n", errors.c_str());
1066+
}
1067+
10281068
TEST(ReadEnumCheckedArgType, GivenValidStringRepresentationThenParseItCorrectly) {
10291069
using namespace NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::ArgType;
10301070
using namespace NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PerThreadPayloadArgument::ArgType;
@@ -3216,6 +3256,14 @@ TEST(PopulateKernelDescriptor, GivenValidExeuctionEnvironmentThenPopulatedKernel
32163256
simd_size : 32
32173257
slm_size : 1024
32183258
subgroup_independent_forward_progress : true
3259+
required_work_group_size:
3260+
- 8
3261+
- 2
3262+
- 1
3263+
work_group_walk_order_dimensions:
3264+
- 0
3265+
- 1
3266+
- 2
32193267
)===";
32203268
NEO::ProgramInfo programInfo;
32213269
ZebinTestData::ValidEmptyProgram zebin;
@@ -3255,6 +3303,12 @@ TEST(PopulateKernelDescriptor, GivenValidExeuctionEnvironmentThenPopulatedKernel
32553303
EXPECT_EQ(32U, kernelDescriptor.kernelAttributes.simdSize);
32563304
EXPECT_EQ(1024U, kernelDescriptor.kernelAttributes.slmInlineSize);
32573305
EXPECT_TRUE(kernelDescriptor.kernelAttributes.flags.requiresSubgroupIndependentForwardProgress);
3306+
EXPECT_EQ(8U, kernelDescriptor.kernelAttributes.requiredWorkgroupSize[0]);
3307+
EXPECT_EQ(2U, kernelDescriptor.kernelAttributes.requiredWorkgroupSize[1]);
3308+
EXPECT_EQ(1U, kernelDescriptor.kernelAttributes.requiredWorkgroupSize[2]);
3309+
EXPECT_EQ(0U, kernelDescriptor.kernelAttributes.workgroupWalkOrder[0]);
3310+
EXPECT_EQ(1U, kernelDescriptor.kernelAttributes.workgroupWalkOrder[1]);
3311+
EXPECT_EQ(2U, kernelDescriptor.kernelAttributes.workgroupWalkOrder[2]);
32583312
}
32593313

32603314
TEST(PopulateArgDescriptorPerThreadPayload, GivenArgTypeLocalIdWhenOffsetIsNonZeroThenFail) {

0 commit comments

Comments
 (0)