From 3f84eb59563f31a58b0833fb89babda62cd9bdeb Mon Sep 17 00:00:00 2001 From: foreman Date: Thu, 29 Oct 2015 17:09:18 -0400 Subject: [PATCH] P4 to Git Change 1205606 by emankov@em-hsa-amd on 2015/10/29 16:46:58 SWDEV-77584 - ORCA RT: Preparations for enabling HSAIL on OpenCL 1.2 by default. Minor refactoring of compile/link options' routines. [Testing] pre check-in [Reviewer] German Andryeyev http://ocltc.amd.com/reviews/r/8848 Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#74 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.hpp#36 edit --- rocclr/runtime/platform/program.cpp | 141 ++++++++++++++-------------- rocclr/runtime/platform/program.hpp | 6 ++ 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/rocclr/runtime/platform/program.cpp b/rocclr/runtime/platform/program.cpp index e8fcf0f7e8..40f27f383d 100644 --- a/rocclr/runtime/platform/program.cpp +++ b/rocclr/runtime/platform/program.cpp @@ -6,6 +6,7 @@ #include "platform/program.hpp" #include "platform/context.hpp" #include "utils/options.hpp" +#include "utils/libUtils.h" #include "acl.h" #include // for malloc @@ -111,28 +112,6 @@ Program::getDeviceProgram(const Device& device) const Monitor Program::buildLock_("OCL build program", true); -inline static int -GetOclCVersion(const char* clVer) -{ - std::string clStd(clVer); - - if (clStd == "CL1.0") { - return 100; - } - else if (clStd == "CL1.1") { - return 110; - } - else if (clStd == "CL1.2") { - return 120; - } - else { - if (clStd != "CL2.0") { - LogError("Unsupported OCL C version!"); - } - return 200; - } -} - cl_int Program::compile( const std::vector& devices, @@ -152,7 +131,6 @@ Program::compile( clear(); // Process build options. - option::Options parsedOptions; std::string cppstr(options ? options : ""); // if there is a -ignore-env, adjust options. @@ -164,22 +142,11 @@ Program::compile( optionChangable = false; } } - if (optionChangable) { - if (AMD_OCL_BUILD_OPTIONS != NULL) { - // Override options. - cppstr = AMD_OCL_BUILD_OPTIONS; - } - if (!Device::appProfile()->GetBuildOptsAppend().empty()) { - cppstr.append(" "); - cppstr.append(Device::appProfile()->GetBuildOptsAppend()); - } - if (AMD_OCL_BUILD_OPTIONS_APPEND != NULL) { - cppstr.append(" "); - cppstr.append(AMD_OCL_BUILD_OPTIONS_APPEND); - } - } - if (!option::parseAllOptions(cppstr, parsedOptions)) { + option::Options parsedOptions; + if ((optionChangable && !ParseAMDOCLBUILDOptions(parsedOptions)) || + !option::parseAllOptions(cppstr, parsedOptions)) { programLog_ = parsedOptions.optionsLog(); + LogError("Parsing compile options failed."); return CL_INVALID_COMPILER_OPTIONS; } programLog_ = parsedOptions.optionsLog(); @@ -197,7 +164,7 @@ Program::compile( if (devProgram == NULL) { const binary_t& bin = binary(**it); retval = addDeviceProgram(**it, bin.first, bin.second, - GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200); + GetOclCVersion(parsedOptions.oVariables->CLStd) >= 20); if (retval != CL_SUCCESS) { return retval; } @@ -262,7 +229,6 @@ Program::link( clear(); // Process build options. - option::Options parsedOptions; std::string cppstr(options ? options : ""); // if there is a -ignore-env, adjust options. @@ -274,18 +240,11 @@ Program::link( optionChangable = false; } } - if (optionChangable) { - if (AMD_OCL_LINK_OPTIONS != NULL) { - // Override options. - cppstr = AMD_OCL_LINK_OPTIONS; - } - if (AMD_OCL_LINK_OPTIONS_APPEND != NULL) { - cppstr.append(" "); - cppstr.append(AMD_OCL_LINK_OPTIONS_APPEND); - } - } - if (!option::parseLinkOptions(cppstr, parsedOptions)) { + option::Options parsedOptions; + if ((optionChangable && !ParseAMDOCLLINKOptions(parsedOptions)) || + !option::parseLinkOptions(cppstr, parsedOptions)) { programLog_ = parsedOptions.optionsLog(); + LogError("Parsing link options failed."); return CL_INVALID_LINKER_OPTIONS; } programLog_ = parsedOptions.optionsLog(); @@ -296,7 +255,7 @@ Program::link( // find the corresponding device program in each input program std::vector inputDevPrograms(numInputs); bool found = false; - bool hsail = GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200; + bool hsail = GetOclCVersion(parsedOptions.oVariables->CLStd) >= 20; for (size_t i = 0; i < numInputs; ++i) { Program& inputProgram = *inputPrograms[i]; hsail = hsail || inputProgram.isSPIRV_; @@ -312,7 +271,7 @@ Program::link( if (pos != std::string::npos) { std::string clStd = inputDevPrograms[i]->compileOptions().substr((pos+8), 5); - hsail = hsail || GetOclCVersion(clStd.c_str()) >= 200; + hsail = hsail || GetOclCVersion(clStd.c_str()) >= 20; } } if (inputDevPrograms.size() == 0) { @@ -412,7 +371,6 @@ Program::build( clear(); // Process build options. - option::Options parsedOptions; std::string cppstr(options ? options : ""); // if there is a -ignore-env, adjust options. @@ -424,23 +382,12 @@ Program::build( optionChangable = false; } } - if (optionChangable) { - if (AMD_OCL_BUILD_OPTIONS != NULL) { - // Override options. - cppstr = AMD_OCL_BUILD_OPTIONS; - } - if (!Device::appProfile()->GetBuildOptsAppend().empty()) { - cppstr.append(" "); - cppstr.append(Device::appProfile()->GetBuildOptsAppend()); - } - if (AMD_OCL_BUILD_OPTIONS_APPEND != NULL) { - cppstr.append(" "); - cppstr.append(AMD_OCL_BUILD_OPTIONS_APPEND); - } - } - if (!option::parseAllOptions(cppstr, parsedOptions)) { + option::Options parsedOptions; + if ((optionChangable && !ParseAMDOCLBUILDOptions(parsedOptions)) || + !option::parseAllOptions(cppstr, parsedOptions)) { programLog_ = parsedOptions.optionsLog(); - return CL_INVALID_BUILD_OPTIONS; + LogError("Parsing compile options failed."); + return CL_INVALID_COMPILER_OPTIONS; } programLog_ = parsedOptions.optionsLog(); @@ -455,7 +402,7 @@ Program::build( continue; } retval = addDeviceProgram(**it, bin.first, bin.second, - GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200); + GetOclCVersion(parsedOptions.oVariables->CLStd) >= 20); if (retval != CL_SUCCESS) { return retval; } @@ -538,6 +485,58 @@ Program::clear() kernelNames_.clear(); } +int +Program::GetOclCVersion(const char* clVer) { + // default version + int version = 12; + if (clVer == NULL) { + return version; + } + std::string clStd(clVer); + if (clStd.size() != 5) { + return version; + } + clStd.erase(0,2); + clStd.erase(1,1); + return std::stoi(clStd); +} + +bool +Program::ParseAMDOCLBUILDOptions(option::Options& options) { + std::string opts; + if (AMD_OCL_BUILD_OPTIONS != NULL) { + opts = AMD_OCL_BUILD_OPTIONS; + } + if (!Device::appProfile()->GetBuildOptsAppend().empty()) { + opts.append(" "); + opts.append(Device::appProfile()->GetBuildOptsAppend()); + } + if (AMD_OCL_BUILD_OPTIONS_APPEND != NULL) { + opts.append(" "); + opts.append(AMD_OCL_BUILD_OPTIONS_APPEND); + } + if (!amd::option::parseAllOptions(opts, options)) { + return false; + } + return true; +} + +bool +Program::ParseAMDOCLLINKOptions(option::Options& options) { + std::string opts; + if (AMD_OCL_LINK_OPTIONS != NULL) { + opts = AMD_OCL_LINK_OPTIONS; + } + if (AMD_OCL_LINK_OPTIONS_APPEND != NULL) { + opts.append(" "); + opts.append(AMD_OCL_LINK_OPTIONS_APPEND); + } + if (!amd::option::parseLinkOptions(opts, options)) { + return false; + } + return true; +} + bool Symbol::setDeviceKernel( const Device& device, diff --git a/rocclr/runtime/platform/program.hpp b/rocclr/runtime/platform/program.hpp index 1793391d2a..2402d218e0 100644 --- a/rocclr/runtime/platform/program.hpp +++ b/rocclr/runtime/platform/program.hpp @@ -186,6 +186,12 @@ public: //! RTTI internal implementation virtual ObjectType objectType() const {return ObjectTypeProgram;} + + static int GetOclCVersion(const char* clVer); + + static bool ParseAMDOCLBUILDOptions(option::Options& options); + + static bool ParseAMDOCLLINKOptions(option::Options& options); }; /*! @}