Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
CudaCommon.h
1#pragma once
2
3#include "cuda.h"
4#include "Logger.h"
5#include "cuda_runtime_api.h"
6#include "CudaDriverLoader.h"
7#include "AIPExceptions.h"
8
9inline bool check(CUresult e, int iLine, const char *szFile)
10{
11 if (e != CUDA_SUCCESS)
12 {
13 const char *szErrName = NULL;
14 auto& loader = CudaDriverLoader::getInstance();
15 if (loader.cuGetErrorName) {
16 loader.cuGetErrorName(e, &szErrName);
17 }
18 LOG_FATAL << "CUDA driver API error " << (szErrName ? szErrName : "Unknown") << " at line " << iLine << " in file " << szFile;
19 return false;
20 }
21 return true;
22}
23
25{
26public:
27 static bool isCudaSupported();
28};
29
30#define ck(call) check(call, __LINE__, __FILE__)
31
33{
34public:
36 {
37 auto& loader = CudaDriverLoader::getInstance();
38 if (!loader.isAvailable()) {
39 throw AIPException(AIP_NOTEXEPCTED, "ApraCUcontext requires CUDA driver but libcuda.so not available. Error: " + loader.getErrorMessage());
40 }
41
42 ck(loader.cuInit(0));
43 int nGpu = 0;
44 ck(loader.cuDeviceGetCount(&nGpu));
45 m_cuDevice = 0;
46 ck(loader.cuDeviceGet(&m_cuDevice, 0));
47 char szDeviceName[80];
48 ck(loader.cuDeviceGetName(szDeviceName, sizeof(szDeviceName), m_cuDevice));
49 LOG_INFO << "GPU "<<nGpu<<" in use: " << szDeviceName;
50
51 ck(loader.cuDevicePrimaryCtxRetain(&m_cuContext, m_cuDevice));
52 }
53
55 {
56 auto& loader = CudaDriverLoader::getInstance();
57 if (loader.isAvailable() && loader.cuDevicePrimaryCtxRelease) {
58 ck(loader.cuDevicePrimaryCtxRelease(m_cuDevice));
59 }
60 }
61
62 CUcontext getContext()
63 {
64 return m_cuContext;
65 }
66 bool getComputeCapability(int& major, int& minor)
67 {
68 auto rc1=cudaDeviceGetAttribute(& major, ::cudaDevAttrComputeCapabilityMajor, 0);
69 auto rc2=cudaDeviceGetAttribute(& minor, ::cudaDevAttrComputeCapabilityMinor, 0);
70 return (rc1==::cudaSuccess && rc2==::cudaSuccess);
71 }
72
73private:
74 CUcontext m_cuContext;
75 CUdevice m_cuDevice;
76};
77
79{
80public:
82 {
83 auto& loader = CudaDriverLoader::getInstance();
84 if (!loader.isAvailable()) {
85 throw AIPException(AIP_NOTEXEPCTED, "ApraCudaStream requires CUDA driver but libcuda.so not available. Error: " + loader.getErrorMessage());
86 }
87
88 auto rc = cudaStreamCreate(&m_stream);
89 if (rc != cudaSuccess) {
90 throw AIPException(AIP_NOTEXEPCTED, std::string("cudaStreamCreate failed: ") + cudaGetErrorString(rc));
91 }
92 }
93
95 {
96 if (m_stream) {
97 cudaStreamDestroy(m_stream);
98 }
99 }
100
101 cudaStream_t getCudaStream()
102 {
103 return m_stream;
104 }
105
106private:
107 cudaStream_t m_stream = nullptr;
108};
109
110typedef boost::shared_ptr<ApraCUcontext> apracucontext_sp;
111typedef boost::shared_ptr<ApraCudaStream> cudastream_sp;
Definition CudaCommon.h:33
CUcontext m_cuContext
Definition CudaCommon.h:74
~ApraCUcontext()
Definition CudaCommon.h:54
CUcontext getContext()
Definition CudaCommon.h:62
ApraCUcontext()
Definition CudaCommon.h:35
bool getComputeCapability(int &major, int &minor)
Definition CudaCommon.h:66
CUdevice m_cuDevice
Definition CudaCommon.h:75
Definition CudaCommon.h:79
cudaStream_t m_stream
Definition CudaCommon.h:107
~ApraCudaStream()
Definition CudaCommon.h:94
cudaStream_t getCudaStream()
Definition CudaCommon.h:101
ApraCudaStream()
Definition CudaCommon.h:81
static CudaDriverLoader & getInstance()
Definition CudaDriverLoader.h:41
Definition CudaCommon.h:25
static bool isCudaSupported()
Definition CudaCommon.cpp:4