P4 to Git Change 1726335 by wchau@wchau_OCL_boltzmann on 2019/01/04 14:53:36

SWDEV-174898 - OCL Runtime kernel metadata lookup requires quadratic time

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/devkernel.cpp#18 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/devkernel.hpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.cpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.hpp#15 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.cpp#76 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#49 edit


[ROCm/clr commit: 2b92421194]
Этот коммит содержится в:
foreman
2019-01-04 15:06:29 -05:00
родитель a198168a67
Коммит aa1de227ce
6 изменённых файлов: 105 добавлений и 73 удалений
+73
Просмотреть файл
@@ -72,6 +72,11 @@ Program::Program(amd::Device& device)
// ================================================================================================
Program::~Program() {
clear();
#if defined(USE_COMGR_LIBRARY)
for (auto const& kernelMeta : kernelMetadataMap_) {
amd::Comgr::destroy_metadata(kernelMeta.second);
}
#endif
delete metadata_;
}
@@ -2699,6 +2704,66 @@ aclType Program::getNextCompilationStageFromBinary(amd::option::Options* options
}
// ================================================================================================
#if defined(USE_COMGR_LIBRARY)
bool Program::createKernelMetadataMap() {
amd_comgr_status_t status;
amd_comgr_metadata_node_t kernelsMD;
bool hasKernelMD = false;
size_t size = 0;
status = amd::Comgr::metadata_lookup(*metadata_, "Kernels", &kernelsMD);
if (status == AMD_COMGR_STATUS_SUCCESS) {
hasKernelMD = true;
status = amd::Comgr::get_metadata_list_size(kernelsMD, &size);
}
for (size_t i = 0; i < size && status == AMD_COMGR_STATUS_SUCCESS; i++) {
amd_comgr_metadata_node_t nameMeta;
bool hasNameMeta = false;
bool hasKernelNode = false;
amd_comgr_metadata_node_t kernelNode;
std::string kernelName;
status = amd::Comgr::index_list_metadata(kernelsMD, i, &kernelNode);
if (status == AMD_COMGR_STATUS_SUCCESS) {
hasKernelNode = true;
status = amd::Comgr::metadata_lookup(kernelNode, "Name", &nameMeta);
}
if (status == AMD_COMGR_STATUS_SUCCESS) {
hasNameMeta = true;
status = getMetaBuf(nameMeta, &kernelName);
}
if (status == AMD_COMGR_STATUS_SUCCESS) {
kernelMetadataMap_[kernelName] = kernelNode;
}
else {
if (hasKernelNode) {
amd::Comgr::destroy_metadata(kernelNode);
}
for (auto const& kernelMeta : kernelMetadataMap_) {
amd::Comgr::destroy_metadata(kernelMeta.second);
}
kernelMetadataMap_.clear();
}
if (hasNameMeta) {
amd::Comgr::destroy_metadata(nameMeta);
}
}
if (hasKernelMD) {
amd::Comgr::destroy_metadata(kernelsMD);
}
return (status == AMD_COMGR_STATUS_SUCCESS);
}
#endif
bool Program::FindGlobalVarSize(void* binary, size_t binSize) {
#if defined(WITH_LIGHTNING_COMPILER) || defined(USE_COMGR_LIBRARY)
size_t progvarsTotalSize = 0;
@@ -2801,6 +2866,14 @@ bool Program::FindGlobalVarSize(void* binary, size_t binSize) {
return false;
}
#if defined(USE_COMGR_LIBRARY)
if (!createKernelMetadataMap()) {
buildLog_ +=
"Error: create kernel metadata map using COMgr\n";
return false;
}
#endif
progvarsTotalSize -= dynamicSize;
setGlobalVariableTotalSize(progvarsTotalSize);