Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
Dispatcher.h
Go to the documentation of this file.
1#ifndef PROTEUS_FRONTEND_DISPATCHER_H
2#define PROTEUS_FRONTEND_DISPATCHER_H
3
4#include "proteus/Error.h"
7
8#if PROTEUS_ENABLE_HIP && __HIP__
9#include <hip/hip_runtime.h>
10#endif
11
12#include <cstdint>
13#include <memory>
14#include <string>
15#include <type_traits>
16
17namespace llvm {
18class LLVMContext;
19class Module;
20class MemoryBuffer;
21class MemoryBufferRef;
22class StringRef;
23} // namespace llvm
24
25struct LaunchDims {
26 unsigned X = 1, Y = 1, Z = 1;
27
28 constexpr LaunchDims() = default;
29
30 constexpr LaunchDims(unsigned X, unsigned Y = 1, unsigned Z = 1)
31 : X(X), Y(Y), Z(Z) {}
32
33 // Templated converting constructor for dim3-like types.
34 template <
35 typename T,
36 typename = std::enable_if_t<
37 std::is_convertible_v<decltype(std::declval<T>().x), unsigned> &&
38 std::is_convertible_v<decltype(std::declval<T>().y), unsigned> &&
39 std::is_convertible_v<decltype(std::declval<T>().z), unsigned>>>
40 constexpr LaunchDims(const T &Dims) : X(Dims.x), Y(Dims.y), Z(Dims.z) {}
41};
42
43namespace proteus {
44
45class ObjectCacheChain;
46struct CompiledLibrary;
47class HashT;
48class CodeGenerationConfig;
49
50template <typename T> struct sig_traits;
51
52template <typename R, typename... Args> struct sig_traits<R(Args...)> {
53 using return_type = R;
54 using argument_types = std::tuple<Args...>;
55};
56
58 int Ret;
59
60 // construct from an integer error‐code
61 constexpr DispatchResult(int Ret = 0) noexcept : Ret(Ret) {}
62
63 // implicit conversion back to int
64 operator int() const noexcept { return Ret; }
65
66#if PROTEUS_ENABLE_HIP && __HIP__
67 operator hipError_t() const noexcept { return static_cast<hipError_t>(Ret); }
68#endif
69
70#if PROTEUS_ENABLE_CUDA && defined(__CUDACC__)
71 operator cudaError_t() const noexcept {
72 return static_cast<cudaError_t>(Ret);
73 }
74#endif
75};
76
77struct DispatchResult;
78
80protected:
82 const std::string Label;
83 std::unique_ptr<ObjectCacheChain> ObjectCache;
84
85 Dispatcher(const std::string &Name, TargetModelType TM);
86
87 void printObjectCacheStats();
88
89public:
90 static Dispatcher &getDispatcher(TargetModelType TargetModel);
91 virtual ~Dispatcher();
92
93 const std::string &getLabel() const { return Label; }
94
95 virtual std::unique_ptr<llvm::MemoryBuffer>
96 compileModule(llvm::Module &M, const CodeGenerationConfig &CGConfig) = 0;
97
98 virtual void optimizeModule(llvm::Module &M,
99 const CodeGenerationConfig &CGConfig);
100
101 virtual std::unique_ptr<llvm::MemoryBuffer>
102 codegenModule(llvm::Module &M, const CodeGenerationConfig &CGConfig);
103
104 std::unique_ptr<llvm::MemoryBuffer>
105 compile(std::unique_ptr<llvm::LLVMContext> Ctx,
106 std::unique_ptr<llvm::Module> M, const HashT &ModuleHash,
107 const CodeGenerationConfig &CGConfig);
108
109 std::unique_ptr<llvm::MemoryBuffer>
110 compile(std::unique_ptr<llvm::LLVMContext> Ctx,
111 std::unique_ptr<llvm::Module> M, const HashT &ModuleHash);
112
113 std::unique_ptr<CompiledLibrary>
114 lookupCompiledLibrary(const HashT &ModuleHash);
115
116 virtual DispatchResult launch(void *KernelFunc, LaunchDims GridDim,
117 LaunchDims BlockDim, void *KernelArgs[],
118 uint64_t ShmemSize, void *Stream) = 0;
119
120 virtual llvm::StringRef getDeviceArch() const = 0;
121
122 template <typename Sig, typename... ArgT>
123 typename sig_traits<Sig>::return_type run(void *FuncPtr, ArgT &&...Args) {
124 if (!isHostTargetModel(TargetModel))
126 "Dispatcher run interface is only supported for host derived models");
127
128 auto Fn = reinterpret_cast<Sig *>(FuncPtr);
129 using Ret = typename sig_traits<Sig>::return_type;
130
131 if constexpr (std::is_void_v<Ret>) {
132 Fn(std::forward<ArgT>(Args)...);
133 return;
134 } else
135 return Fn(std::forward<ArgT>(Args)...);
136 }
137
138 virtual void *lookupFunction(llvm::StringRef BaseName,
139 const HashT &ModuleHash) = 0;
140
141 virtual void *insertFunction(const KernelName &Name, const HashT &ModuleHash,
142 CompiledLibrary &Library) = 0;
143
144 void *getOrInsertFunction(const KernelName &Name, const HashT &ModuleHash,
145 CompiledLibrary &Library);
146
147 virtual void registerDynamicLibrary(const HashT &HashValue,
148 const std::string &Path) = 0;
149
150 void registerObject(const HashT &HashValue, const llvm::MemoryBufferRef &Obj);
151};
152
153} // namespace proteus
154
155#endif
char int void ** Args
Definition CompilerInterfaceHost.cpp:23
Definition Config.h:167
Definition Dispatcher.h:79
TargetModelType TargetModel
Definition Dispatcher.h:81
virtual void registerDynamicLibrary(const HashT &HashValue, const std::string &Path)=0
virtual void * lookupFunction(llvm::StringRef BaseName, const HashT &ModuleHash)=0
const std::string Label
Definition Dispatcher.h:82
virtual void * insertFunction(const KernelName &Name, const HashT &ModuleHash, CompiledLibrary &Library)=0
std::unique_ptr< ObjectCacheChain > ObjectCache
Definition Dispatcher.h:83
const std::string & getLabel() const
Definition Dispatcher.h:93
virtual DispatchResult launch(void *KernelFunc, LaunchDims GridDim, LaunchDims BlockDim, void *KernelArgs[], uint64_t ShmemSize, void *Stream)=0
virtual std::unique_ptr< llvm::MemoryBuffer > compileModule(llvm::Module &M, const CodeGenerationConfig &CGConfig)=0
sig_traits< Sig >::return_type run(void *FuncPtr, ArgT &&...Args)
Definition Dispatcher.h:123
virtual llvm::StringRef getDeviceArch() const =0
Definition Hashing.h:27
Definition KernelName.h:18
Definition CompiledLibrary.h:8
Definition MemoryCache.h:27
TargetModelType
Definition TargetModel.h:8
bool isHostTargetModel(TargetModelType TargetModel)
Definition TargetModel.cpp:49
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
Definition Dispatcher.h:25
constexpr LaunchDims(unsigned X, unsigned Y=1, unsigned Z=1)
Definition Dispatcher.h:30
unsigned Z
Definition Dispatcher.h:26
unsigned Y
Definition Dispatcher.h:26
constexpr LaunchDims()=default
constexpr LaunchDims(const T &Dims)
Definition Dispatcher.h:40
unsigned X
Definition Dispatcher.h:26
Definition CompiledLibrary.h:21
Definition Dispatcher.h:57
constexpr DispatchResult(int Ret=0) noexcept
Definition Dispatcher.h:61
int Ret
Definition Dispatcher.h:58
R return_type
Definition Dispatcher.h:53
std::tuple< Args... > argument_types
Definition Dispatcher.h:54
Definition Dispatcher.h:50