//===-- AMDGPURuntimeMetadata.h - AMDGPU Runtime Metadata -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // /// \file /// /// Enums and structure types used by runtime metadata. /// /// Runtime requests certain information (metadata) about kernels to be able /// to execute the kernels and answer the queries about the kernels. /// The metadata is represented as a note element in the .note ELF section of a /// binary (code object). The desc field of the note element is a YAML string /// consisting of key-value pairs. Each key is a string. Each value can be /// an integer, a string, or an YAML sequence. There are 3 levels of YAML maps. /// At the beginning of the YAML string is the module level YAML map. A /// kernel-level YAML map is in the amd.Kernels sequence. A /// kernel-argument-level map is in the amd.Args sequence. /// /// The format should be kept backward compatible. New enum values and bit /// fields should be appended at the end. It is suggested to bump up the /// revision number whenever the format changes and document the change /// in the revision in this header. /// // //===----------------------------------------------------------------------===// // #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H #define LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H #include #include #include namespace AMDGPU { namespace RuntimeMD { // Version and revision of runtime metadata const unsigned char MDVersion = 2; const unsigned char MDRevision = 1; // Name of keys for runtime metadata. namespace KeyName { // Runtime metadata version const char MDVersion[] = "amd.MDVersion"; // Instruction set architecture information const char IsaInfo[] = "amd.IsaInfo"; // Wavefront size const char IsaInfoWavefrontSize[] = "amd.IsaInfoWavefrontSize"; // Local memory size in bytes const char IsaInfoLocalMemorySize[] = "amd.IsaInfoLocalMemorySize"; // Number of execution units per compute unit const char IsaInfoEUsPerCU[] = "amd.IsaInfoEUsPerCU"; // Maximum number of waves per execution unit const char IsaInfoMaxWavesPerEU[] = "amd.IsaInfoMaxWavesPerEU"; // Maximum flat work group size const char IsaInfoMaxFlatWorkGroupSize[] = "amd.IsaInfoMaxFlatWorkGroupSize"; // SGPR allocation granularity const char IsaInfoSGPRAllocGranule[] = "amd.IsaInfoSGPRAllocGranule"; // Total number of SGPRs const char IsaInfoTotalNumSGPRs[] = "amd.IsaInfoTotalNumSGPRs"; // Addressable number of SGPRs const char IsaInfoAddressableNumSGPRs[] = "amd.IsaInfoAddressableNumSGPRs"; // VGPR allocation granularity const char IsaInfoVGPRAllocGranule[] = "amd.IsaInfoVGPRAllocGranule"; // Total number of VGPRs const char IsaInfoTotalNumVGPRs[] = "amd.IsaInfoTotalNumVGPRs"; // Addressable number of VGPRs const char IsaInfoAddressableNumVGPRs[] = "amd.IsaInfoAddressableNumVGPRs"; // Language const char Language[] = "amd.Language"; // Language version const char LanguageVersion[] = "amd.LanguageVersion"; // Kernels const char Kernels[] = "amd.Kernels"; // Kernel name const char KernelName[] = "amd.KernelName"; // Kernel arguments const char Args[] = "amd.Args"; // Kernel argument size in bytes const char ArgSize[] = "amd.ArgSize"; // Kernel argument alignment const char ArgAlign[] = "amd.ArgAlign"; // Kernel argument type name const char ArgTypeName[] = "amd.ArgTypeName"; // Kernel argument name const char ArgName[] = "amd.ArgName"; // Kernel argument kind const char ArgKind[] = "amd.ArgKind"; // Kernel argument value type const char ArgValueType[] = "amd.ArgValueType"; // Kernel argument address qualifier const char ArgAddrQual[] = "amd.ArgAddrQual"; // Kernel argument access qualifier const char ArgAccQual[] = "amd.ArgAccQual"; // Kernel argument is const qualified const char ArgIsConst[] = "amd.ArgIsConst"; // Kernel argument is restrict qualified const char ArgIsRestrict[] = "amd.ArgIsRestrict"; // Kernel argument is volatile qualified const char ArgIsVolatile[] = "amd.ArgIsVolatile"; // Kernel argument is pipe qualified const char ArgIsPipe[] = "amd.ArgIsPipe"; // Required work group size const char ReqdWorkGroupSize[] = "amd.ReqdWorkGroupSize"; // Work group size hint const char WorkGroupSizeHint[] = "amd.WorkGroupSizeHint"; // Vector type hint const char VecTypeHint[] = "amd.VecTypeHint"; // Kernel index for device enqueue const char KernelIndex[] = "amd.KernelIndex"; // No partial work groups const char NoPartialWorkGroups[] = "amd.NoPartialWorkGroups"; // Prinf function call information const char PrintfInfo[] = "amd.PrintfInfo"; // The actual kernel argument access qualifier const char ArgActualAcc[] = "amd.ArgActualAcc"; // Alignment of pointee type const char ArgPointeeAlign[] = "amd.ArgPointeeAlign"; } // end namespace KeyName namespace KernelArg { enum Kind : uint8_t { ByValue = 0, GlobalBuffer = 1, DynamicSharedPointer = 2, Sampler = 3, Image = 4, Pipe = 5, Queue = 6, HiddenGlobalOffsetX = 7, HiddenGlobalOffsetY = 8, HiddenGlobalOffsetZ = 9, HiddenNone = 10, HiddenPrintfBuffer = 11, HiddenDefaultQueue = 12, HiddenCompletionAction = 13, }; enum ValueType : uint16_t { Struct = 0, I8 = 1, U8 = 2, I16 = 3, U16 = 4, F16 = 5, I32 = 6, U32 = 7, F32 = 8, I64 = 9, U64 = 10, F64 = 11, }; // Avoid using 'None' since it conflicts with a macro in X11 header file. enum AccessQualifer : uint8_t { AccNone = 0, ReadOnly = 1, WriteOnly = 2, ReadWrite = 3, }; enum AddressSpaceQualifer : uint8_t { Private = 0, Global = 1, Constant = 2, Local = 3, Generic = 4, Region = 5, }; } // end namespace KernelArg // Invalid values are used to indicate an optional key should not be emitted. const uint8_t INVALID_ADDR_QUAL = 0xff; const uint8_t INVALID_ACC_QUAL = 0xff; const uint32_t INVALID_KERNEL_INDEX = ~0U; namespace KernelArg { // In-memory representation of kernel argument information. struct Metadata { uint32_t Size = 0; uint32_t Align = 0; uint32_t PointeeAlign = 0; uint8_t Kind = 0; uint16_t ValueType = 0; std::string TypeName; std::string Name; uint8_t AddrQual = INVALID_ADDR_QUAL; uint8_t AccQual = INVALID_ACC_QUAL; uint8_t IsVolatile = 0; uint8_t IsConst = 0; uint8_t IsRestrict = 0; uint8_t IsPipe = 0; Metadata() = default; }; } // end namespace KernelArg namespace Kernel { // In-memory representation of kernel information. struct Metadata { std::string Name; std::string Language; std::vector LanguageVersion; std::vector ReqdWorkGroupSize; std::vector WorkGroupSizeHint; std::string VecTypeHint; uint32_t KernelIndex = INVALID_KERNEL_INDEX; uint8_t NoPartialWorkGroups = 0; std::vector Args; Metadata() = default; }; } // end namespace Kernel namespace IsaInfo { /// \brief In-memory representation of instruction set architecture /// information. struct Metadata { /// \brief Wavefront size. unsigned WavefrontSize = 0; /// \brief Local memory size in bytes. unsigned LocalMemorySize = 0; /// \brief Number of execution units per compute unit. unsigned EUsPerCU = 0; /// \brief Maximum number of waves per execution unit. unsigned MaxWavesPerEU = 0; /// \brief Maximum flat work group size. unsigned MaxFlatWorkGroupSize = 0; /// \brief SGPR allocation granularity. unsigned SGPRAllocGranule = 0; /// \brief Total number of SGPRs. unsigned TotalNumSGPRs = 0; /// \brief Addressable number of SGPRs. unsigned AddressableNumSGPRs = 0; /// \brief VGPR allocation granularity. unsigned VGPRAllocGranule = 0; /// \brief Total number of VGPRs. unsigned TotalNumVGPRs = 0; /// \brief Addressable number of VGPRs. unsigned AddressableNumVGPRs = 0; Metadata() = default; }; } // end namespace IsaInfo namespace Program { // In-memory representation of program information. struct Metadata { std::vector MDVersionSeq; IsaInfo::Metadata IsaInfo; std::vector PrintfInfo; std::vector Kernels; explicit Metadata() = default; // Construct from an YAML string. explicit Metadata(const std::string &YAML); // Convert to YAML string. std::string toYAML(); // Convert from YAML string. static Metadata fromYAML(const std::string &S); }; } //end namespace Program } // end namespace RuntimeMD } // end namespace AMDGPU #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPURUNTIMEMETADATA_H