1#ifndef PROTEUS_FRONTEND_DISPATCHER_H
2#define PROTEUS_FRONTEND_DISPATCHER_H
8#if PROTEUS_ENABLE_HIP && __HIP__
9#include <hip/hip_runtime.h>
26 unsigned X = 1,
Y = 1,
Z = 1;
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) {}
45class ObjectCacheChain;
46struct CompiledLibrary;
48class CodeGenerationConfig;
64 operator int() const noexcept {
return Ret; }
66#if PROTEUS_ENABLE_HIP && __HIP__
67 operator hipError_t() const noexcept {
return static_cast<hipError_t
>(Ret); }
70#if PROTEUS_ENABLE_CUDA && defined(__CUDACC__)
71 operator cudaError_t() const noexcept {
72 return static_cast<cudaError_t
>(Ret);
87 void printObjectCacheStats();
93 const std::string &
getLabel()
const {
return Label; }
95 virtual std::unique_ptr<llvm::MemoryBuffer>
98 virtual void optimizeModule(llvm::Module &M,
101 virtual std::unique_ptr<llvm::MemoryBuffer>
104 std::unique_ptr<llvm::MemoryBuffer>
105 compile(std::unique_ptr<llvm::LLVMContext> Ctx,
106 std::unique_ptr<llvm::Module> M,
const HashT &ModuleHash,
109 std::unique_ptr<llvm::MemoryBuffer>
110 compile(std::unique_ptr<llvm::LLVMContext> Ctx,
111 std::unique_ptr<llvm::Module> M,
const HashT &ModuleHash);
113 std::unique_ptr<CompiledLibrary>
114 lookupCompiledLibrary(
const HashT &ModuleHash);
118 uint64_t ShmemSize,
void *Stream) = 0;
122 template <
typename Sig,
typename... ArgT>
126 "Dispatcher run interface is only supported for host derived models");
128 auto Fn =
reinterpret_cast<Sig *
>(FuncPtr);
131 if constexpr (std::is_void_v<Ret>) {
132 Fn(std::forward<ArgT>(
Args)...);
135 return Fn(std::forward<ArgT>(
Args)...);
139 const HashT &ModuleHash) = 0;
144 void *getOrInsertFunction(
const KernelName &Name,
const HashT &ModuleHash,
148 const std::string &Path) = 0;
150 void registerObject(
const HashT &HashValue,
const llvm::MemoryBufferRef &Obj);
char int void ** Args
Definition CompilerInterfaceHost.cpp:23
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 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