NVIDIA DeepStream SDK API Reference

9.1 Release
sources/libs/nvdsinferserver/infer_batch_buffer.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2020-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 
24 #ifndef __NVDSINFERSERVER_BATCH_BUFFER_H__
25 #define __NVDSINFERSERVER_BATCH_BUFFER_H__
26 
27 #include <algorithm>
28 #include <set>
29 #include <unordered_map>
30 #include "nvbufsurftransform.h"
31 #include "infer_common.h"
32 #include "infer_datatypes.h"
33 
34 namespace nvdsinferserver {
35 
40 protected:
41  explicit BaseBatchBuffer(uint32_t batchSize) : m_BatchSize(batchSize) {}
42 
43 public:
44  ~BaseBatchBuffer() override = default;
45  const InferBufferDescription& getBufDesc() const final { return m_Desc; }
46  uint32_t getBatchSize() const final { return m_BatchSize; }
47  uint64_t getTotalBytes() const override
48  {
49  assert(m_Desc.dataType != InferDataType::kNone);
50  assert(m_Desc.elementSize >= 0);
51  uint32_t b = getBatchSize();
52  return m_Desc.elementSize * m_Desc.dims.numElements * (b ? b : 1);
53  }
54  void setBufDesc(const InferBufferDescription& desc) { m_Desc = desc; }
55  InferBufferDescription& mutableBufDesc() { return m_Desc; }
56  virtual void setBatchSize(uint32_t size) { m_BatchSize = size; }
57  const SharedCuEvent& cuEvent() const { return m_CuEvent; }
58  void setCuEvent(SharedCuEvent e) { m_CuEvent = std::move(e); }
59  void setSyncObj(NvBufSurfTransformSyncObj_t SyncObj) { assert(m_SyncObj==nullptr); m_SyncObj = SyncObj; }
60  NvBufSurfTransformSyncObj_t& getSyncObj() { return m_SyncObj; }
62  {
63  if (m_SyncObj)
64  {
65  NvBufSurfTransformSyncObjWait (m_SyncObj, -1);
67  m_SyncObj = nullptr;
68  }
69  }
70 
71  // attached buffers
73  {
74  m_Attaches.emplace_back(std::move(buf));
75  assert(!hasAttachLoop());
76  }
77  void detach() { m_Attaches.clear(); }
78  bool hasAttachedBufs() const { return !m_Attaches.empty();}
79  const std::vector<SharedBatchBuf>& attachedBufs() const
80  {
81  return m_Attaches;
82  }
83  std::vector<SharedBatchBuf>& mutableAttachedBufs() { return m_Attaches; }
84  bool hasAttachLoop() const
85  {
86  std::set<BaseBatchBuffer*> allAttached;
87  for (auto const& buf : m_Attaches) {
88  assert(buf);
89  if (allAttached.count(buf.get())) {
90  return true;
91  }
92  allAttached.emplace(buf.get());
93  }
94  return false;
95  }
96 
97  void setBufId(uint64_t id) { m_BufId = id; }
98  uint64_t bufId() const { return m_BufId; }
99 
105  size_t getBufOffset(uint32_t batchIdx) const override
106  {
107  assert(getBufPtr(0) && getBufPtr(batchIdx));
108  if (getBufPtr(0) == nullptr || getBufPtr(batchIdx) == nullptr) {
109  return (size_t) -1;
110  } else {
111  return (uint8_t*)getBufPtr(batchIdx) - (uint8_t*)getBufPtr(0);
112  }
113  }
114 
115 private:
116  InferBufferDescription m_Desc{
118  uint32_t m_BatchSize = 0;
119  SharedCuEvent m_CuEvent;
120  std::vector<SharedBatchBuf> m_Attaches;
121  uint64_t m_BufId = UINT64_C(0); // for debug and track
124  NvBufSurfTransformSyncObj_t m_SyncObj = nullptr;
125 };
126 
130 class BaseBatchArray : public IBatchArray {
131 public:
132  ~BaseBatchArray() override = default;
133  uint32_t getSize() const final { return m_Bufs.size(); }
134  const IBatchBuffer* getBuffer(uint32_t arrayIdx) const final
135  {
136  assert(arrayIdx < (uint32_t)m_Bufs.size());
137  assert(m_Bufs.at(arrayIdx).get());
138  return m_Bufs.at(arrayIdx).get();
139  }
140  SharedIBatchBuffer getSafeBuf(uint32_t arrayIdx) const final
141  {
142  assert(arrayIdx < (uint32_t)m_Bufs.size());
143  assert(m_Bufs.at(arrayIdx).get());
144  return buf(arrayIdx);
145  }
147  {
148  SharedBatchBuf castBuf =
149  std::dynamic_pointer_cast<BaseBatchBuffer>(buf);
150  assert(castBuf);
151  addBuf(castBuf);
152  }
153  const IOptions* getOptions() const final { return m_Options.get(); }
154  SharedIOptions getSafeOptions() const { return m_Options; }
155  void setIOptions(SharedIOptions o) final { setOptions(o); }
156 
157  const std::vector<SharedBatchBuf>& bufs() const { return m_Bufs; }
158  std::vector<SharedBatchBuf>& mutableBufs() { return m_Bufs; }
159  void addBuf(SharedBatchBuf buf) { assert(buf); m_Bufs.emplace_back(std::move(buf)); }
160  const SharedBatchBuf& buf(uint32_t idx) const
161  {
162  assert(idx < (uint32_t)m_Bufs.size());
163  return m_Bufs.at(idx);
164  }
165  SharedBatchBuf& buf(uint32_t idx)
166  {
167  assert(idx < (uint32_t)m_Bufs.size());
168  return m_Bufs.at(idx);
169  }
170  const SharedCuEvent& cuEvent() const { return m_CuEvent; }
171  void setCuEvent(SharedCuEvent e) { m_CuEvent = std::move(e); }
172  int findFirstGpuId() const {
173  int gpuId = -1;
174  auto iter = std::find_if(m_Bufs.cbegin(), m_Bufs.cend(),
175  [&gpuId](const SharedBatchBuf& buf) {
176  assert(buf);
177  const InferBufferDescription& desc = buf->getBufDesc();
178  if (desc.memType == InferMemType::kGpuCuda) {
179  gpuId = desc.devId;
180  return true;
181  }
182  return false;
183  });
184  (void) iter;
185 
186  assert((iter != m_Bufs.cend() && gpuId >= 0) ||
187  (iter == m_Bufs.cend() && gpuId == -1));
188  return gpuId;
189  }
190 
191  void setBufId(uint64_t id) { m_BufId = id; }
192  uint64_t bufId() const { return m_BufId; }
193 
194  // set options
195  void setOptions(SharedIOptions o) { m_Options = std::move(o); }
196 
197 private:
198  std::vector<SharedBatchBuf> m_Bufs;
199  SharedCuEvent m_CuEvent;
200  uint64_t m_BufId = UINT64_C(0); // for debug and track
201 
202  SharedOptions m_Options;
203 };
204 
205 extern void normalizeDims(InferDims& dims);
206 
211 public:
213  void* bufBase, size_t offset, size_t bufBytes,
214  const InferBufferDescription& desc, uint32_t batchSize)
215  : BaseBatchBuffer(batchSize), m_BufBase(bufBase),
216  m_BufBytes(bufBytes), m_BufOffset(offset)
217  {
218  setBufDesc(desc);
219  normalizeDims(mutableBufDesc().dims);
220  }
221  void* getBufPtr(uint32_t batchIdx) const override {
222  assert(batchIdx == 0 || batchIdx < getBatchSize());
223  const InferBufferDescription& desc = getBufDesc();
224  assert(batchIdx <= 0 || desc.dataType != InferDataType::kString);
225  batchIdx = std::max(batchIdx, 0U);
226  return (void*)((uint8_t*)m_BufBase +
227  desc.elementSize * desc.dims.numElements * batchIdx);
228  }
229  uint64_t getTotalBytes() const final { return m_BufBytes; }
230  void* basePtr() { return m_BufBase; }
231 
237  size_t getBufOffset(uint32_t batchIdx) const override {
238  assert(batchIdx == 0 || batchIdx < getBatchSize());
239  const InferBufferDescription& desc = getBufDesc();
240  assert(batchIdx <= 0 || desc.dataType != InferDataType::kString);
241  batchIdx = std::max(batchIdx, 0U);
242  return m_BufOffset + desc.elementSize * desc.dims.numElements * batchIdx;
243  }
244 
245 private:
246  mutable void* m_BufBase = nullptr;
247  size_t m_BufBytes = 0;
251  size_t m_BufOffset = 0;
252 };
253 
255 public:
256  template <typename BufPtr>
257  WrapCBatchBuffer(BufPtr buf) : m_Impl(std::move(buf)) {
258  assert(m_Impl);
259  }
260 
261  ~WrapCBatchBuffer() final = default;
262  const InferBufferDescription& getBufDesc() const final {
263  return m_Impl->getBufDesc();
264  }
265  void* getBufPtr(uint32_t batchIdx) const final {
266  return m_Impl->getBufPtr(batchIdx);
267  }
268  uint32_t getBatchSize() const final { return m_Impl->getBatchSize(); }
269  uint64_t getTotalBytes() const final { return m_Impl->getTotalBytes(); }
270 
271 private:
272  SharedBatchBuf m_Impl;
273 };
274 
275 } // namespace nvdsinferserver
276 
277 #endif
nvdsinferserver::BaseBatchArray::buf
const SharedBatchBuf & buf(uint32_t idx) const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:160
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::BaseBatchBuffer::getBatchSize
uint32_t getBatchSize() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:46
nvdsinferserver::BaseBatchArray::getSize
uint32_t getSize() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:133
nvdsinferserver::BaseBatchArray::~BaseBatchArray
~BaseBatchArray() override=default
nvdsinferserver::BaseBatchBuffer::setBufId
void setBufId(uint64_t id)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:97
nvdsinferserver::BaseBatchArray::getOptions
const IOptions * getOptions() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:153
NvBufSurfTransformSyncObj_t
struct NvBufSurfTransformSyncObj * NvBufSurfTransformSyncObj_t
Holds the information about synchronization objects for asynchronous transform/composite APIs.
Definition: sources/includes/nvbufsurftransform.h:301
nvdsinferserver::RefBatchBuffer::RefBatchBuffer
RefBatchBuffer(void *bufBase, size_t offset, size_t bufBytes, const InferBufferDescription &desc, uint32_t batchSize)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:212
nvdsinferserver::SharedIOptions
std::shared_ptr< IOptions > SharedIOptions
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:211
nvdsinferserver::BaseBatchArray::setBufId
void setBufId(uint64_t id)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:191
NvBufSurfTransformSyncObjDestroy
NvBufSurfTransform_Error NvBufSurfTransformSyncObjDestroy(NvBufSurfTransformSyncObj_t *sync_obj)
Destroy the synchronization object.
nvdsinferserver::RefBatchBuffer
A batch buffer with allocated memory.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:210
nvdsinferserver::BaseBatchBuffer::cuEvent
const SharedCuEvent & cuEvent() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:57
nvdsinferserver::SharedBatchBuf
std::shared_ptr< BaseBatchBuffer > SharedBatchBuf
Common buffer interfaces (internal).
Definition: sources/libs/nvdsinferserver/infer_common.h:76
nvdsinferserver::BaseBatchBuffer::getBufOffset
size_t getBufOffset(uint32_t batchIdx) const override
Get the offset from start of the memory allocation to the buffer pointer.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:105
nvdsinferserver::BaseBatchBuffer::getSyncObj
NvBufSurfTransformSyncObj_t & getSyncObj()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:60
nvdsinferserver::normalizeDims
void normalizeDims(InferDims &dims)
nvdsinferserver::BaseBatchArray::setIOptions
void setIOptions(SharedIOptions o) final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:155
nvdsinferserver::RefBatchBuffer::basePtr
void * basePtr()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:230
nvdsinferserver::BaseBatchArray::getBuffer
const IBatchBuffer * getBuffer(uint32_t arrayIdx) const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:134
nvdsinferserver::BaseBatchBuffer::attachedBufs
const std::vector< SharedBatchBuf > & attachedBufs() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:79
nvdsinferserver::RefBatchBuffer::getTotalBytes
uint64_t getTotalBytes() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:229
nvdsinferserver::BaseBatchBuffer::detach
void detach()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:77
nvdsinferserver::IBatchBuffer
Interface class for a batch buffer.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:216
nvdsinferserver::BaseBatchBuffer::waitForSyncObj
void waitForSyncObj()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:61
nvdsinferserver::BaseBatchArray::setCuEvent
void setCuEvent(SharedCuEvent e)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:171
nvdsinferserver::BaseBatchBuffer::setBatchSize
virtual void setBatchSize(uint32_t size)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:56
nvdsinferserver::BaseBatchArray::cuEvent
const SharedCuEvent & cuEvent() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:170
nvdsinferserver::SharedCuEvent
std::shared_ptr< CudaEvent > SharedCuEvent
Definition: sources/libs/nvdsinferserver/infer_common.h:91
nvdsinferserver::BaseBatchArray::addBuf
void addBuf(SharedBatchBuf buf)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:159
nvdsinferserver::BaseBatchBuffer::bufId
uint64_t bufId() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:98
infer_common.h
Header file of the common declarations for the nvinferserver library.
nvdsinferserver::BaseBatchArray::mutableBufs
std::vector< SharedBatchBuf > & mutableBufs()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:158
nvdsinferserver::BaseBatchArray::getSafeBuf
SharedIBatchBuffer getSafeBuf(uint32_t arrayIdx) const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:140
nvdsinferserver::BaseBatchArray::setOptions
void setOptions(SharedIOptions o)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:195
nvdsinferserver::BaseBatchBuffer::getBufDesc
const InferBufferDescription & getBufDesc() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:45
nvdsinferserver::WrapCBatchBuffer
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:254
nvdsinferserver::WrapCBatchBuffer::getBatchSize
uint32_t getBatchSize() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:268
nvdsinferserver::BaseBatchArray::bufId
uint64_t bufId() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:192
nvdsinferserver::SharedOptions
std::shared_ptr< IOptions > SharedOptions
Definition: sources/libs/nvdsinferserver/infer_common.h:78
nvdsinferserver::BaseBatchBuffer::getTotalBytes
uint64_t getTotalBytes() const override
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:47
nvdsinferserver::WrapCBatchBuffer::WrapCBatchBuffer
WrapCBatchBuffer(BufPtr buf)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:257
nvdsinferserver::WrapCBatchBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:265
NvBufSurfTransformSyncObjWait
NvBufSurfTransform_Error NvBufSurfTransformSyncObjWait(NvBufSurfTransformSyncObj_t sync_obj, uint32_t time_out)
Wait on the synchronization object.
nvdsinferserver::WrapCBatchBuffer::getTotalBytes
uint64_t getTotalBytes() const final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:269
nvdsinferserver::BaseBatchBuffer::setSyncObj
void setSyncObj(NvBufSurfTransformSyncObj_t SyncObj)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:59
nvdsinferserver::BaseBatchBuffer::mutableAttachedBufs
std::vector< SharedBatchBuf > & mutableAttachedBufs()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:83
nvdsinferserver::InferBufferDescription::dataType
InferDataType dataType
Datatype associated with the buffer.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:185
nvdsinferserver::BaseBatchBuffer::BaseBatchBuffer
BaseBatchBuffer(uint32_t batchSize)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:41
nvdsinferserver::BaseBatchBuffer::hasAttachedBufs
bool hasAttachedBufs() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:78
INFER_EXPORT_API
Definition: sources/libs/nvdsinferserver/infer_utils.h:38
nvdsinferserver::RefBatchBuffer::getBufPtr
void * getBufPtr(uint32_t batchIdx) const override
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:221
nvdsinferserver::IOptions
Definition: sources/includes/nvdsinferserver/infer_ioptions.h:59
nvdsinferserver::BaseBatchArray::appendIBatchBuf
void appendIBatchBuf(SharedIBatchBuffer buf) final
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:146
nvdsinferserver::BaseBatchBuffer::setBufDesc
void setBufDesc(const InferBufferDescription &desc)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:54
nvdsinferserver::BaseBatchArray
The base class for array of batch buffers.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:130
nvdsinferserver::InferDataType::kNone
@ kNone
nvdsinferserver::SharedIBatchBuffer
std::shared_ptr< IBatchBuffer > SharedIBatchBuffer
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:209
nvdsinferserver::BaseBatchBuffer::setCuEvent
void setCuEvent(SharedCuEvent e)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:58
nvdsinferserver::InferDims::numElements
unsigned int numElements
Number of elements in the layer including all dimensions.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:158
nvdsinferserver::BaseBatchArray::buf
SharedBatchBuf & buf(uint32_t idx)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:165
nvdsinferserver::InferBufferDescription::dims
InferDims dims
Dimensions of the tensor.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:189
nvdsinferserver::BaseBatchArray::getSafeOptions
SharedIOptions getSafeOptions() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:154
nvdsinferserver::BaseBatchBuffer
The base class for batch buffers.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:39
nvdsinferserver::InferBufferDescription::elementSize
uint32_t elementSize
Per element bytes, except kString (with elementSize is 0)
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:193
nvdsinferserver::BaseBatchBuffer::attach
void attach(SharedBatchBuf buf)
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:72
nvdsinferserver::BaseBatchArray::findFirstGpuId
int findFirstGpuId() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:172
nvdsinferserver::IBatchArray
Interface class for an array of batch buffers.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:233
nvdsinferserver::BaseBatchBuffer::mutableBufDesc
InferBufferDescription & mutableBufDesc()
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:55
nvdsinferserver::BaseBatchBuffer::hasAttachLoop
bool hasAttachLoop() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:84
nvdsinferserver::InferMemType::kNone
@ kNone
nvdsinferserver::RefBatchBuffer::getBufOffset
size_t getBufOffset(uint32_t batchIdx) const override
Get the offset from start of the memory allocation to the buffer pointer.
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:237
nvdsinferserver::BaseBatchArray::bufs
const std::vector< SharedBatchBuf > & bufs() const
Definition: sources/libs/nvdsinferserver/infer_batch_buffer.h:157
nvdsinferserver::InferBufferDescription
Holds the information about a inference buffer.
Definition: sources/includes/nvdsinferserver/infer_datatypes.h:173