mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-19 06:24:51 +08:00
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:
committed by
Compute-Runtime-Automation
parent
d8a66cd14d
commit
70da7c4b65
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user