P4 to Git Change 1481396 by lmoriche@lmoriche_opencl_dev2 on 2017/11/10 16:12:29
SWDEV-118564 - [OCL-LC-ROCm] Refactor the Lightning Compiler program manager to allow the compiler library API and the ROCm-OpenCL-Driver to coexist in the same platform. - Default compiler is the Lightning Compiler - Fall back to the HSAIL compiler if the amdoclcl compiler library is in the PATH and the -legacy option is specified (or app-detect) Affected files ... ... //depot/stg/opencl/drivers/opencl/Makefile#59 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/build/Makefile.api#168 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/api/v0_8/acl.cpp#44 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/api/v0_8/aclLoaders.cpp#14 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/api/v0_8/aclValidation.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/build/Makefile.complib#98 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/elf.hpp#26 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/utils/OPTIONS.def#137 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/utils/build/Makefile.utils#19 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.cpp#71 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#213 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#292 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.cpp#235 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#49 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/build/Makefile.oclrocm#20 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompiler.cpp#38 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.cpp#8 delete ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.hpp#6 delete ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#75 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#30 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.hpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#75 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.hpp#30 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#88 edit
This commit is contained in:
@@ -15,9 +15,7 @@
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "opencl1.2-c.amdgcn.inc"
|
||||
#include "opencl2.0-c.amdgcn.inc"
|
||||
#else // !defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "roccompilerlib.hpp"
|
||||
#endif // !defined(WITH_LIGHTNING_COMPILER)
|
||||
#endif // defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "utils/options.hpp"
|
||||
#include <cstdio>
|
||||
|
||||
@@ -48,10 +46,125 @@ static void logFunction(const char* msg, size_t size) {
|
||||
|
||||
static int programsCount = 0;
|
||||
|
||||
bool HSAILProgram::compileImpl(const std::string& sourceCode,
|
||||
const std::vector<const std::string*>& headers,
|
||||
const char** headerIncludeNames, amd::option::Options* options) {
|
||||
acl_error errorCode;
|
||||
aclTargetInfo target;
|
||||
|
||||
target = aclGetTargetInfo(LP64_SWITCH("hsail", "hsail64"),
|
||||
dev().deviceInfo().complibTarget_, &errorCode);
|
||||
|
||||
// end if asic info is ready
|
||||
// We dump the source code for each program (param: headers)
|
||||
// into their filenames (headerIncludeNames) into the TEMP
|
||||
// folder specific to the OS and add the include path while
|
||||
// compiling
|
||||
|
||||
// Find the temp folder for the OS
|
||||
std::string tempFolder = amd::Os::getEnvironment("TEMP");
|
||||
if (tempFolder.empty()) {
|
||||
tempFolder = amd::Os::getEnvironment("TMP");
|
||||
if (tempFolder.empty()) {
|
||||
tempFolder = WINDOWS_SWITCH(".", "/tmp");
|
||||
;
|
||||
}
|
||||
}
|
||||
// Iterate through each source code and dump it into tmp
|
||||
std::fstream f;
|
||||
std::vector<std::string> headerFileNames(headers.size());
|
||||
std::vector<std::string> newDirs;
|
||||
for (size_t i = 0; i < headers.size(); ++i) {
|
||||
std::string headerPath = tempFolder;
|
||||
std::string headerIncludeName(headerIncludeNames[i]);
|
||||
// replace / in path with current os's file separator
|
||||
if (amd::Os::fileSeparator() != '/') {
|
||||
for (std::string::iterator it = headerIncludeName.begin(), end = headerIncludeName.end();
|
||||
it != end; ++it) {
|
||||
if (*it == '/') *it = amd::Os::fileSeparator();
|
||||
}
|
||||
}
|
||||
size_t pos = headerIncludeName.rfind(amd::Os::fileSeparator());
|
||||
if (pos != std::string::npos) {
|
||||
headerPath += amd::Os::fileSeparator();
|
||||
headerPath += headerIncludeName.substr(0, pos);
|
||||
headerIncludeName = headerIncludeName.substr(pos + 1);
|
||||
}
|
||||
if (!amd::Os::pathExists(headerPath)) {
|
||||
bool ret = amd::Os::createPath(headerPath);
|
||||
assert(ret && "failed creating path!");
|
||||
newDirs.push_back(headerPath);
|
||||
}
|
||||
std::string headerFullName = headerPath + amd::Os::fileSeparator() + headerIncludeName;
|
||||
headerFileNames[i] = headerFullName;
|
||||
f.open(headerFullName.c_str(), std::fstream::out);
|
||||
// Should we allow asserts
|
||||
assert(!f.fail() && "failed creating header file!");
|
||||
f.write(headers[i]->c_str(), headers[i]->length());
|
||||
f.close();
|
||||
}
|
||||
|
||||
// Create Binary
|
||||
binaryElf_ = aclBinaryInit(sizeof(aclBinary), &target, &binOpts_, &errorCode);
|
||||
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
buildLog_ +=
|
||||
"Error while compiling opencl source:\
|
||||
aclBinary init failure \n";
|
||||
LogWarning("aclBinaryInit failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Insert opencl into binary
|
||||
errorCode = aclInsertSection(device().compiler(), binaryElf_, sourceCode.c_str(),
|
||||
strlen(sourceCode.c_str()), aclSOURCE);
|
||||
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
buildLog_ +=
|
||||
"Error while converting to BRIG: \
|
||||
Inserting openCl Source \n";
|
||||
}
|
||||
|
||||
// Set the options for the compiler
|
||||
// Set the include path for the temp folder that contains the includes
|
||||
if (!headers.empty()) {
|
||||
this->compileOptions_.append(" -I");
|
||||
this->compileOptions_.append(tempFolder);
|
||||
}
|
||||
|
||||
// Add only for CL2.0 and later
|
||||
if (options->oVariables->CLStd[2] >= '2') {
|
||||
std::stringstream opts;
|
||||
opts << " -D"
|
||||
<< "CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE=" << device().info().maxGlobalVariableSize_;
|
||||
compileOptions_.append(opts.str());
|
||||
}
|
||||
|
||||
// Compile source to IR
|
||||
this->compileOptions_.append(preprocessorOptions(options));
|
||||
this->compileOptions_.append(codegenOptions(options));
|
||||
|
||||
errorCode = aclCompile(device().compiler(), binaryElf_,
|
||||
//"-Wf,--support_all_extensions",
|
||||
this->compileOptions_.c_str(), ACL_TYPE_OPENCL,
|
||||
ACL_TYPE_LLVMIR_BINARY, logFunction);
|
||||
buildLog_ += aclGetCompilerLog(device().compiler());
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
LogWarning("aclCompile failed");
|
||||
buildLog_ +=
|
||||
"Error while compiling \
|
||||
opencl source: Compiling CL to IR";
|
||||
return false;
|
||||
}
|
||||
// Save the binary in the interface class
|
||||
saveBinaryAndSetType(TYPE_COMPILED);
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
bool HSAILProgram::compileImpl_LC(const std::string& sourceCode,
|
||||
const std::vector<const std::string*>& headers,
|
||||
const char** headerIncludeNames, amd::option::Options* options) {
|
||||
bool LightningProgram::compileImpl(const std::string& sourceCode,
|
||||
const std::vector<const std::string*>& headers,
|
||||
const char** headerIncludeNames, amd::option::Options* options) {
|
||||
using namespace amd::opencl_driver;
|
||||
std::unique_ptr<Compiler> C(newCompilerInstance());
|
||||
std::vector<Data*> inputs;
|
||||
@@ -238,128 +351,7 @@ bool HSAILProgram::compileImpl_LC(const std::string& sourceCode,
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif // defined(WITH_LIGHTNING_COMPILER)
|
||||
|
||||
bool HSAILProgram::compileImpl(const std::string& sourceCode,
|
||||
const std::vector<const std::string*>& headers,
|
||||
const char** headerIncludeNames, amd::option::Options* options) {
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
return compileImpl_LC(sourceCode, headers, headerIncludeNames, options);
|
||||
#else // !defined(WITH_LIGHTNING_COMPILER)
|
||||
acl_error errorCode;
|
||||
aclTargetInfo target;
|
||||
|
||||
target = g_complibApi._aclGetTargetInfo(LP64_SWITCH("hsail", "hsail64"),
|
||||
dev().deviceInfo().complibTarget_, &errorCode);
|
||||
|
||||
// end if asic info is ready
|
||||
// We dump the source code for each program (param: headers)
|
||||
// into their filenames (headerIncludeNames) into the TEMP
|
||||
// folder specific to the OS and add the include path while
|
||||
// compiling
|
||||
|
||||
// Find the temp folder for the OS
|
||||
std::string tempFolder = amd::Os::getEnvironment("TEMP");
|
||||
if (tempFolder.empty()) {
|
||||
tempFolder = amd::Os::getEnvironment("TMP");
|
||||
if (tempFolder.empty()) {
|
||||
tempFolder = WINDOWS_SWITCH(".", "/tmp");
|
||||
;
|
||||
}
|
||||
}
|
||||
// Iterate through each source code and dump it into tmp
|
||||
std::fstream f;
|
||||
std::vector<std::string> headerFileNames(headers.size());
|
||||
std::vector<std::string> newDirs;
|
||||
for (size_t i = 0; i < headers.size(); ++i) {
|
||||
std::string headerPath = tempFolder;
|
||||
std::string headerIncludeName(headerIncludeNames[i]);
|
||||
// replace / in path with current os's file separator
|
||||
if (amd::Os::fileSeparator() != '/') {
|
||||
for (std::string::iterator it = headerIncludeName.begin(), end = headerIncludeName.end();
|
||||
it != end; ++it) {
|
||||
if (*it == '/') *it = amd::Os::fileSeparator();
|
||||
}
|
||||
}
|
||||
size_t pos = headerIncludeName.rfind(amd::Os::fileSeparator());
|
||||
if (pos != std::string::npos) {
|
||||
headerPath += amd::Os::fileSeparator();
|
||||
headerPath += headerIncludeName.substr(0, pos);
|
||||
headerIncludeName = headerIncludeName.substr(pos + 1);
|
||||
}
|
||||
if (!amd::Os::pathExists(headerPath)) {
|
||||
bool ret = amd::Os::createPath(headerPath);
|
||||
assert(ret && "failed creating path!");
|
||||
newDirs.push_back(headerPath);
|
||||
}
|
||||
std::string headerFullName = headerPath + amd::Os::fileSeparator() + headerIncludeName;
|
||||
headerFileNames[i] = headerFullName;
|
||||
f.open(headerFullName.c_str(), std::fstream::out);
|
||||
// Should we allow asserts
|
||||
assert(!f.fail() && "failed creating header file!");
|
||||
f.write(headers[i]->c_str(), headers[i]->length());
|
||||
f.close();
|
||||
}
|
||||
|
||||
// Create Binary
|
||||
binaryElf_ = g_complibApi._aclBinaryInit(sizeof(aclBinary), &target, &binOpts_, &errorCode);
|
||||
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
buildLog_ +=
|
||||
"Error while compiling opencl source:\
|
||||
aclBinary init failure \n";
|
||||
LogWarning("aclBinaryInit failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Insert opencl into binary
|
||||
errorCode = g_complibApi._aclInsertSection(device().compiler(), binaryElf_, sourceCode.c_str(),
|
||||
strlen(sourceCode.c_str()), aclSOURCE);
|
||||
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
buildLog_ +=
|
||||
"Error while converting to BRIG: \
|
||||
Inserting openCl Source \n";
|
||||
}
|
||||
|
||||
// Set the options for the compiler
|
||||
// Set the include path for the temp folder that contains the includes
|
||||
if (!headers.empty()) {
|
||||
this->compileOptions_.append(" -I");
|
||||
this->compileOptions_.append(tempFolder);
|
||||
}
|
||||
|
||||
// Add only for CL2.0 and later
|
||||
if (options->oVariables->CLStd[2] >= '2') {
|
||||
std::stringstream opts;
|
||||
opts << " -D"
|
||||
<< "CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE=" << device().info().maxGlobalVariableSize_;
|
||||
compileOptions_.append(opts.str());
|
||||
}
|
||||
|
||||
// Compile source to IR
|
||||
this->compileOptions_.append(preprocessorOptions(options));
|
||||
this->compileOptions_.append(codegenOptions(options));
|
||||
|
||||
errorCode = g_complibApi._aclCompile(device().compiler(), binaryElf_,
|
||||
//"-Wf,--support_all_extensions",
|
||||
this->compileOptions_.c_str(), ACL_TYPE_OPENCL,
|
||||
ACL_TYPE_LLVMIR_BINARY, logFunction);
|
||||
buildLog_ += g_complibApi._aclGetCompilerLog(device().compiler());
|
||||
if (errorCode != ACL_SUCCESS) {
|
||||
LogWarning("aclCompile failed");
|
||||
buildLog_ +=
|
||||
"Error while compiling \
|
||||
opencl source: Compiling CL to IR";
|
||||
return false;
|
||||
}
|
||||
// Save the binary in the interface class
|
||||
saveBinaryAndSetType(TYPE_COMPILED);
|
||||
return true;
|
||||
#endif // !defined(WITH_LIGHTNING_COMPILER)
|
||||
}
|
||||
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
#if defined(ATI_OS_LINUX)
|
||||
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||
|
||||
@@ -396,7 +388,7 @@ static void checkLLVM_BIN() {
|
||||
}
|
||||
#endif // defined(ATI_OS_LINUX)
|
||||
|
||||
amd::opencl_driver::Compiler* HSAILProgram::newCompilerInstance() {
|
||||
amd::opencl_driver::Compiler* LightningProgram::newCompilerInstance() {
|
||||
#if defined(ATI_OS_LINUX)
|
||||
pthread_once(&once, checkLLVM_BIN);
|
||||
#endif // defined(ATI_OS_LINUX)
|
||||
|
||||
Reference in New Issue
Block a user