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)