From d08319bc08c2ecc1ff71068ea9c5b97234b35a54 Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 23 Mar 2017 18:30:32 -0400 Subject: [PATCH] P4 to Git Change 1390019 by kzhuravl@kzhuravl-fiji-cl-on-lc-git-overlay on 2017/03/23 18:19:56 SWDEV-102699 - Update runtime for upcoming metadata changes: - https://reviews.llvm.org/D29948 - https://reviews.llvm.org/D29949 - https://reviews.llvm.org/D30969 - https://reviews.llvm.org/D30970 ReviewBoardURL: http://ocltc.amd.com/reviews/r/12486/ Testing: lightning ocl conformance locally + windows build Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/build/Makefile.pal#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.cpp#32 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.hpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#37 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.hpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/build/Makefile.oclrocm#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#21 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.hpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#60 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.hpp#21 edit [ROCm/clr commit: d1e1688c89c2573a74fd7bdf503ad044dea50967] --- .../rocclr/runtime/device/pal/palkernel.cpp | 157 ++++++++-------- .../rocclr/runtime/device/pal/palkernel.hpp | 7 +- .../rocclr/runtime/device/pal/palprogram.cpp | 14 +- .../rocclr/runtime/device/pal/palprogram.hpp | 8 +- .../rocclr/runtime/device/rocm/rockernel.cpp | 173 +++++++++--------- .../rocclr/runtime/device/rocm/rockernel.hpp | 2 +- .../rocclr/runtime/device/rocm/rocprogram.cpp | 12 +- .../rocclr/runtime/device/rocm/rocprogram.hpp | 10 +- 8 files changed, 202 insertions(+), 181 deletions(-) diff --git a/projects/clr/rocclr/runtime/device/pal/palkernel.cpp b/projects/clr/rocclr/runtime/device/pal/palkernel.cpp index 9f5a4ff062..667cd17b07 100644 --- a/projects/clr/rocclr/runtime/device/pal/palkernel.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palkernel.cpp @@ -1275,6 +1275,11 @@ HSAILKernel::loadArguments( #if defined(WITH_LIGHTNING_COMPILER) +using llvm::AMDGPU::CodeObject::AccessQualifier; +using llvm::AMDGPU::CodeObject::AddressSpaceQualifier; +using llvm::AMDGPU::CodeObject::ValueKind; +using llvm::AMDGPU::CodeObject::ValueType; + const LightningProgram& LightningKernel::prog() const { @@ -1374,31 +1379,31 @@ LightningKernel::initPrintf(const std::vector& printfInfoStrings) } static inline HSAIL_ARG_TYPE -GetKernelArgType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgType(const KernelArgMD& lcArg) { - switch (lcArg.Kind) { - case AMDGPU::RuntimeMD::KernelArg::GlobalBuffer: - case AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer: + switch (lcArg.mValueKind) { + case ValueKind::GlobalBuffer: + case ValueKind::DynamicSharedPointer: return HSAIL_ARGTYPE_POINTER; - case AMDGPU::RuntimeMD::KernelArg::ByValue: + case ValueKind::ByValue: return HSAIL_ARGTYPE_VALUE; - case AMDGPU::RuntimeMD::KernelArg::Image: + case ValueKind::Image: return HSAIL_ARGTYPE_IMAGE; - case AMDGPU::RuntimeMD::KernelArg::Sampler: + case ValueKind::Sampler: return HSAIL_ARGTYPE_SAMPLER; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetX: + case ValueKind::HiddenGlobalOffsetX: return HSAIL_ARGTYPE_HIDDEN_GLOBAL_OFFSET_X; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetY: + case ValueKind::HiddenGlobalOffsetY: return HSAIL_ARGTYPE_HIDDEN_GLOBAL_OFFSET_Y; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetZ: + case ValueKind::HiddenGlobalOffsetZ: return HSAIL_ARGTYPE_HIDDEN_GLOBAL_OFFSET_Z; - case AMDGPU::RuntimeMD::KernelArg::HiddenPrintfBuffer: + case ValueKind::HiddenPrintfBuffer: return HSAIL_ARGTYPE_HIDDEN_PRINTF_BUFFER; - case AMDGPU::RuntimeMD::KernelArg::HiddenDefaultQueue: + case ValueKind::HiddenDefaultQueue: return HSAIL_ARGTYPE_HIDDEN_DEFAULT_QUEUE; - case AMDGPU::RuntimeMD::KernelArg::HiddenCompletionAction: + case ValueKind::HiddenCompletionAction: return HSAIL_ARGTYPE_HIDDEN_COMPLETION_ACTION; - case AMDGPU::RuntimeMD::KernelArg::HiddenNone: + case ValueKind::HiddenNone: return HSAIL_ARGTYPE_HIDDEN_NONE; default: return HSAIL_ARGTYPE_ERROR; @@ -1406,16 +1411,16 @@ GetKernelArgType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) } static inline size_t -GetKernelArgAlignment(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgAlignment(const KernelArgMD& lcArg) { - return lcArg.Align; + return lcArg.mAlign; } static inline size_t -GetKernelArgPointeeAlignment(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgPointeeAlignment(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { - uint32_t align = lcArg.PointeeAlign; + if (lcArg.mValueKind == ValueKind::DynamicSharedPointer) { + uint32_t align = lcArg.mPointeeAlign; if (align == 0) { LogWarning("Missing DynamicSharedPointer alignment"); align = 128; /* worst case alignment */; @@ -1426,16 +1431,16 @@ GetKernelArgPointeeAlignment(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg } static inline HSAIL_ACCESS_TYPE -GetKernelArgAccessType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgAccessType(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Image) { - switch (lcArg.AccQual) { - case AMDGPU::RuntimeMD::KernelArg::ReadOnly: + if (lcArg.mValueKind == ValueKind::GlobalBuffer + || lcArg.mValueKind == ValueKind::Image) { + switch (lcArg.mAccQual) { + case AccessQualifier::ReadOnly: return HSAIL_ACCESS_TYPE_RO; - case AMDGPU::RuntimeMD::KernelArg::WriteOnly: + case AccessQualifier::WriteOnly: return HSAIL_ACCESS_TYPE_WO; - case AMDGPU::RuntimeMD::KernelArg::ReadWrite: + case AccessQualifier::ReadWrite: default: return HSAIL_ACCESS_TYPE_RW; } @@ -1444,59 +1449,59 @@ GetKernelArgAccessType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) } static inline HSAIL_ADDRESS_QUALIFIER -GetKernelAddrQual(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelAddrQual(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { + if (lcArg.mValueKind == ValueKind::DynamicSharedPointer) { return HSAIL_ADDRESS_LOCAL; } - else if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer) { - if (lcArg.AddrQual == AMDGPU::RuntimeMD::KernelArg::Global) { + else if (lcArg.mValueKind == ValueKind::GlobalBuffer) { + if (lcArg.mAddrSpaceQual == AddressSpaceQualifier::Global) { return HSAIL_ADDRESS_GLOBAL; } - else if (lcArg.AddrQual == AMDGPU::RuntimeMD::KernelArg::Constant) { + else if (lcArg.mAddrSpaceQual == AddressSpaceQualifier::Constant) { return HSAIL_ADDRESS_CONSTANT; } LogError("Unsupported address type"); return HSAIL_ADDRESS_ERROR; } - else if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Image - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Sampler) { + else if (lcArg.mValueKind == ValueKind::Image + || lcArg.mValueKind == ValueKind::Sampler) { return HSAIL_ADDRESS_GLOBAL; } return HSAIL_ADDRESS_ERROR; } static inline HSAIL_DATA_TYPE -GetKernelDataType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelDataType(const KernelArgMD& lcArg) { - if (lcArg.Kind != AMDGPU::RuntimeMD::KernelArg::ByValue) { + if (lcArg.mValueKind != ValueKind::ByValue) { return HSAIL_DATATYPE_ERROR; } - switch (lcArg.ValueType) { - case AMDGPU::RuntimeMD::KernelArg::I8: + switch (lcArg.mValueType) { + case ValueType::I8: return HSAIL_DATATYPE_S8; - case AMDGPU::RuntimeMD::KernelArg::I16: + case ValueType::I16: return HSAIL_DATATYPE_S16; - case AMDGPU::RuntimeMD::KernelArg::I32: + case ValueType::I32: return HSAIL_DATATYPE_S32; - case AMDGPU::RuntimeMD::KernelArg::I64: + case ValueType::I64: return HSAIL_DATATYPE_S64; - case AMDGPU::RuntimeMD::KernelArg::U8: + case ValueType::U8: return HSAIL_DATATYPE_U8; - case AMDGPU::RuntimeMD::KernelArg::U16: + case ValueType::U16: return HSAIL_DATATYPE_U16; - case AMDGPU::RuntimeMD::KernelArg::U32: + case ValueType::U32: return HSAIL_DATATYPE_U32; - case AMDGPU::RuntimeMD::KernelArg::U64: + case ValueType::U64: return HSAIL_DATATYPE_U64; - case AMDGPU::RuntimeMD::KernelArg::F16: + case ValueType::F16: return HSAIL_DATATYPE_F16; - case AMDGPU::RuntimeMD::KernelArg::F32: + case ValueType::F32: return HSAIL_DATATYPE_F32; - case AMDGPU::RuntimeMD::KernelArg::F64: + case ValueType::F64: return HSAIL_DATATYPE_F64; - case AMDGPU::RuntimeMD::KernelArg::Struct: + case ValueType::Struct: return HSAIL_DATATYPE_STRUCT; default: return HSAIL_DATATYPE_ERROR; @@ -1504,18 +1509,18 @@ GetKernelDataType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) } static inline cl_kernel_arg_type_qualifier -GetOclTypeQual(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetOclTypeQual(const KernelArgMD& lcArg) { cl_kernel_arg_type_qualifier rv = CL_KERNEL_ARG_TYPE_NONE; - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { - if (lcArg.IsVolatile) { + if (lcArg.mValueKind == ValueKind::GlobalBuffer || + lcArg.mValueKind == ValueKind::DynamicSharedPointer) { + if (lcArg.mIsVolatile) { rv |= CL_KERNEL_ARG_TYPE_VOLATILE; } - if (lcArg.IsRestrict) { + if (lcArg.mIsRestrict) { rv |= CL_KERNEL_ARG_TYPE_RESTRICT; } - if (lcArg.IsConst) { + if (lcArg.mIsConst) { rv |= CL_KERNEL_ARG_TYPE_CONST; } } @@ -1523,21 +1528,20 @@ GetOclTypeQual(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) } void -LightningKernel::initArgList(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD) +LightningKernel::initArgList(const KernelMD& kernelMD) { device::Kernel::parameters_t params; size_t offset = 0; - for (size_t i = 0; i < kernelMD.Args.size(); ++i) { - const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg = - kernelMD.Args[i]; + for (size_t i = 0; i < kernelMD.mArgs.size(); ++i) { + const KernelArgMD& lcArg = kernelMD.mArgs[i]; // Initialize HSAIL kernel argument auto arg = new HSAILKernel::Argument; - arg->name_ = lcArg.Name; - arg->typeName_ = lcArg.TypeName; - arg->size_ = lcArg.Size; + arg->name_ = lcArg.mName; + arg->typeName_ = lcArg.mTypeName; + arg->size_ = lcArg.mSize; arg->type_ = GetKernelArgType(lcArg); arg->addrQual_ = GetKernelAddrQual(lcArg); arg->dataType_ = GetKernelDataType(lcArg); @@ -1563,12 +1567,12 @@ LightningKernel::initArgList(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD // Initialize Device kernel parameters amd::KernelParameterDescriptor desc; - desc.name_ = lcArg.Name.c_str(); + desc.name_ = lcArg.mName.c_str(); desc.type_ = GetOclType(arg); desc.addressQualifier_ = GetOclAddrQual(arg); desc.accessQualifier_ = GetOclAccessQual(arg); desc.typeQualifier_ = GetOclTypeQual(lcArg); - desc.typeName_ = lcArg.TypeName.c_str(); + desc.typeName_ = lcArg.mTypeName.c_str(); // Make a check if it is local or global if (desc.addressQualifier_ == CL_KERNEL_ARG_ADDRESS_LOCAL) { @@ -1596,9 +1600,10 @@ LightningKernel::initArgList(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD createSignature(params); } -static const AMDGPU::RuntimeMD::Kernel::Metadata* FindKernelMetadata(const AMDGPU::RuntimeMD::Program::Metadata* programMD, const std::string& name) { - for (const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD : programMD->Kernels) { - if (kernelMD.Name == name) { return &kernelMD; } +static const KernelMD* FindKernelMetadata(const CodeObjectMD* programMD, + const std::string& name) { + for (const KernelMD& kernelMD : programMD->mKernels) { + if (kernelMD.mName == name) { return &kernelMD; } } return nullptr; } @@ -1611,11 +1616,10 @@ LightningKernel::init(amd::hsa::loader::Symbol* symbol) aqlCreateHWInfo(symbol); - const AMDGPU::RuntimeMD::Program::Metadata* programMD = prog().metadata(); + const CodeObjectMD* programMD = prog().metadata(); assert(programMD != nullptr); - const AMDGPU::RuntimeMD::Kernel::Metadata* kernelMD = - FindKernelMetadata(programMD, name()); + const KernelMD* kernelMD = FindKernelMetadata(programMD, name()); if (kernelMD == nullptr) { return false; @@ -1624,22 +1628,23 @@ LightningKernel::init(amd::hsa::loader::Symbol* symbol) // Set the argList initArgList(*kernelMD); - if (!kernelMD->ReqdWorkGroupSize.empty()) { - const auto& requiredWorkgroupSize = kernelMD->ReqdWorkGroupSize; + if (!kernelMD->mAttrs.mReqdWorkGroupSize.empty()) { + const auto& requiredWorkgroupSize = kernelMD->mAttrs.mReqdWorkGroupSize; workGroupInfo_.compileSize_[0] = requiredWorkgroupSize[0]; workGroupInfo_.compileSize_[1] = requiredWorkgroupSize[1]; workGroupInfo_.compileSize_[2] = requiredWorkgroupSize[2]; } - if (!kernelMD->WorkGroupSizeHint.empty()) { - const auto& workgroupSizeHint = kernelMD->WorkGroupSizeHint; + if (!kernelMD->mAttrs.mWorkGroupSizeHint.empty()) { + const auto& workgroupSizeHint = kernelMD->mAttrs.mWorkGroupSizeHint; workGroupInfo_.compileSizeHint_[0] = workgroupSizeHint[0]; workGroupInfo_.compileSizeHint_[1] = workgroupSizeHint[1]; workGroupInfo_.compileSizeHint_[2] = workgroupSizeHint[2]; } - if (!kernelMD->VecTypeHint.empty()) { - workGroupInfo_.compileVecTypeHint_ = kernelMD->VecTypeHint.c_str(); + if (!kernelMD->mAttrs.mVecTypeHint.empty()) { + workGroupInfo_.compileVecTypeHint_ = + kernelMD->mAttrs.mVecTypeHint.c_str(); } // Copy wavefront size @@ -1656,7 +1661,7 @@ LightningKernel::init(amd::hsa::loader::Symbol* symbol) workGroupInfo_.size_ = dev().info().maxWorkGroupSize_; } - initPrintf(programMD->PrintfInfo); + initPrintf(programMD->mPrintf); /*FIXME_lmoriche: size_t sizeOfWavesPerSimdHint = sizeof(workGroupInfo_.wavesPerSimdHint_); diff --git a/projects/clr/rocclr/runtime/device/pal/palkernel.hpp b/projects/clr/rocclr/runtime/device/pal/palkernel.hpp index 8658979d7a..1f8ed92254 100644 --- a/projects/clr/rocclr/runtime/device/pal/palkernel.hpp +++ b/projects/clr/rocclr/runtime/device/pal/palkernel.hpp @@ -17,7 +17,10 @@ #include "hsa.h" #if defined(WITH_LIGHTNING_COMPILER) -#include "AMDGPURuntimeMetadata.h" +#include "AMDGPUCodeObjectMetadata.h" + +typedef llvm::AMDGPU::CodeObject::Kernel::Metadata KernelMD; +typedef llvm::AMDGPU::CodeObject::Kernel::Arg::Metadata KernelArgMD; #endif // defined(WITH_LIGHTNING_COMPILER) namespace amd { @@ -283,7 +286,7 @@ public: bool init(amd::hsa::loader::Symbol* symbol); //! Initializes Hsail Argument metadata and info for LC - void initArgList(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD); + void initArgList(const KernelMD& kernelMD); //! Initializes HSAIL Printf metadata and info for LC void initPrintf(const std::vector& printfInfoStrings); diff --git a/projects/clr/rocclr/runtime/device/pal/palprogram.cpp b/projects/clr/rocclr/runtime/device/pal/palprogram.cpp index cab99f97e9..44e9a9d8b0 100644 --- a/projects/clr/rocclr/runtime/device/pal/palprogram.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palprogram.cpp @@ -20,7 +20,7 @@ #include "hsa_ext_image.h" #include "amd_hsa_loader.hpp" #if defined(WITH_LIGHTNING_COMPILER) -#include "AMDGPURuntimeMetadata.h" +#include "AMDGPUCodeObjectMetadata.h" #include "driver/AmdCompiler.h" #include "libraries.amdgcn.inc" #include "gelf.h" @@ -1615,16 +1615,20 @@ LightningProgram::setKernels( //! @todo: Use constants and enums defined in AMDGPUPTNote.h. //! In order to switch to using constants and enums defined in //! AMDGPUPTNote.h, we need to clean up internal header files. - if (note->n_type == 7 /*AMDGPU::ElfNote::NT_AMDGPU_HSA_RUNTIME_METADATA_V_1*/) { - buildLog_ += "Error: object code with metadata v1 is not " \ + if (note->n_type == 7 || note->n_type == 8) { + buildLog_ += "Error: object code with old metadata is not " \ "supported\n"; return false; } - else if (note->n_type == 8 /*AMDGPU::ElfNote::NT_AMDGPU_HSA_RUNTIME_METADATA*/ + else if (note->n_type == 10 /*AMDGPU::ElfNote::NT_AMDGPU_HSA_CODE_OBJECT_METADATA*/ && note->n_namesz == sizeof "AMD" && !memcmp(name, "AMD", note->n_namesz)) { std::string metadataStr((const char *) desc, (size_t) note->n_descsz); - metadata_ = new AMDGPU::RuntimeMD::Program::Metadata(metadataStr); + metadata_ = new CodeObjectMD(); + if (CodeObjectMD::fromYamlString(metadataStr, *metadata_)) { + buildLog_ += "Error: failed to process metadata\n"; + return false; + } // We've found and loaded the runtime metadata, exit the // note record loop now. break; diff --git a/projects/clr/rocclr/runtime/device/pal/palprogram.hpp b/projects/clr/rocclr/runtime/device/pal/palprogram.hpp index a314e61a8e..8d6046de0c 100644 --- a/projects/clr/rocclr/runtime/device/pal/palprogram.hpp +++ b/projects/clr/rocclr/runtime/device/pal/palprogram.hpp @@ -8,7 +8,9 @@ #include "amd_hsa_loader.hpp" #if defined(WITH_LIGHTNING_COMPILER) -#include "AMDGPURuntimeMetadata.h" +#include "AMDGPUCodeObjectMetadata.h" + +typedef llvm::AMDGPU::CodeObject::Metadata CodeObjectMD; #endif // defined(WITH_LIGHTNING_COMPILER) namespace amd { @@ -301,7 +303,7 @@ public: metadata_(nullptr) {} - const AMDGPU::RuntimeMD::Program::Metadata* metadata() const { + const CodeObjectMD* metadata() const { return metadata_; } private: @@ -340,7 +342,7 @@ protected: static std::auto_ptr newCompilerInstance(); private: - AMDGPU::RuntimeMD::Program::Metadata* metadata_; //!< Runtime metadata + CodeObjectMD* metadata_; //!< Runtime metadata }; #endif // defined(WITH_LIGHTNING_COMPILER) diff --git a/projects/clr/rocclr/runtime/device/rocm/rockernel.cpp b/projects/clr/rocclr/runtime/device/rocm/rockernel.cpp index 094dff74cb..16b6396fbe 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rockernel.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rockernel.cpp @@ -13,32 +13,38 @@ namespace roc { #if defined(WITH_LIGHTNING_COMPILER) + +using llvm::AMDGPU::CodeObject::AccessQualifier; +using llvm::AMDGPU::CodeObject::AddressSpaceQualifier; +using llvm::AMDGPU::CodeObject::ValueKind; +using llvm::AMDGPU::CodeObject::ValueType; + static inline ROC_ARG_TYPE -GetKernelArgType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgType(const KernelArgMD& lcArg) { - switch (lcArg.Kind) { - case AMDGPU::RuntimeMD::KernelArg::GlobalBuffer: - case AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer: + switch (lcArg.mValueKind) { + case ValueKind::GlobalBuffer: + case ValueKind::DynamicSharedPointer: return ROC_ARGTYPE_POINTER; - case AMDGPU::RuntimeMD::KernelArg::ByValue: + case ValueKind::ByValue: return ROC_ARGTYPE_VALUE; - case AMDGPU::RuntimeMD::KernelArg::Image: + case ValueKind::Image: return ROC_ARGTYPE_IMAGE; - case AMDGPU::RuntimeMD::KernelArg::Sampler: + case ValueKind::Sampler: return ROC_ARGTYPE_SAMPLER; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetX: + case ValueKind::HiddenGlobalOffsetX: return ROC_ARGTYPE_HIDDEN_GLOBAL_OFFSET_X; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetY: + case ValueKind::HiddenGlobalOffsetY: return ROC_ARGTYPE_HIDDEN_GLOBAL_OFFSET_Y; - case AMDGPU::RuntimeMD::KernelArg::HiddenGlobalOffsetZ: + case ValueKind::HiddenGlobalOffsetZ: return ROC_ARGTYPE_HIDDEN_GLOBAL_OFFSET_Z; - case AMDGPU::RuntimeMD::KernelArg::HiddenPrintfBuffer: + case ValueKind::HiddenPrintfBuffer: return ROC_ARGTYPE_HIDDEN_PRINTF_BUFFER; - case AMDGPU::RuntimeMD::KernelArg::HiddenDefaultQueue: + case ValueKind::HiddenDefaultQueue: return ROC_ARGTYPE_HIDDEN_DEFAULT_QUEUE; - case AMDGPU::RuntimeMD::KernelArg::HiddenCompletionAction: + case ValueKind::HiddenCompletionAction: return ROC_ARGTYPE_HIDDEN_COMPLETION_ACTION; - case AMDGPU::RuntimeMD::KernelArg::HiddenNone: + case ValueKind::HiddenNone: return ROC_ARGTYPE_HIDDEN_NONE; default: return ROC_ARGTYPE_ERROR; @@ -89,9 +95,9 @@ GetKernelArgType(const aclArgData* argInfo) #if defined(WITH_LIGHTNING_COMPILER) static inline size_t -GetKernelArgAlignment(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgAlignment(const KernelArgMD& lcArg) { - return lcArg.Align; + return lcArg.mAlign; } #endif // defined(WITH_LIGHTNING_COMPILER) @@ -132,10 +138,10 @@ GetKernelArgAlignment(const aclArgData* argInfo) #if defined(WITH_LIGHTNING_COMPILER) static inline size_t -GetKernelArgPointeeAlignment(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgPointeeAlignment(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { - uint32_t align = lcArg.PointeeAlign; + if (lcArg.mValueKind == ValueKind::DynamicSharedPointer) { + uint32_t align = lcArg.mPointeeAlign; if (align == 0) { LogWarning("Missing DynamicSharedPointer alignment"); align = 128; /* worst case alignment */; @@ -157,16 +163,16 @@ GetKernelArgPointeeAlignment(const aclArgData* argInfo) #if defined(WITH_LIGHTNING_COMPILER) static inline ROC_ACCESS_TYPE -GetKernelArgAccessType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelArgAccessType(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Image) { - switch (lcArg.AccQual) { - case AMDGPU::RuntimeMD::KernelArg::ReadOnly: + if (lcArg.mValueKind == ValueKind::GlobalBuffer || + lcArg.mValueKind == ValueKind::Image) { + switch (lcArg.mAccQual) { + case AccessQualifier::ReadOnly: return ROC_ACCESS_TYPE_RO; - case AMDGPU::RuntimeMD::KernelArg::WriteOnly: + case AccessQualifier::WriteOnly: return ROC_ACCESS_TYPE_WO; - case AMDGPU::RuntimeMD::KernelArg::ReadWrite: + case AccessQualifier::ReadWrite: default: return ROC_ACCESS_TYPE_RW; } @@ -201,23 +207,23 @@ GetKernelArgAccessType(const aclArgData* argInfo) #if defined(WITH_LIGHTNING_COMPILER) static inline ROC_ADDRESS_QUALIFIER -GetKernelAddrQual(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelAddrQual(const KernelArgMD& lcArg) { - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { + if (lcArg.mValueKind == ValueKind::DynamicSharedPointer) { return ROC_ADDRESS_LOCAL; } - else if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer) { - if (lcArg.AddrQual == AMDGPU::RuntimeMD::KernelArg::Global) { + else if (lcArg.mValueKind == ValueKind::GlobalBuffer) { + if (lcArg.mAddrSpaceQual == AddressSpaceQualifier::Global) { return ROC_ADDRESS_GLOBAL; } - else if (lcArg.AddrQual == AMDGPU::RuntimeMD::KernelArg::Constant) { + else if (lcArg.mAddrSpaceQual == AddressSpaceQualifier::Constant) { return ROC_ADDRESS_CONSTANT; } LogError("Unsupported address type"); return ROC_ADDRESS_ERROR; } - else if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Image - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::Sampler) { + else if (lcArg.mValueKind == ValueKind::Image + || lcArg.mValueKind == ValueKind::Sampler) { return ROC_ADDRESS_GLOBAL; } return ROC_ADDRESS_ERROR; @@ -254,38 +260,38 @@ GetKernelAddrQual(const aclArgData* argInfo) #if defined(WITH_LIGHTNING_COMPILER) static inline ROC_DATA_TYPE -GetKernelDataType(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetKernelDataType(const KernelArgMD& lcArg) { aclArgDataType dataType; - if (lcArg.Kind != AMDGPU::RuntimeMD::KernelArg::ByValue) { + if (lcArg.mValueKind != ValueKind::ByValue) { return ROC_DATATYPE_ERROR; } - switch (lcArg.ValueType) { - case AMDGPU::RuntimeMD::KernelArg::I8: + switch (lcArg.mValueType) { + case ValueType::I8: return ROC_DATATYPE_S8; - case AMDGPU::RuntimeMD::KernelArg::I16: + case ValueType::I16: return ROC_DATATYPE_S16; - case AMDGPU::RuntimeMD::KernelArg::I32: + case ValueType::I32: return ROC_DATATYPE_S32; - case AMDGPU::RuntimeMD::KernelArg::I64: + case ValueType::I64: return ROC_DATATYPE_S64; - case AMDGPU::RuntimeMD::KernelArg::U8: + case ValueType::U8: return ROC_DATATYPE_U8; - case AMDGPU::RuntimeMD::KernelArg::U16: + case ValueType::U16: return ROC_DATATYPE_U16; - case AMDGPU::RuntimeMD::KernelArg::U32: + case ValueType::U32: return ROC_DATATYPE_U32; - case AMDGPU::RuntimeMD::KernelArg::U64: + case ValueType::U64: return ROC_DATATYPE_U64; - case AMDGPU::RuntimeMD::KernelArg::F16: + case ValueType::F16: return ROC_DATATYPE_F16; - case AMDGPU::RuntimeMD::KernelArg::F32: + case ValueType::F32: return ROC_DATATYPE_F32; - case AMDGPU::RuntimeMD::KernelArg::F64: + case ValueType::F64: return ROC_DATATYPE_F64; - case AMDGPU::RuntimeMD::KernelArg::Struct: + case ValueType::Struct: return ROC_DATATYPE_STRUCT; default: return ROC_DATATYPE_ERROR; @@ -491,18 +497,18 @@ GetOclAccessQual(const Kernel::Argument* arg) #if defined(WITH_LIGHTNING_COMPILER) static inline cl_kernel_arg_type_qualifier -GetOclTypeQual(const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg) +GetOclTypeQual(const KernelArgMD& lcArg) { cl_kernel_arg_type_qualifier rv = CL_KERNEL_ARG_TYPE_NONE; - if (lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::GlobalBuffer - || lcArg.Kind == AMDGPU::RuntimeMD::KernelArg::DynamicSharedPointer) { - if (lcArg.IsVolatile) { + if (lcArg.mValueKind == ValueKind::GlobalBuffer || + lcArg.mValueKind == ValueKind::DynamicSharedPointer) { + if (lcArg.mIsVolatile) { rv |= CL_KERNEL_ARG_TYPE_VOLATILE; } - if (lcArg.IsRestrict) { + if (lcArg.mIsRestrict) { rv |= CL_KERNEL_ARG_TYPE_RESTRICT; } - if (lcArg.IsConst) { + if (lcArg.mIsConst) { rv |= CL_KERNEL_ARG_TYPE_CONST; } } @@ -607,21 +613,20 @@ Kernel::initArguments(const aclArgData* aclArg) #if defined(WITH_LIGHTNING_COMPILER) void -Kernel::initArguments_LC(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD) +Kernel::initArguments_LC(const KernelMD& kernelMD) { device::Kernel::parameters_t params; size_t offset = 0; - for (size_t i = 0; i < kernelMD.Args.size(); ++i) { - const AMDGPU::RuntimeMD::KernelArg::Metadata& lcArg = - kernelMD.Args[i]; + for (size_t i = 0; i < kernelMD.mArgs.size(); ++i) { + const KernelArgMD& lcArg = kernelMD.mArgs[i]; // Initialize HSAIL kernel argument Kernel::Argument* arg = new Kernel::Argument; - arg->name_ = lcArg.Name; - arg->typeName_ = lcArg.TypeName; - arg->size_ = lcArg.Size; + arg->name_ = lcArg.mName; + arg->typeName_ = lcArg.mTypeName; + arg->size_ = lcArg.mSize; arg->type_ = GetKernelArgType(lcArg); arg->addrQual_ = GetKernelAddrQual(lcArg); arg->dataType_ = GetKernelDataType(lcArg); @@ -647,12 +652,12 @@ Kernel::initArguments_LC(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD) // Initialize Device kernel parameters amd::KernelParameterDescriptor desc; - desc.name_ = lcArg.Name.c_str(); + desc.name_ = lcArg.mName.c_str(); desc.type_ = GetOclType(arg); desc.addressQualifier_ = GetOclAddrQual(arg); desc.accessQualifier_ = GetOclAccessQual(arg); desc.typeQualifier_ = GetOclTypeQual(lcArg); - desc.typeName_ = lcArg.TypeName.c_str(); + desc.typeName_ = lcArg.mTypeName.c_str(); // Make a check if it is local or global if (desc.addressQualifier_ == CL_KERNEL_ARG_ADDRESS_LOCAL) { @@ -698,9 +703,10 @@ Kernel::Kernel( #if defined(WITH_LIGHTNING_COMPILER) -static const AMDGPU::RuntimeMD::Kernel::Metadata* FindKernelMetadata(const AMDGPU::RuntimeMD::Program::Metadata* programMD, const std::string& name) { - for (const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD : programMD->Kernels) { - if (kernelMD.Name == name) { return &kernelMD; } +static const KernelMD* FindKernelMetadata(const CodeObjectMD* programMD, + const std::string& name) { + for (const KernelMD& kernelMD : programMD->mKernels) { + if (kernelMD.mName == name) { return &kernelMD; } } return nullptr; } @@ -710,10 +716,10 @@ bool Kernel::init_LC() hsa_agent_t hsaDevice = program_->hsaDevice(); // Pull out metadata from the ELF - const AMDGPU::RuntimeMD::Program::Metadata* programMD = program_->metadata(); + const CodeObjectMD* programMD = program_->metadata(); assert(programMD != nullptr); - const AMDGPU::RuntimeMD::Kernel::Metadata* kernelMD = FindKernelMetadata(programMD, name()); + const KernelMD* kernelMD = FindKernelMetadata(programMD, name()); if (kernelMD == nullptr) { return false; } @@ -726,22 +732,23 @@ bool Kernel::init_LC() workGroupInfo_.availableSGPRs_ = 0; workGroupInfo_.availableVGPRs_ = 0; - if (!kernelMD->ReqdWorkGroupSize.empty()) { - const auto& requiredWorkgroupSize = kernelMD->ReqdWorkGroupSize; + if (!kernelMD->mAttrs.mReqdWorkGroupSize.empty()) { + const auto& requiredWorkgroupSize = kernelMD->mAttrs.mReqdWorkGroupSize; workGroupInfo_.compileSize_[0] = requiredWorkgroupSize[0]; workGroupInfo_.compileSize_[1] = requiredWorkgroupSize[1]; workGroupInfo_.compileSize_[2] = requiredWorkgroupSize[2]; } - if (!kernelMD->WorkGroupSizeHint.empty()) { - const auto& workgroupSizeHint = kernelMD->WorkGroupSizeHint; + if (!kernelMD->mAttrs.mWorkGroupSizeHint.empty()) { + const auto& workgroupSizeHint = kernelMD->mAttrs.mWorkGroupSizeHint; workGroupInfo_.compileSizeHint_[0] = workgroupSizeHint[0]; workGroupInfo_.compileSizeHint_[1] = workgroupSizeHint[1]; workGroupInfo_.compileSizeHint_[2] = workgroupSizeHint[2]; } - if (!kernelMD->VecTypeHint.empty()) { - workGroupInfo_.compileVecTypeHint_ = kernelMD->VecTypeHint.c_str(); + if (!kernelMD->mAttrs.mVecTypeHint.empty()) { + workGroupInfo_.compileVecTypeHint_ = + kernelMD->mAttrs.mVecTypeHint.c_str(); } uint32_t wavefront_size = 0; @@ -759,18 +766,10 @@ bool Kernel::init_LC() workGroupInfo_.preferredSizeMultiple_ = wavefront_size; - const void* kernelHostPtr = nullptr; - if (Device::loaderQueryHostAddress( - reinterpret_cast(kernelCodeHandle_), &kernelHostPtr - ) == HSA_STATUS_SUCCESS) { - auto akc = reinterpret_cast(kernelHostPtr); - workGroupInfo_.usedSGPRs_ = akc->wavefront_sgpr_count; - workGroupInfo_.usedVGPRs_ = akc->workitem_vgpr_count; - } - else { - workGroupInfo_.usedSGPRs_ = 0; - workGroupInfo_.usedVGPRs_ = 0; - } + /// TODO: Are there any other fields that are getting queried from akc? + /// If so, code properties metadata should be used instead. + workGroupInfo_.usedSGPRs_ = kernelMD->mCodeProps.mWavefrontNumSGPRs; + workGroupInfo_.usedVGPRs_ = kernelMD->mCodeProps.mWorkitemNumVGPRs; workGroupInfo_.usedStackSize_ = 0; @@ -789,7 +788,7 @@ bool Kernel::init_LC() workGroupInfo_.size_ = program_->dev().info().maxWorkGroupSize_; } - initPrintf_LC(programMD->PrintfInfo); + initPrintf_LC(programMD->mPrintf); return true; } diff --git a/projects/clr/rocclr/runtime/device/rocm/rockernel.hpp b/projects/clr/rocclr/runtime/device/rocm/rockernel.hpp index 7f0c5f8839..cef92431c7 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rockernel.hpp +++ b/projects/clr/rocclr/runtime/device/rocm/rockernel.hpp @@ -166,7 +166,7 @@ private: void initArguments(const aclArgData* aclArg); #if defined(WITH_LIGHTNING_COMPILER) //! Initializes Hsail Argument metadata and info for LC - void initArguments_LC(const AMDGPU::RuntimeMD::Kernel::Metadata& kernelMD); + void initArguments_LC(const KernelMD& kernelMD); #endif // defined(WITH_LIGHTNING_COMPILER) //! Initializes HSAIL Printf metadata and info diff --git a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp index 0fc549ffda..d7f9d602b1 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp @@ -937,16 +937,20 @@ HSAILProgram::setKernels_LC(amd::option::Options *options, void* binary, size_t address name = (address) ¬e[1]; address desc = name + amd::alignUp(note->n_namesz, sizeof(int)); - if (note->n_type == AMDGPU::ElfNote::NT_AMDGPU_HSA_RUNTIME_METADATA_V_1) { - buildLog_ += "Error: object code with metadata v1 is not " \ + if (note->n_type == 7 || note->n_type == 8) { + buildLog_ += "Error: object code with old metadata is not " \ "supported\n"; return false; } - else if (note->n_type == AMDGPU::ElfNote::NT_AMDGPU_HSA_RUNTIME_METADATA + else if (note->n_type == AMDGPU::ElfNote::NT_AMDGPU_HSA_CODE_OBJECT_METADATA && note->n_namesz == sizeof AMDGPU::ElfNote::NoteName && !memcmp(name, AMDGPU::ElfNote::NoteName, note->n_namesz)) { std::string metadataStr((const char *) desc, (size_t) note->n_descsz); - metadata_ = new AMDGPU::RuntimeMD::Program::Metadata(metadataStr); + metadata_ = new CodeObjectMD(); + if (CodeObjectMD::fromYamlString(metadataStr, *metadata_)) { + buildLog_ += "Error: failed to process metadata\n"; + return false; + } // We've found and loaded the runtime metadata, exit the // note record loop now. break; diff --git a/projects/clr/rocclr/runtime/device/rocm/rocprogram.hpp b/projects/clr/rocclr/runtime/device/rocm/rocprogram.hpp index 137b12917f..451dd96650 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocprogram.hpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocprogram.hpp @@ -18,8 +18,12 @@ #include "HSAILItems.h" #if defined(WITH_LIGHTNING_COMPILER) -#include "AMDGPURuntimeMetadata.h" +#include "AMDGPUCodeObjectMetadata.h" #include "driver/AmdCompiler.h" + +typedef llvm::AMDGPU::CodeObject::Metadata CodeObjectMD; +typedef llvm::AMDGPU::CodeObject::Kernel::Metadata KernelMD; +typedef llvm::AMDGPU::CodeObject::Kernel::Arg::Metadata KernelArgMD; #endif // defined(WITH_LIGHTNING_COMPILER) using namespace HSAIL_ASM; @@ -46,7 +50,7 @@ public: #if defined(WITH_LIGHTNING_COMPILER) //! Returns the program metadata. - const AMDGPU::RuntimeMD::Program::Metadata* metadata() const { return metadata_; } + const CodeObjectMD* metadata() const { return metadata_; } #endif // defined(WITH_LIGHTNING_COMPILER) //! Return a typecasted GPU device @@ -169,7 +173,7 @@ private: hsa_executable_t hsaExecutable_; //!< Handle to HSA executable #if defined(WITH_LIGHTNING_COMPILER) - AMDGPU::RuntimeMD::Program::Metadata* metadata_; //!< Runtime metadata + CodeObjectMD* metadata_; //!< Runtime metadata //! Return a new transient compiler instance. static std::auto_ptr newCompilerInstance(); #endif // defined(WITH_LIGHTNING_COMPILER)