Skip to content

Commit 3b7fbef

Browse files
Handle implicit args buffer info in zebin
Related-To: NEO-5081, IGC-4710 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 0634aa3 commit 3b7fbef

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

shared/source/device_binary_format/elf/zebin_elf.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ static constexpr ConstStringRef argBypointer("arg_bypointer");
217217
static constexpr ConstStringRef bufferOffset("buffer_offset");
218218
static constexpr ConstStringRef printfBuffer("printf_buffer");
219219
static constexpr ConstStringRef workDimensions("work_dimensions");
220+
static constexpr ConstStringRef implicitArgBuffer("implicit_arg_buffer");
220221
} // namespace ArgType
221222
namespace MemoryAddressingMode {
222223
static constexpr ConstStringRef stateless("stateless");
@@ -399,7 +400,8 @@ enum ArgType : uint8_t {
399400
ArgTypeArgBypointer,
400401
ArgTypeBufferOffset,
401402
ArgTypePrintfBuffer,
402-
ArgTypeWorkDimensions
403+
ArgTypeWorkDimensions,
404+
ArgTypeImplicitArgBuffer
403405
};
404406

405407
namespace PerThreadPayloadArgument {

shared/source/device_binary_format/zebin_decoder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ bool readEnumChecked(const Yaml::Token *token, NEO::Elf::ZebinKernelMetadata::Ty
373373
out = ArgTypeT::ArgTypePrintfBuffer;
374374
} else if (tokenValue == PayloadArgument::ArgType::workDimensions) {
375375
out = ArgTypeT::ArgTypeWorkDimensions;
376+
} else if (tokenValue == PayloadArgument::ArgType::implicitArgBuffer) {
377+
out = ArgTypeT::ArgTypeImplicitArgBuffer;
376378
} else {
377379
outErrReason.append("DeviceBinaryFormat::Zebin::" + NEO::Elf::SectionsNamesZebin::zeInfo.str() + " : Unhandled \"" + tokenValue.str() + "\" argument type in context of " + context.str() + "\n");
378380
return false;
@@ -904,6 +906,11 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
904906
dst.payloadMappings.dispatchTraits.workDim = src.offset;
905907
break;
906908
}
909+
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImplicitArgBuffer: {
910+
dst.payloadMappings.implicitArgs.implcitArgsBuffer = src.offset;
911+
dst.kernelAttributes.flags.requiresImplicitArgs = true;
912+
break;
913+
}
907914
}
908915

909916
return DecodeError::Success;

shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4888,6 +4888,41 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeWorkDimensionsWhenSize
48884888
EXPECT_EQ(32U, programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.dispatchTraits.workDim);
48894889
}
48904890

4891+
TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeImplicitArgBufferWhenPopulatingKernelDescriptorThenProperOffsetIsSetAndImplicitArgsAreRequired) {
4892+
NEO::ConstStringRef zeinfo = R"===(
4893+
kernels:
4894+
- name : some_kernel
4895+
execution_env:
4896+
simd_size: 32
4897+
payload_arguments:
4898+
- arg_type: implicit_arg_buffer
4899+
offset: 4
4900+
size: 8
4901+
)===";
4902+
NEO::ProgramInfo programInfo;
4903+
ZebinTestData::ValidEmptyProgram zebin;
4904+
zebin.appendSection(NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str() + "some_kernel", {});
4905+
std::string errors, warnings;
4906+
auto elf = NEO::Elf::decodeElf(zebin.storage, errors, warnings);
4907+
ASSERT_NE(nullptr, elf.elfFileHeader) << errors << " " << warnings;
4908+
4909+
NEO::Yaml::YamlParser parser;
4910+
bool parseSuccess = parser.parse(zeinfo, errors, warnings);
4911+
ASSERT_TRUE(parseSuccess) << errors << " " << warnings;
4912+
4913+
NEO::ZebinSections zebinSections;
4914+
auto extractErr = NEO::extractZebinSections(elf, zebinSections, errors, warnings);
4915+
ASSERT_EQ(NEO::DecodeError::Success, extractErr) << errors << " " << warnings;
4916+
4917+
auto &kernelNode = *parser.createChildrenRange(*parser.findNodeWithKeyDfs("kernels")).begin();
4918+
auto err = NEO::populateKernelDescriptor(programInfo, elf, zebinSections, parser, kernelNode, errors, warnings);
4919+
EXPECT_EQ(NEO::DecodeError::Success, err);
4920+
EXPECT_TRUE(errors.empty()) << errors;
4921+
EXPECT_TRUE(warnings.empty()) << warnings;
4922+
EXPECT_EQ(4u, programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.implicitArgs.implcitArgsBuffer);
4923+
EXPECT_TRUE(programInfo.kernelInfos[0]->kernelDescriptor.kernelAttributes.flags.requiresImplicitArgs);
4924+
}
4925+
48914926
TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeWorkDimensionsWhenSizeIsInvalidThenPopulateKernelDescriptorFails) {
48924927
NEO::KernelDescriptor kernelDescriptor;
48934928
kernelDescriptor.payloadMappings.explicitArgs.resize(1);

0 commit comments

Comments
 (0)