feat(zebin): add support for sync buffer

Adds support in zebinary for sync buffer required for global barriers.

Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
Krystian Chmielewski
2022-10-27 10:59:05 +00:00
committed by Compute-Runtime-Automation
parent d8a66cd14d
commit 70da7c4b65
4 changed files with 51 additions and 3 deletions

View File

@@ -212,7 +212,8 @@ constexpr ConstStringRef bufferOffset("buffer_offset");
constexpr ConstStringRef printfBuffer("printf_buffer");
constexpr ConstStringRef workDimensions("work_dimensions");
constexpr ConstStringRef implicitArgBuffer("implicit_arg_buffer");
constexpr ConstStringRef inlineSampler("arg_inline_sampler");
constexpr ConstStringRef syncBuffer("sync_buffer");
namespace Image {
constexpr ConstStringRef width("image_width");
constexpr ConstStringRef height("image_height");
@@ -565,6 +566,7 @@ enum ArgType : uint8_t {
ArgTypeVmeSubpixelMode,
ArgTypeVmeSadAdjustMode,
ArgTypeVmeSearchPathType,
ArgTypeSyncBuffer,
ArgTypeMax
};

View File

@@ -22,7 +22,7 @@ using namespace Tags::Kernel::PayloadArgument::ArgType::Sampler::Vme;
using ArgType = Types::Kernel::ArgType;
constexpr ConstStringRef name = "argument type";
constexpr LookupArray<ConstStringRef, ArgType, 34> lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds},
constexpr LookupArray<ConstStringRef, ArgType, 35> lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds},
{localId, ArgType::ArgTypeLocalId},
{localSize, ArgType::ArgTypeLocalSize},
{groupCount, ArgType::ArgTypeGroupCount},
@@ -55,7 +55,8 @@ constexpr LookupArray<ConstStringRef, ArgType, 34> lookup({{{packedLocalIds, Arg
{blockType, ArgType::ArgTypeVmeMbBlockType},
{subpixelMode, ArgType::ArgTypeVmeSubpixelMode},
{sadAdjustMode, ArgType::ArgTypeVmeSadAdjustMode},
{searchPathType, ArgType::ArgTypeVmeSearchPathType}}});
{searchPathType, ArgType::ArgTypeVmeSearchPathType},
{syncBuffer, ArgType::ArgTypeSyncBuffer}}});
static_assert(lookup.size() == ArgType::ArgTypeMax - 1, "Every enum field must be present");
} // namespace ArgType

View File

@@ -993,6 +993,13 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
break;
}
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeSyncBuffer: {
dst.kernelAttributes.flags.usesSyncBuffer = true;
dst.payloadMappings.implicitArgs.syncBufferAddress.stateless = src.offset;
dst.payloadMappings.implicitArgs.syncBufferAddress.pointerSize = src.size;
break;
}
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeWorkDimensions: {
if (4 != src.size) {
outErrReason.append("DeviceBinaryFormat::Zebin : Invalid size for argument of type " + NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::ArgType::workDimensions.str() + " in context of : " + dst.kernelMetadata.kernelName + ". Expected 4. Got : " + std::to_string(src.size) + "\n");
@@ -1083,6 +1090,7 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
getVmeDescriptor()->searchPathType = src.offset;
break;
}
return DecodeError::Success;
}

View File

@@ -5526,6 +5526,43 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypePrintfBufferWhenOffset
EXPECT_EQ(8U, printfSurfaceAddress.pointerSize);
}
TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeSyncBufferWhenOffsetAndSizeIsValidThenPopulatesKernelDescriptor) {
NEO::ConstStringRef zeinfo = R"===(
kernels:
- name : some_kernel
execution_env:
simd_size: 32
payload_arguments:
- arg_type: sync_buffer
offset: 32
size: 8
)===";
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;
EXPECT_TRUE(programInfo.kernelInfos[0]->kernelDescriptor.kernelAttributes.flags.usesSyncBuffer);
const auto &syncBufferAddress = programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.implicitArgs.syncBufferAddress;
ASSERT_EQ(32U, syncBufferAddress.stateless);
EXPECT_EQ(8U, syncBufferAddress.pointerSize);
}
TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMetadataThenPopulatesKernelDescriptor) {
NEO::ConstStringRef zeinfo = R"===(
kernels: