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) {