1#ifndef PROTEUS_COMPILATION_TASK_H
2#define PROTEUS_COMPILATION_TASK_H
14#include <llvm/Bitcode/BitcodeReader.h>
15#include <llvm/Bitcode/BitcodeWriter.h>
24 MemoryBufferRef Bitcode;
29 SmallVector<RuntimeConstant> RCVec;
30 SmallVector<uint64_t> LambdaCalleeInfo;
32 std::unordered_map<std::string, GlobalVarInfo> VarNameToGlobalInfo;
35 bool RelinkGlobalsByCopy;
39 bool SpecializeDimsRange;
40 bool SpecializeLaunchBounds;
42 std::unique_ptr<Module> cloneKernelModule(LLVMContext &Ctx) {
44 auto ClonedModule = parseBitcodeFile(
Bitcode, Ctx);
45 if (
auto E = ClonedModule.takeError()) {
49 return std::move(*ClonedModule);
52 void dumpOptimizedIR(Module &M) {
54 llvm::outs() <<
"LLVM IR module post optimization " << M <<
"\n";
57 const auto CreateDumpDirectory = []() {
58 const std::string DumpDirectory =
".proteus-dump";
59 std::filesystem::create_directory(DumpDirectory);
63 static const std::string DumpDirectory = CreateDumpDirectory();
74 const SmallVector<RuntimeConstant> &RCVec,
75 const SmallVector<uint64_t> &LambdaCalleeInfo,
77 const std::unordered_map<std::string, GlobalVarInfo> &VarNameToGlobalInfo,
79 bool RelinkGlobalsByCopy)
81 Name(
std::move(Name)), BlockDim(BlockDim), GridDim(GridDim),
82 RCVec(RCVec), LambdaCalleeInfo(LambdaCalleeInfo),
84 VarNameToGlobalInfo(VarNameToGlobalInfo), CGConfig(&CGConfig),
85 DumpIR(DumpIR), RelinkGlobalsByCopy(RelinkGlobalsByCopy),
87 CGConfig.minBlocksPerSM(BlockDim.x * BlockDim.y * BlockDim.z)),
88 SpecializeArgs(CGConfig.specializeArgs()),
89 SpecializeDims(CGConfig.specializeDims()),
90 SpecializeDimsRange(CGConfig.specializeDimsRange()),
91 SpecializeLaunchBounds(CGConfig.specializeLaunchBounds()) {
93 llvm::SmallString<128> S;
94 llvm::raw_svector_ostream OS(S);
95 OS <<
"[KernelConfig] ID:" << this->Name.
base() <<
" ";
115 std::chrono::high_resolution_clock::time_point Start, End;
117 TimerRAII(
HashT HashValue) : HashValue(HashValue) {
118 if (Config::get().ProteusDebugOutput) {
119 Start = std::chrono::high_resolution_clock::now();
124 if (Config::get().ProteusDebugOutput) {
125 auto End = std::chrono::high_resolution_clock::now();
126 auto Duration = End - Start;
128 std::chrono::duration_cast<std::chrono::milliseconds>(Duration)
130 Logger::logs(
"proteus")
131 <<
"Compiled HashValue " << HashValue.
toString() <<
" for "
132 << Milliseconds <<
"ms\n";
138 std::unique_ptr<Module> M = cloneKernelModule(Ctx);
142 proteus::specializeIR(*M, Name.
base(), Name.
suffix(), BlockDim, GridDim,
143 RCVec, LambdaCalleeInfo,
145 SpecializeDims, SpecializeDimsRange,
146 SpecializeLaunchBounds, MinBlocksPerSM);
150 replaceGlobalVariablesWithPointers(*M, VarNameToGlobalInfo);
156 if (!RelinkGlobalsByCopy)
157 proteus::relinkGlobalsObject(ObjBuf->getMemBufferRef(),
158 VarNameToGlobalInfo);
#define PROTEUS_DBG(x)
Definition Debug.h:9
#define TIMESCOPE(...)
Definition TimeTracing.h:66
void saveToFile(llvm::StringRef Filepath, T &&Data)
Definition Utils.h:26
void dump(T &OS) const
Definition Config.h:311
Definition CompilationTask.h:21
CompilationTask & operator=(const CompilationTask &)=delete
CompilationTask(Dispatcher &Dispatch, MemoryBufferRef Bitcode, HashT HashValue, KernelName Name, dim3 BlockDim, dim3 GridDim, const SmallVector< RuntimeConstant > &RCVec, const SmallVector< uint64_t > &LambdaCalleeInfo, const LambdaCallsiteRuntimeConstantsMap &LambdaCallsiteRuntimeConstants, const std::unordered_map< std::string, GlobalVarInfo > &VarNameToGlobalInfo, const CodeGenerationConfig &CGConfig, bool DumpIR, bool RelinkGlobalsByCopy)
Definition CompilationTask.h:71
HashT getHashValue() const
Definition CompilationTask.h:110
CompilationTask(CompilationTask &&) noexcept=default
CompilationTask(const CompilationTask &)=delete
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.h:112
static Config & get()
Definition Config.h:371
Definition Dispatcher.h:79
virtual void optimizeModule(llvm::Module &M, const CodeGenerationConfig &CGConfig)
Definition Dispatcher.cpp:88
virtual std::unique_ptr< llvm::MemoryBuffer > codegenModule(llvm::Module &M, const CodeGenerationConfig &CGConfig)
Definition Dispatcher.cpp:93
std::string toString() const
Definition Hashing.h:35
Definition KernelName.h:18
std::string suffix() const
Definition KernelName.h:32
const std::string & base() const
Definition KernelName.h:30
static void trace(llvm::StringRef Msg)
Definition Logger.h:30
static void logfile(const std::string &Filename, T &&Data)
Definition Logger.h:33
Definition TimeTracing.h:33
Definition CompiledLibrary.h:8
Definition MemoryCache.h:27
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
std::string toString(CodegenOption Option)
Definition Config.h:31
DenseMap< uint64_t, LambdaCallsiteRuntimeConstants > LambdaCallsiteRuntimeConstantsMap
Definition LambdaCallsite.h:32
SmallVector< RuntimeConstant, 8 > LambdaCallsiteRuntimeConstants
Definition LambdaCallsite.h:30