P4 to Git Change 1309472 by lmoriche@lmoriche_opencl_dev on 2016/08/31 19:27:07

SWDEV-94610 - Fix the API::get_kernel_arg_info conformance test failure. The runtime metadata needs to return references from Name() and TypeName() instead of temporary strings. Name().c_str() should be valid until the program is destroyed.

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmetadata.cpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmetadata.hpp#3 edit


[ROCm/clr commit: 29a3f5d56a]
这个提交包含在:
foreman
2016-08-31 19:36:48 -04:00
父节点 ac10a39e22
当前提交 0b63f2d19f
修改 3 个文件,包含 18 行新增39 行删除
@@ -820,16 +820,16 @@ bool Kernel::init_LC(){
}
size_t idx = runtimeMD->KernelIndexByName(name());
const RuntimeMD::Kernel::Metadata* kernelMD = runtimeMD->GetKernelMetadata(idx);
const RuntimeMD::Kernel::Metadata& kernelMD = runtimeMD->GetKernelMetadata(idx);
size_t sizeOfArgList = kernelMD->KernelArgCount();
size_t sizeOfArgList = kernelMD.KernelArgCount();
size_t kOffset = 0;
size_t pOffset = 0;
device::Kernel::parameters_t params;
for (uint32_t i=0; i < sizeOfArgList; i++) {
const RuntimeMD::KernelArg::Metadata* kernelArg = kernelMD->GetKernelArgMetadata(i);
initArgsParams(kernelArg, &kOffset, params, &pOffset);
const RuntimeMD::KernelArg::Metadata& kernelArg = kernelMD.GetKernelArgMetadata(i);
initArgsParams(&kernelArg, &kOffset, params, &pOffset);
}
createSignature(params);
@@ -840,7 +840,7 @@ bool Kernel::init_LC(){
workGroupInfo_.availableSGPRs_ = 0;
workGroupInfo_.availableVGPRs_ = 0;
const uint32_t* workGroupSizeHint = kernelMD->WorkgroupSizeHint();
const uint32_t* workGroupSizeHint = kernelMD.WorkgroupSizeHint();
size_t sizeOfWorkGroupSize = (workGroupSizeHint) ? *workGroupSizeHint : 0;
uint32_t wavefront_size = 0;
@@ -42,6 +42,7 @@
#include <sstream>
#include <iostream>
#include <cassert>
#include "rocmetadata.hpp"
@@ -199,7 +200,7 @@ namespace RuntimeMD {
out
<< " Access: " << AccessQualToString(accQual)
<< " Address: " << addrQual
<< " Address: " << (uint) addrQual
<< " Size: " << size
<< " Align: " << align
<< " Type Name: " << typeName;
@@ -208,28 +209,6 @@ namespace RuntimeMD {
}
}
void Metadata::PrintOut() const {
std::cout
<< "Type: " << TypeKindToString(typeKind) << std::endl;
if (typeKind == Value) {
std::cout << " ValueType:" << ValueTypeToString(valueType) << std::endl;
}
if (isConst) { std::cout << " Const" << std::endl; }
if (isRestrict) { std::cout << " Restrict" << std::endl; }
if (isVolatile) { std::cout << " Volatile" << std::endl; }
if (isPipe) { std::cout << " Pipe" << std::endl; }
std::cout
<< " Access: " << AccessQualToString(accQual)
<< " Address: " << addrQual
<< " Size: " << size
<< " Align: " << align
<< " Type Name: " << typeName << std::endl;
if (!name.empty()) {
std::cout << " Name: " << name << std::endl;
}
}
}
namespace Kernel {
@@ -255,9 +234,9 @@ namespace RuntimeMD {
this->languageVersion = languageVersion;
}
const KernelArg::Metadata* Metadata::GetKernelArgMetadata(size_t index) const {
const KernelArg::Metadata& Metadata::GetKernelArgMetadata(size_t index) const {
assert((index < args.size()) && "kernel argument index too big");
return &(args[index]);
return args[index];
}
bool Metadata::ReadValue(std::istream& in, AMDGPU::RuntimeMD::Key key) {
@@ -267,6 +246,7 @@ namespace RuntimeMD {
switch (key) {
case KeyKernelName:
hasName = true;
return Read(in, name);
case KeyArgBegin:
args.resize(args.size() + 1);
@@ -471,11 +451,11 @@ namespace RuntimeMD {
return true;
}
const Kernel::Metadata* Metadata::GetKernelMetadata(size_t index) const {
const Kernel::Metadata& Metadata::GetKernelMetadata(size_t index) const {
assert(kernels.size() && "kernel metadata not found");
assert((index < kernels.size()) && "kernel index too big");
return &(kernels[index]);
return kernels[index];
}
size_t Metadata::KernelIndexByName(const std::string& name) const {
@@ -496,7 +476,7 @@ namespace RuntimeMD {
}
void Metadata::Print(std::ostream& out) {
out << "roc runtime metadata (" << kernels.size() << " kernels):" << std::endl;
out << "AMDGPU runtime metadata (" << kernels.size() << " kernels):" << std::endl;
for (Kernel::Metadata& kernel : kernels) {
kernel.Print(out);
}
@@ -72,8 +72,8 @@ namespace RuntimeMD {
Metadata();
uint32_t Size() const { return size; }
uint32_t Align() const { return align; }
std::string TypeName() const { return typeName; }
std::string Name() const { return name; }
const std::string& TypeName() const { return typeName; }
const std::string& Name() const { return name; }
AMDGPU::RuntimeMD::KernelArg::TypeKind TypeKind() const { return typeKind; }
AMDGPU::RuntimeMD::KernelArg::ValueType ValueType() const { return valueType; }
uint8_t AddrQual() const { return addrQual; }
@@ -85,7 +85,6 @@ namespace RuntimeMD {
bool ReadValue(std::istream& in, AMDGPU::RuntimeMD::Key key);
void Print(std::ostream& out);
void PrintOut() const;
};
}
@@ -135,12 +134,12 @@ namespace RuntimeMD {
bool HasMaxWorkgroupSize() const { return hasMaxWorkgroupSize; }
size_t KernelArgCount() const { return args.size(); }
const KernelArg::Metadata* GetKernelArgMetadata(size_t index) const;
const KernelArg::Metadata& GetKernelArgMetadata(size_t index) const;
const std::string& Name() const { return name; }
const uint32_t* RequiredWorkgroupSize() const { return hasRequiredWorkgroupSize ? requiredWorkgroupSize : nullptr; }
const uint32_t* WorkgroupSizeHint() const { return hasWorkgroupSizeHint ? workgroupSizeHint : nullptr; }
std::string VecTypeHint() const { return vectorTypeHint; }
const std::string& VecTypeHint() const { return vectorTypeHint; }
uint32_t KernelIndex() const { return hasKernelIndex ? kernelIndex : UINT32_MAX; }
uint32_t SGPRS() const { return hasSGPRs ? numSgprs : UINT32_MAX; }
uint32_t VGPRS() const { return hasVGPRs ? numVgprs : UINT32_MAX; }
@@ -165,7 +164,7 @@ namespace RuntimeMD {
public:
size_t KernelCount() const { return kernels.size(); }
const Kernel::Metadata* GetKernelMetadata(size_t index) const;
const Kernel::Metadata& GetKernelMetadata(size_t index) const;
size_t KernelIndexByName(const std::string& name) const;
bool ReadFrom(std::istream& in);