1#ifndef PROTEUS_CORE_LLVM_DEVICE_HPP
2#define PROTEUS_CORE_LLVM_DEVICE_HPP
12#if defined(PROTEUS_ENABLE_HIP) || defined(PROTEUS_ENABLE_CUDA)
14#include <llvm/Analysis/CallGraph.h>
15#include <llvm/Bitcode/BitcodeReader.h>
16#include <llvm/Bitcode/BitcodeWriter.h>
17#include <llvm/IR/ReplaceConstant.h>
18#include <llvm/IR/Verifier.h>
19#include <llvm/Object/ELFObjectFile.h>
20#include <llvm/Transforms/Utils/Cloning.h>
30inline void setKernelDims(
Module &M,
dim3 &GridDim,
dim3 &BlockDim) {
54 OS <<
"[DimSpec] Replace call to " << F->getName() <<
" with constant "
62 ConstantInt::get(Type::getInt32Ty(M.getContext()),
DimValue);
66 Call->eraseFromParent();
80inline void setKernelDimsAssume(
Module &M,
dim3 &GridDim,
dim3 &BlockDim) {
90 OS <<
"[DimSpec] Assume " <<
IntrinsicF->getName() <<
" with "
108 Intrinsic::getDeclaration(&M, Intrinsic::assume);
127inline void replaceGlobalVariablesWithPointers(
129 const std::unordered_map<std::string, const void *> &VarNameToDevPtr) {
144 ConstantInt::get(Type::getInt64Ty(M.getContext()), 0xDEADBEEFDEADBEEF);
145 auto *
CE = ConstantExpr::getIntToPtr(
Addr,
GV->getType()->getPointerTo());
147 M,
GV->getType()->getPointerTo(),
false, GlobalValue::ExternalLinkage,
148 CE,
GV->getName() +
"$ptr",
nullptr,
GV->getThreadLocalMode(),
149 GV->getAddressSpace(),
true);
155 Worklist.push_back(
GV);
157 while (!Worklist.empty()) {
158 Value *
V = Worklist.pop_back_val();
162 Worklist.push_back(
C);
172 "Expected Instruction or Constant user for Value: " +
toString(*
V) +
207inline void relinkGlobalsObject(
209 const std::unordered_map<std::string, const void *> &VarNameToDevPtr) {
211 object::ELF64LEObjectFile::create(
Object);
259inline void specializeIR(
262 const SmallVector<std::pair<std::string, StringRef>> LambdaCalleeInfo,
263 bool SpecializeArgs,
bool SpecializeDims,
bool SpecializeDimsAssume,
264 bool SpecializeLaunchBounds) {
266 Function *F = M.getFunction(FnName);
268 assert(F &&
"Expected non-null function!");
274 for (
auto &[FnName,
LambdaType] : LambdaCalleeInfo) {
276 Function *F = M.getFunction(FnName);
288 setKernelDims(M, GridDim, BlockDim);
289 if (SpecializeDimsAssume)
290 setKernelDimsAssume(M, GridDim, BlockDim);
291 F->setName(FnName + Suffix);
293 if (SpecializeLaunchBounds) {
294 int BlockSize = BlockDim.x * BlockDim.y * BlockDim.z;
298 OS <<
"[LaunchBoundSpec] BlockSize " <<
BlockSize <<
"\n";
310 <<
"specializeIR " <<
T.elapsed() <<
" ms\n");
const char * VarName
Definition CompilerInterfaceDevice.cpp:20
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:7
#define PROTEUS_TIMER_OUTPUT(x)
Definition TimeTracing.hpp:57
static Config & get()
Definition Config.hpp:284
static LambdaRegistry & instance()
Definition LambdaRegistry.hpp:22
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.hpp:25
static void trace(llvm::StringRef Msg)
Definition Logger.hpp:30
const SmallVector< StringRef > & threadIdxXFnName()
Definition CoreLLVMCUDA.hpp:70
const SmallVector< StringRef > & gridDimYFnName()
Definition CoreLLVMCUDA.hpp:30
const SmallVector< StringRef > & threadIdxZFnName()
Definition CoreLLVMCUDA.hpp:80
const SmallVector< StringRef > & blockIdxZFnName()
Definition CoreLLVMCUDA.hpp:65
const SmallVector< StringRef > & gridDimZFnName()
Definition CoreLLVMCUDA.hpp:35
const SmallVector< StringRef > & gridDimXFnName()
Definition CoreLLVMCUDA.hpp:25
const SmallVector< StringRef > & blockIdxXFnName()
Definition CoreLLVMCUDA.hpp:55
const SmallVector< StringRef > & threadIdxYFnName()
Definition CoreLLVMCUDA.hpp:75
const SmallVector< StringRef > & blockIdxYFnName()
Definition CoreLLVMCUDA.hpp:60
const SmallVector< StringRef > & blockDimYFnName()
Definition CoreLLVMCUDA.hpp:45
const SmallVector< StringRef > & blockDimZFnName()
Definition CoreLLVMCUDA.hpp:50
const SmallVector< StringRef > & blockDimXFnName()
Definition CoreLLVMCUDA.hpp:40
Definition BuiltinsCUDA.cpp:4
void setLaunchBoundsForKernel(Function &F, int MaxThreadsPerSM, int MinBlocksPerSM=0)
Definition CoreLLVMCUDA.hpp:87
T getRuntimeConstantValue(void *Arg)
Definition CompilerInterfaceRuntimeConstantInfo.h:114
std::string toString(CodegenOption Option)
Definition Config.hpp:26
void runCleanupPassPipeline(Module &M)
Definition CoreLLVM.hpp:230