Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
CoreDeviceHIP.h
Go to the documentation of this file.
1#ifndef CORE_HIP_H
2#define CORE_HIP_H
3
4#include "proteus/Error.h"
7
8#include <llvm/ADT/StringRef.h>
9
10#include <unordered_map>
11// NOTE: HIP_SYMBOL is defined only if HIP compilation is enabled (-x hip),
12// although it shouldn't be necessary since HIP RTC can JIT compile code. Also,
13// HIP_SYMBOL is defined differently depending on whether ROCm compiles for AMD
14// or NVIDIA. We repeat the AMD definition here for non-HIP compilation.
15#ifndef HIP_SYMBOL
16#define HIP_SYMBOL(x) x
17#endif
18
19namespace proteus {
20
21using namespace llvm;
22
23inline void *resolveDeviceGlobalAddr(const void *Addr) {
24 void *DevPtr = nullptr;
25 proteusHipErrCheck(hipGetSymbolAddress(&DevPtr, HIP_SYMBOL(Addr)));
26 assert(DevPtr && "Expected non-null device pointer for global");
27
28 return DevPtr;
29}
30
31inline hipError_t launchKernelDirect(void *KernelFunc, dim3 GridDim,
32 dim3 BlockDim, void **KernelArgs,
33 uint64_t ShmemSize, hipStream_t Stream) {
34 return hipLaunchKernel(KernelFunc, GridDim, BlockDim, KernelArgs, ShmemSize,
35 Stream);
36}
37
38inline hipFunction_t getKernelFunctionFromImage(
39 StringRef KernelName, const void *Image, bool RelinkGlobalsByCopy,
40 const std::unordered_map<std::string, GlobalVarInfo> &VarNameToGlobalInfo) {
41 hipModule_t HipModule;
42 hipFunction_t KernelFunc;
43
44 proteusHipErrCheck(hipModuleLoadData(&HipModule, Image));
45 if (RelinkGlobalsByCopy) {
46 for (auto &[GlobalName, GVI] : VarNameToGlobalInfo) {
47 if (!GVI.DevAddr)
48 reportFatalError("Cannot copy to Global Var " + GlobalName +
49 " without a concrete device address");
50
51 hipDeviceptr_t Dptr;
52 size_t Bytes;
53 proteusHipErrCheck(hipModuleGetGlobal(&Dptr, &Bytes, HipModule,
54 (GlobalName + "$ptr").c_str()));
55
56 uint64_t PtrVal = (uint64_t)GVI.DevAddr;
57 proteusHipErrCheck(hipMemcpyHtoD(Dptr, &PtrVal, Bytes));
58 }
59 }
61 hipModuleGetFunction(&KernelFunc, HipModule, KernelName.str().c_str()));
62
63 return KernelFunc;
64}
65
66inline hipError_t launchKernelFunction(hipFunction_t KernelFunc, dim3 GridDim,
67 dim3 BlockDim, void **KernelArgs,
68 uint64_t ShmemSize, hipStream_t Stream) {
69 return hipModuleLaunchKernel(KernelFunc, GridDim.x, GridDim.y, GridDim.z,
70 BlockDim.x, BlockDim.y, BlockDim.z, ShmemSize,
71 Stream, KernelArgs, nullptr);
72}
73
74} // namespace proteus
75
76#endif
void char * KernelName
Definition CompilerInterfaceDevice.cpp:54
#define HIP_SYMBOL(x)
Definition CoreDeviceHIP.h:16
#define proteusHipErrCheck(CALL)
Definition UtilsHIP.h:18
Definition CompiledLibrary.h:7
Definition MemoryCache.h:26
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
cudaError_t launchKernelDirect(void *KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.h:38
cudaError_t launchKernelFunction(CUfunction KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.h:78
void * resolveDeviceGlobalAddr(const void *Addr)
Definition CoreDeviceCUDA.h:26
CUfunction getKernelFunctionFromImage(StringRef KernelName, const void *Image, bool RelinkGlobalsByCopy, const std::unordered_map< std::string, GlobalVarInfo > &VarNameToGlobalInfo)
Definition CoreDeviceCUDA.h:50