1#ifndef PROTEUS_COMPILATION_TASK_HPP
2#define PROTEUS_COMPILATION_TASK_HPP
4#include <llvm/Bitcode/BitcodeReader.h>
5#include <llvm/Bitcode/BitcodeWriter.h>
19 MemoryBufferRef Bitcode;
21 std::string KernelName;
25 SmallVector<RuntimeConstant> RCVec;
26 SmallVector<std::pair<std::string, StringRef>> LambdaCalleeInfo;
27 std::unordered_map<std::string, const void *> VarNameToDevPtr;
28 SmallPtrSet<void *, 8> GlobalLinkedBinaries;
29 std::string DeviceArch;
32 bool RelinkGlobalsByCopy;
35 bool SpecializeLaunchBounds;
37 std::unique_ptr<Module> cloneKernelModule(LLVMContext &Ctx) {
38 auto ClonedModule = parseBitcodeFile(Bitcode, Ctx);
39 if (
auto E = ClonedModule.takeError()) {
43 return std::move(*ClonedModule);
48 MemoryBufferRef Bitcode,
HashT HashValue,
const std::string &KernelName,
49 std::string &Suffix, dim3 BlockDim, dim3 GridDim,
50 const SmallVector<RuntimeConstant> &RCVec,
51 const SmallVector<std::pair<std::string, StringRef>> &LambdaCalleeInfo,
52 const std::unordered_map<std::string, const void *> &VarNameToDevPtr,
53 const SmallPtrSet<void *, 8> &GlobalLinkedBinaries,
54 const std::string &DeviceArch,
CodegenOption CGOption,
bool DumpIR,
55 bool RelinkGlobalsByCopy,
bool SpecializeArgs,
bool SpecializeDims,
56 bool SpecializeLaunchBounds)
58 Suffix(Suffix), BlockDim(BlockDim), GridDim(GridDim), RCVec(RCVec),
59 LambdaCalleeInfo(LambdaCalleeInfo), VarNameToDevPtr(VarNameToDevPtr),
60 GlobalLinkedBinaries(GlobalLinkedBinaries), DeviceArch(DeviceArch),
61 CGOption(CGOption), DumpIR(DumpIR),
62 RelinkGlobalsByCopy(RelinkGlobalsByCopy),
63 SpecializeArgs(SpecializeArgs), SpecializeDims(SpecializeDims),
64 SpecializeLaunchBounds(SpecializeLaunchBounds) {}
77#if PROTEUS_ENABLE_DEBUG
78 auto Start = std::chrono::high_resolution_clock::now();
82 std::unique_ptr<Module> M = cloneKernelModule(Ctx);
84 std::string KernelMangled = (
KernelName + Suffix);
86 proteus::specializeIR(*M,
KernelName, Suffix, BlockDim, GridDim, RCVec,
87 LambdaCalleeInfo, SpecializeArgs, SpecializeDims,
88 SpecializeLaunchBounds);
90 replaceGlobalVariablesWithPointers(*M, VarNameToDevPtr);
92#if PROTEUS_ENABLE_CUDA
95#elif PROTEUS_ENABLE_HIP
104#error "JitEngineDevice requires PROTEUS_ENABLE_CUDA or PROTEUS_ENABLE_HIP"
108 const auto CreateDumpDirectory = []() {
109 const std::string DumpDirectory =
".proteus-dump";
110 std::filesystem::create_directory(DumpDirectory);
111 return DumpDirectory;
114 static const std::string DumpDirectory = CreateDumpDirectory();
123 if (!RelinkGlobalsByCopy)
124 proteus::relinkGlobalsObject(ObjBuf->getMemBufferRef(), VarNameToDevPtr);
126#if PROTEUS_ENABLE_DEBUG
127 auto End = std::chrono::high_resolution_clock::now();
128 auto Duration = End - Start;
130 std::chrono::duration_cast<std::chrono::milliseconds>(Duration).count();
132 <<
" for " << Milliseconds <<
"ms\n";
void char * KernelName
Definition CompilerInterfaceDevice.cpp:50
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:4
void saveToFile(llvm::StringRef Filepath, T &&Data)
Definition Utils.h:23
Definition CompilationTask.hpp:17
CompilationTask & operator=(const CompilationTask &)=delete
CompilationTask(MemoryBufferRef Bitcode, HashT HashValue, const std::string &KernelName, std::string &Suffix, dim3 BlockDim, dim3 GridDim, const SmallVector< RuntimeConstant > &RCVec, const SmallVector< std::pair< std::string, StringRef > > &LambdaCalleeInfo, const std::unordered_map< std::string, const void * > &VarNameToDevPtr, const SmallPtrSet< void *, 8 > &GlobalLinkedBinaries, const std::string &DeviceArch, CodegenOption CGOption, bool DumpIR, bool RelinkGlobalsByCopy, bool SpecializeArgs, bool SpecializeDims, bool SpecializeLaunchBounds)
Definition CompilationTask.hpp:47
HashT getHashValue() const
Definition CompilationTask.hpp:74
CompilationTask(CompilationTask &&) noexcept=default
CompilationTask(const CompilationTask &)=delete
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.hpp:76
Definition Hashing.hpp:19
std::string toString() const
Definition Hashing.hpp:27
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.hpp:19
Definition Dispatcher.cpp:14
void optimizeIR(Module &M, StringRef Arch, char OptLevel, unsigned CodegenOptLevel)
Definition CoreLLVM.hpp:151
CodegenOption
Definition Config.hpp:10
std::unique_ptr< MemoryBuffer > codegenObject(Module &M, StringRef DeviceArch, SmallPtrSetImpl< void * > &GlobalLinkedBinaries, CodegenOption CGOption=CodegenOption::RTC)
Definition CoreLLVMCUDA.hpp:155
std::string toString(CodegenOption Option)
Definition Config.hpp:23