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]
这个提交包含在:
@@ -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);
|
||||
|
||||
在新工单中引用
屏蔽一个用户