P4 to Git Change 1303140 by lmoriche@lmoriche_opencl_dev on 2016/08/15 17:04:37
SWDEV-94610 - Code provided by Wilkin - Implement the roc Program Manager to call the Lightning Compiler instead of the compiler library. - Embed and use the pre-compiled header generated by the built-in library build - If LLVM_BIN is not set, try to find Clang from the libamdocl path Testing: http://ocltc.amd.com:8111/viewModification.html?modId=75068&personal=true&buildTypeId=&tab=vcsModificationBuilds&show_all_builds=true Affected files ... ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/elf.cpp#35 edit ... //depot/stg/opencl/drivers/opencl/compiler/lib/loaders/elf/elf.hpp#24 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/blitcl.cpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#200 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/build/Makefile.oclrocm#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompiler.cpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmetadata.cpp#1 add ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmetadata.hpp#1 add ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocvirtual.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#81 edit
Bu işleme şunda yer alıyor:
@@ -11,7 +11,9 @@
|
||||
#include "os/os.hpp"
|
||||
#include "rocdevice.hpp"
|
||||
#include "rocprogram.hpp"
|
||||
#if !defined(WITH_LIGHTNING_COMPILER)
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "opencl-c.amdgcn.inc"
|
||||
#else // !defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "roccompilerlib.hpp"
|
||||
#endif // !defined(WITH_LIGHTNING_COMPILER)
|
||||
#include "utils/options.hpp"
|
||||
@@ -30,6 +32,137 @@ static void logFunction(const char* msg, size_t size)
|
||||
|
||||
static int programsCount = 0;
|
||||
|
||||
#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)
|
||||
{
|
||||
std::vector<std::string> complibOptions;
|
||||
if (!this->compileOptions_.empty()) {
|
||||
complibOptions.push_back(this->compileOptions_);
|
||||
}
|
||||
|
||||
std::vector<amd::opencl_driver::Data*> inputs;
|
||||
amd::opencl_driver::Data* src = device().compiler()->NewBufferReference(
|
||||
amd::opencl_driver::DT_CL,sourceCode.c_str(),
|
||||
sourceCode.length());
|
||||
if (src == NULL) {
|
||||
buildLog_ += "Error while creating data from source code";
|
||||
return false;
|
||||
}
|
||||
inputs.push_back(src);
|
||||
|
||||
//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();
|
||||
|
||||
amd::opencl_driver::Data* inc = device().compiler()->NewFileReference(
|
||||
amd::opencl_driver::DT_CL_HEADER,
|
||||
headerFileNames[i]);
|
||||
inputs.push_back(inc);
|
||||
}
|
||||
|
||||
|
||||
//Set the options for the compiler
|
||||
//Set the include path for the temp folder that contains the includes
|
||||
if(!headers.empty()) {
|
||||
complibOptions.push_back("-I"+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_;
|
||||
|
||||
complibOptions.push_back(opts.str());
|
||||
}
|
||||
|
||||
// Compile source to IR
|
||||
appendHsailOptions(complibOptions);
|
||||
|
||||
amd::opencl_driver::File* pch = device().compiler()->NewTempFile(
|
||||
amd::opencl_driver::DT_CL_HEADER);
|
||||
if (pch == NULL || !pch->WriteData((const char*) opencl_c_amdgcn,
|
||||
opencl_c_amdgcn_size)) {
|
||||
buildLog_ += "Error while opening the opencl-c header ";
|
||||
return false;
|
||||
}
|
||||
|
||||
// FIXME_lmoriche: Force OpenCL-C 2.0, since the built-ins are built that way.
|
||||
complibOptions.push_back("-Xclang");complibOptions.push_back("-cl-std=CL2.0");
|
||||
complibOptions.push_back("-Xclang");complibOptions.push_back("-include-pch");
|
||||
complibOptions.push_back("-Xclang");complibOptions.push_back(pch->Name());
|
||||
|
||||
amd::opencl_driver::Buffer* output = device().compiler()->NewBuffer(amd::opencl_driver::DT_LLVM_BC);
|
||||
if (output == NULL) {
|
||||
buildLog_ += "Error while creating buffer for the LLVM bitcode";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!device().compiler()->CompileToLLVMBitcode(inputs, output, complibOptions)) {
|
||||
buildLog_ += "Error while compiling \
|
||||
opencl source: Compiling CL to IR";
|
||||
#if 0
|
||||
std::cerr << "\n**** Compiler Output After CompileToLLVMBitcode ****\n";
|
||||
std::cerr << device().compiler()->Output().c_str();
|
||||
std::cerr << "********************************************************\n\n";
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
// save the source code
|
||||
//Create Binary
|
||||
codeObjBinary_ = new CodeObjBinary();
|
||||
|
||||
openCLSource_ = sourceCode;
|
||||
codeObjBinary_->saveIR(std::string(output->Buf().begin(), output->Buf().end()));
|
||||
return true;
|
||||
}
|
||||
#endif // defined(WITH_LIGHTNING_COMPILER)
|
||||
|
||||
bool
|
||||
HSAILProgram::compileImpl(const std::string& sourceCode,
|
||||
const std::vector<const std::string*>& headers,
|
||||
@@ -37,14 +170,13 @@ HSAILProgram::compileImpl(const std::string& sourceCode,
|
||||
amd::option::Options* options)
|
||||
{
|
||||
#if defined(WITH_LIGHTNING_COMPILER)
|
||||
assert(!"FIXME_Wilkin");
|
||||
return false;
|
||||
return compileImpl_LC(sourceCode, headers, headerIncludeNames, options);
|
||||
#else // !defined(WITH_LIGHTNING_COMPILER)
|
||||
acl_error errorCode;
|
||||
aclTargetInfo target;
|
||||
|
||||
//Defaulting to bonaire
|
||||
//Todo (sramalin) : Query the device for asic type-
|
||||
//Todo (sramalin) : Query the device for asic type-
|
||||
//Defaulting to Bonair for now.
|
||||
target = g_complibApi._aclGetTargetInfo(LP64_SWITCH("hsail","hsail64"), "Bonaire",
|
||||
&errorCode);
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle