NVIDIA DeepStream SDK API Reference

9.1 Release
9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2019-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
25 #ifndef __NVDSINFER_CUDA_UTILS_H__
26 #define __NVDSINFER_CUDA_UTILS_H__
27 
28 #include <stdarg.h>
29 #include <condition_variable>
30 #include <memory>
31 #include <mutex>
32 #include <queue>
33 
34 #include <cuda.h>
35 #include <cuda_runtime_api.h>
36 #include "infer_batch_buffer.h"
37 #include "infer_common.h"
38 
39 namespace nvdsinferserver {
40 
44 class CudaStream {
45 public:
46  explicit CudaStream(
47  uint flag = cudaStreamDefault, int gpuId = 0, int priority = 0);
48  ~CudaStream();
49  operator cudaStream_t() { return m_Stream; }
50  int devId() const { return m_GpuId; }
51  cudaStream_t& ptr() { return m_Stream; }
53 
54 private:
55  void move_copy(CudaStream&& o) {
56  m_Stream = o.m_Stream;
57  o.m_Stream = nullptr;
58  }
59  DISABLE_CLASS_COPY(CudaStream);
60 
61  cudaStream_t m_Stream = nullptr;
62  int m_GpuId = 0;
63 };
64 
68 class CudaEvent {
69 public:
70  explicit CudaEvent(uint flag = cudaEventDefault, int gpuId = 0);
71  virtual ~CudaEvent();
72  operator cudaEvent_t() { return m_Event; }
73  int devId() const { return m_GpuId; }
74  cudaEvent_t& ptr() { return m_Event; }
76 
77 private:
78  void move_copy(CudaEvent&& o) {
79  m_Event = o.m_Event;
80  o.m_Event = nullptr;
81  }
82 
83  DISABLE_CLASS_COPY(CudaEvent);
84 
85  cudaEvent_t m_Event = nullptr;
86  int m_GpuId = 0;
87 };
88 
92 class SysMem {
93 public:
94  virtual ~SysMem() = default;
95  size_t bytes() const { return m_Size; }
96 
97  template <typename T>
98  T* ptr() const {
99  return (T*)m_Buf;
100  }
101 
102  void* ptr() const { return m_Buf; }
103  int devId() const { return m_DevId; }
104  InferMemType type() const { return m_Type; }
105  void reuse() {}
106  virtual void grow(size_t bytes) = 0;
107 
109 
110 protected:
111  SysMem(size_t s, int devId) : m_Size(s), m_DevId(devId) {}
112  void move_copy(SysMem&& o) {
113  m_Buf = o.m_Buf;
114  o.m_Buf = nullptr;
115  m_Size = o.m_Size;
116  o.m_Size = 0;
117  m_DevId = o.m_DevId;
118  o.m_DevId = 0;
119  m_Type = o.m_Type;
120  o.m_Type = InferMemType::kNone;
121  }
122 
124 
125  void* m_Buf = nullptr;
126  size_t m_Size = 0;
127  int m_DevId = 0;
129 };
130 
134 class CudaDeviceMem : public SysMem {
135 public:
136  CudaDeviceMem(size_t size, int gpuId = 0);
137  ~CudaDeviceMem() override;
138  void grow(size_t bytes) override;
139 
140 private:
141  void _allocate(size_t bytes);
142 };
143 
147 class CudaHostMem : public SysMem {
148 public:
149  CudaHostMem(size_t size, int gpuId = 0);
150  ~CudaHostMem() override;
151  void grow(size_t bytes) override;
152 
153 private:
154  void _allocate(size_t bytes);
155 };
156 
160 class CpuMem : public SysMem {
161 public:
162  CpuMem(size_t size);
163  ~CpuMem() override;
164  void grow(size_t bytes) override;
165 
166 private:
167  std::vector<uint8_t> m_Data;
168 };
169 
173 class CudaTensorBuf : public BaseBatchBuffer {
174 public:
175  CudaTensorBuf(const InferDims& dims, InferDataType dt, int batchSize,
176  const std::string& name, InferMemType mt, int devId, bool initCuEvent);
177 
178  ~CudaTensorBuf() override;
179 
180  void setBatchSize(uint32_t size) override {
181  assert(size <= m_MaxBatchSize);
183  }
184 
185  void setName(const std::string& name) { mutableBufDesc().name = name; }
186  void* getBufPtr(uint32_t batchIdx) const final;
187  void reuse()
188  {
189  setBatchSize(m_MaxBatchSize);
190  detach();
191  }
192 
193 private:
194  UniqSysMem m_CudaMem;
195  uint32_t m_MaxBatchSize = 0;
196 };
197 
212 UniqCudaTensorBuf createTensorBuf(const InferDims& dims, InferDataType dt,
213  int batchSize, const std::string& name, InferMemType mt, int devId,
214  bool initCuEvent);
215 
229 UniqCudaTensorBuf createGpuTensorBuf(const InferDims& dims,
230  InferDataType dt, int batchSize, const std::string& name = "",
231  int devId = 0, bool initCuEvent = false);
232 
246 UniqCudaTensorBuf createCpuTensorBuf(const InferDims& dims,
247  InferDataType dt, int batchSize, const std::string& name = "",
248  int devId = 0, bool initCuEvent = false);
249 
256 
257 } // namespace nvdsinferserver
258 
259 #endif
infer_batch_buffer.h
Header file of batch buffer related class declarations.
cudaStream_t
struct CUstream_st * cudaStream_t
Forward declaration of cudaStream_t.
Definition: sources/includes/nvbufsurftransform.h:35
nvdsinferserver
This is a header file for pre-processing cuda kernels with normalization and mean subtraction require...
Definition: sources/gst-plugins/gst-nvinferserver/gstnvinferserver_impl.h:69
nvdsinferserver::InferDataType
InferDataType
Datatype of the tensor buffer.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:88
infer_common.h
Header file of the common declarations for the nvinferserver library.
nvdsinferserver::CpuMem::CpuMem
CpuMem(size_t size)
nvdsinferserver::CudaEvent::~CudaEvent
virtual ~CudaEvent()
nvdsinferserver::UniqCudaTensorBuf
std::unique_ptr< CudaTensorBuf > UniqCudaTensorBuf
Definition: sources/libs/nvdsinferserver/infer_common.h:95
nvdsinferserver::CudaHostMem::grow
void grow(size_t bytes) override
nvdsinferserver::createTensorBuf
UniqCudaTensorBuf createTensorBuf(const InferDims &dims, InferDataType dt, int batchSize, const std::string &name, InferMemType mt, int devId, bool initCuEvent)
Create a tensor buffer of the specified memory type, dimensions on the given device.
nvdsinferserver::SysMem::devId
int devId() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:103
nvdsinferserver::CudaEvent::CudaEvent
CudaEvent(uint flag=cudaEventDefault, int gpuId=0)
nvdsinferserver::SysMem::~SysMem
virtual ~SysMem()=default
nvdsinferserver::SharedBatchArray
std::shared_ptr< BaseBatchArray > SharedBatchArray
Definition: sources/libs/nvdsinferserver/infer_common.h:80
nvdsinferserver::CudaStream::ptr
cudaStream_t & ptr()
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:51
nvdsinferserver::CudaEvent::ptr
cudaEvent_t & ptr()
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:74
nvdsinferserver::CpuMem::grow
void grow(size_t bytes) override
nvdsinferserver::SysMem::m_Size
size_t m_Size
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:126
nvdsinferserver::BaseBatchBuffer::detach
void detach()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:77
nvdsinferserver::SysMem::ptr
void * ptr() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:102
nvdsinferserver::CudaStream::devId
int devId() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:50
nvdsinferserver::SysMem::type
InferMemType type() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:104
nvdsinferserver::CudaEvent
Wrapper class for CUDA events.
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:68
nvdsinferserver::BaseBatchBuffer::setBatchSize
virtual void setBatchSize(uint32_t size)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:56
nvdsinferserver::CudaTensorBuf::setName
void setName(const std::string &name)
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:185
nvdsinferserver::CudaStream
Wrapper class for CUDA streams.
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:44
CudaStream
Helper class for managing Cuda Streams.
Definition: sources/gst-plugins/gst-nvdspreprocess/nvdspreprocess_lib/nvdspreprocess_impl.h:102
nvdsinferserver::UniqSysMem
std::unique_ptr< SysMem > UniqSysMem
Definition: sources/libs/nvdsinferserver/infer_common.h:94
nvdsinferserver::SysMem::grow
virtual void grow(size_t bytes)=0
nvdsinferserver::SysMem::move_copy
void move_copy(SysMem &&o)
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:112
nvdsinferserver::CudaTensorBuf::reuse
void reuse()
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:187
nvdsinferserver::CudaStream::~CudaStream
~CudaStream()
nvdsinferserver::SysMem::ptr
T * ptr() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:98
nvdsinferserver::CudaTensorBuf::~CudaTensorBuf
~CudaTensorBuf() override
nvdsinferserver::createGpuTensorBuf
UniqCudaTensorBuf createGpuTensorBuf(const InferDims &dims, InferDataType dt, int batchSize, const std::string &name="", int devId=0, bool initCuEvent=false)
Create a CUDA device memory tensor buffer of specified dimensions on the given device.
nvdsinferserver::createCpuTensorBuf
UniqCudaTensorBuf createCpuTensorBuf(const InferDims &dims, InferDataType dt, int batchSize, const std::string &name="", int devId=0, bool initCuEvent=false)
Create a CUDA pinned memory tensor buffer of specified dimensions on the given device.
nvdsinferserver::CpuMem::~CpuMem
~CpuMem() override
nvdsinferserver::syncAllCudaEvents
NvDsInferStatus syncAllCudaEvents(const SharedBatchArray &bufList)
Synchronize on all events associated with the batch buffer array.
nvdsinferserver::CudaTensorBuf::setBatchSize
void setBatchSize(uint32_t size) override
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:180
nvdsinferserver::CudaDeviceMem::~CudaDeviceMem
~CudaDeviceMem() override
nvdsinferserver::SysMem
Base class for managing memory allocation.
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:92
nvdsinferserver::SysMem::m_DevId
int m_DevId
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:127
nvdsinferserver::CudaHostMem::~CudaHostMem
~CudaHostMem() override
nvdsinferserver::CudaTensorBuf::getBufPtr
void * getBufPtr(uint32_t batchIdx) const final
nvdsinferserver::InferMemType
InferMemType
The memory types of inference buffers.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:61
nvdsinferserver::CudaEvent::devId
int devId() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:73
SIMPLE_MOVE_COPY
#define SIMPLE_MOVE_COPY(Cls)
helper move function
Definition: sources/gst-plugins/gst-nvdspreprocess/nvdspreprocess_lib/nvdspreprocess_impl.h:46
nvdsinferserver::CudaDeviceMem::CudaDeviceMem
CudaDeviceMem(size_t size, int gpuId=0)
nvdsinferserver::SysMem::bytes
size_t bytes() const
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:95
nvdsinferserver::CudaDeviceMem::grow
void grow(size_t bytes) override
nvdsinferserver::CudaTensorBuf::CudaTensorBuf
CudaTensorBuf(const InferDims &dims, InferDataType dt, int batchSize, const std::string &name, InferMemType mt, int devId, bool initCuEvent)
nvdsinferserver::CudaStream::CudaStream
CudaStream(uint flag=cudaStreamDefault, int gpuId=0, int priority=0)
nvdsinferserver::SysMem::m_Buf
void * m_Buf
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:125
nvdsinferserver::BaseBatchBuffer::mutableBufDesc
InferBufferDescription & mutableBufDesc()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:55
nvdsinferserver::CudaHostMem::CudaHostMem
CudaHostMem(size_t size, int gpuId=0)
nvdsinferserver::SysMem::DISABLE_CLASS_COPY
DISABLE_CLASS_COPY(SysMem)
nvdsinferserver::InferMemType::kNone
@ kNone
nvdsinferserver::SysMem::SysMem
SysMem(size_t s, int devId)
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:111
nvdsinferserver::InferBufferDescription::name
std::string name
Name of the buffer.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:197
NvDsInferStatus
NvDsInferStatus
Enum for the status codes returned by NvDsInferContext.
Definition: sources/includes/nvdsinfer.h:231
nvdsinferserver::SysMem::reuse
void reuse()
Definition: 9.1/sources/libs/nvdsinferserver/infer_cuda_utils.h:105
nvdsinferserver::SysMem::m_Type
InferMemType m_Type
Definition: sources/libs/nvdsinferserver/infer_cuda_utils.h:128