From 7f6d375ed40a0fe6bc97daaef036ec67b8b3cec1 Mon Sep 17 00:00:00 2001
From: foreman
Date: Thu, 10 Sep 2015 13:43:06 -0400
Subject: [PATCH] P4 to Git Change 1189687 by emankov@em-hsa-amd on 2015/09/10
13:34:22
ECR #333753 - ORCA RT: fix for continuing work after Program build failure.
[Synopsis]
If program build (compile or link) is failed RT continues its work and fails further (for example, in symbol.setDeviceKernel). It was hard to find out the real failure (HSAILProgram::linkImpl) due to buildLog, which is printed once in the end, and due to abscence of LogError function call.
[Misc]
+ Error handling improvement in HSAILProgram::linkImpl and some others. ToDo: Do the same for the rest.
+ LogError() is added to Program::build/compile/link
[Testing] pre check-in
Reviewer: German Andryeyev
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#184 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.cpp#206 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#65 edit
[ROCm/clr commit: 94eccbc8e5b9428f5b87904b6ec8fc16a3b8caa3]
---
projects/clr/rocclr/runtime/device/device.cpp | 3 +++
.../rocclr/runtime/device/gpu/gpuprogram.cpp | 25 +++++++++++--------
.../clr/rocclr/runtime/platform/program.cpp | 4 +++
3 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/projects/clr/rocclr/runtime/device/device.cpp b/projects/clr/rocclr/runtime/device/device.cpp
index ba952f6155..bf134c708e 100644
--- a/projects/clr/rocclr/runtime/device/device.cpp
+++ b/projects/clr/rocclr/runtime/device/device.cpp
@@ -747,6 +747,7 @@ Program::compile(const std::string& sourceCode,
f.write(logs.data(), logs.size());
f.close();
}
+ LogError(buildLog_.c_str());
}
return buildError();
@@ -854,6 +855,7 @@ cl_int Program::link(const std::vector& inputPrograms,
f.write(logs.data(), logs.size());
f.close();
}
+ LogError(buildLog_.c_str());
}
return buildError();
@@ -948,6 +950,7 @@ Program::build(const std::string& sourceCode,
f.write(logs.data(), logs.size());
f.close();
}
+ LogError(buildLog_.c_str());
}
return buildError();
diff --git a/projects/clr/rocclr/runtime/device/gpu/gpuprogram.cpp b/projects/clr/rocclr/runtime/device/gpu/gpuprogram.cpp
index fbf14dedea..7c080f9f89 100644
--- a/projects/clr/rocclr/runtime/device/gpu/gpuprogram.cpp
+++ b/projects/clr/rocclr/runtime/device/gpu/gpuprogram.cpp
@@ -1976,8 +1976,7 @@ HSAILProgram::getNextCompilationStageFromBinary(amd::option::Options* options) {
acl_error errorCode;
binaryElf_ = aclReadFromMem(mem, binary.second, &errorCode);
if (errorCode != ACL_SUCCESS) {
- buildLog_ += "Error while BRIG Codegen phase: aclReadFromMem failure \n" ;
- LogWarning("aclReadFromMem failed");
+ buildLog_ += "Error: Reading the binary from memory failed.\n";
return continueCompileFrom;
}
// Calculate the next stage to compile from, based on sections in binaryElf_;
@@ -2081,7 +2080,7 @@ HSAILProgram::linkImpl(amd::option::Options* options)
curOptions.c_str(), continueCompileFrom, ACL_TYPE_CG, NULL);
buildLog_ += aclGetCompilerLog(dev().hsaCompiler());
if (errorCode != ACL_SUCCESS) {
- buildLog_ += "Error while BRIG Codegen phase: compilation error \n" ;
+ buildLog_ += "Error: BRIG code generation failed.\n";
return false;
}
break;
@@ -2092,7 +2091,7 @@ HSAILProgram::linkImpl(amd::option::Options* options)
finalize = false;
break;
default:
- buildLog_ += "Error while BRIG Codegen phase: the binary is incomplete \n" ;
+ buildLog_ += "Error: The binary is incorrect or incomplete. Finalization to ISA couldn't be performed.\n";
return false;
}
if (finalize) {
@@ -2106,7 +2105,7 @@ HSAILProgram::linkImpl(amd::option::Options* options)
fin_options.c_str(), ACL_TYPE_CG, ACL_TYPE_ISA, NULL);
buildLog_ += aclGetCompilerLog(dev().hsaCompiler());
if (errorCode != ACL_SUCCESS) {
- LogError("Failed to finalize");
+ buildLog_ += "Error: BRIG finalization to ISA failed.\n";
return false;
}
}
@@ -2116,31 +2115,33 @@ HSAILProgram::linkImpl(amd::option::Options* options)
if (!isNull() && hsaLoad) {
executable_ = Executable::Create(HSA_PROFILE_BASE, &loaderContext_, NULL);
if (executable_ == NULL) {
+ buildLog_ += "Error: Executable for AMD HSA Code Object isn't created.\n";
return false;
}
size_t size = 0;
hsa_code_object_t code_object;
code_object.handle = reinterpret_cast(aclExtractSection(dev().hsaCompiler(), binaryElf_, &size, aclTEXT, &errorCode));
if (errorCode != ACL_SUCCESS) {
+ buildLog_ += "Error: Extracting AMD HSA Code Object from binary failed.\n";
return false;
}
hsa_status_t status = executable_->LoadCodeObject(agent, code_object, NULL);
if (status != HSA_STATUS_SUCCESS) {
- buildLog_ += "Error while HSA Loader phase: loading HSA Code Object\n";
+ buildLog_ += "Error: AMD HSA Code Object loading failed.\n";
return false;
}
}
size_t kernelNamesSize = 0;
errorCode = aclQueryInfo(dev().hsaCompiler(), binaryElf_, RT_KERNEL_NAMES, NULL, NULL, &kernelNamesSize);
if (errorCode != ACL_SUCCESS) {
- buildLog_ += "Error while Finalization phase: Kernel names size querying from the ELF failed\n";
+ buildLog_ += "Error: Querying of kernel names size from the binary failed.\n";
return false;
}
if (!isNull() && kernelNamesSize > 0) {
char* kernelNames = new char[kernelNamesSize];
errorCode = aclQueryInfo(dev().hsaCompiler(), binaryElf_, RT_KERNEL_NAMES, NULL, kernelNames, &kernelNamesSize);
if (errorCode != ACL_SUCCESS) {
- buildLog_ += "Error while Finalization phase: Kernel names querying from the ELF failed\n";
+ buildLog_ += "Error: Querying of kernel names from the binary failed.\n";
delete kernelNames;
return false;
}
@@ -2157,7 +2158,8 @@ HSAILProgram::linkImpl(amd::option::Options* options)
errorCode = aclQueryInfo(dev().hsaCompiler(), binaryElf_, RT_NUM_KERNEL_HIDDEN_ARGS,
openclKernelName.c_str(), &md.numHiddenKernelArgs, &sizeOfnumHiddenKernelArgs);
if (errorCode != ACL_SUCCESS) {
- buildLog_ += "Error while Finalization phase: Kernel extra arguments count querying from the ELF failed\n";
+ buildLog_ += "Error: Querying of kernel '" + openclKernelName +
+ "' extra arguments count from AMD HSA Code Object failed. Kernel initialization failed.\n";
return false;
}
HSAILKernel *aKernel = new HSAILKernel(kernelName, this, options->origOptionStr + hsailOptions(),
@@ -2165,11 +2167,12 @@ HSAILProgram::linkImpl(amd::option::Options* options)
kernels()[kernelName] = aKernel;
amd::hsa::loader::Symbol *sym = executable_->GetSymbol("", openclKernelName.c_str(), agent, 0);
if (!sym) {
- LogError("Failed to get kernel ISA code");
+ buildLog_ += "Error: Getting kernel ISA code symbol '" + openclKernelName +
+ "' from AMD HSA Code Object failed. Kernel initialization failed.\n";
return false;
}
if (!aKernel->init(sym, false)) {
- LogError("Failed to init HSAILKernel");
+ buildLog_ += "Error: Kernel '" + openclKernelName + "' initialization failed.\n";
return false;
}
buildLog_ += aKernel->buildLog();
diff --git a/projects/clr/rocclr/runtime/platform/program.cpp b/projects/clr/rocclr/runtime/platform/program.cpp
index 5789d0f7b5..7d2cd85e87 100644
--- a/projects/clr/rocclr/runtime/platform/program.cpp
+++ b/projects/clr/rocclr/runtime/platform/program.cpp
@@ -485,6 +485,10 @@ Program::build(
}
}
+ if (retval != CL_SUCCESS) {
+ return retval;
+ }
+
// Rebuild the symbol table
deviceprograms_t::iterator sit;
for (sit = devicePrograms_.begin(); sit != devicePrograms_.end(); ++sit) {