nndeploy C++ API  0.2.0
nndeploy C++ API
buffer.h
Go to the documentation of this file.
1 
2 #ifndef _NNDEPLOY_DEVICE_BUFFER_H_
3 #define _NNDEPLOY_DEVICE_BUFFER_H_
4 
5 #include "nndeploy/base/common.h"
7 #include "nndeploy/base/log.h"
8 #include "nndeploy/base/macro.h"
9 #include "nndeploy/base/object.h"
10 #include "nndeploy/base/status.h"
11 #include "nndeploy/device/device.h"
13 
14 #ifdef ENABLE_NNDEPLOY_SAFETENSORS_CPP
15 #include "safetensors.hh"
16 #endif
17 
18 namespace nndeploy {
19 namespace device {
20 
22  public:
23  Buffer(Device *device, size_t size);
24  Buffer(Device *device, const BufferDesc &desc);
25 
26  Buffer(Device *device, size_t size, void *ptr);
27  Buffer(Device *device, const BufferDesc &desc, void *ptr);
28 
29  Buffer(Device *device, size_t size, void *ptr, base::MemoryType memory_type);
30  Buffer(Device *device, const BufferDesc &desc, void *ptr,
31  base::MemoryType memory_type);
32 
33  Buffer(MemoryPool *memory_pool, size_t size);
34  Buffer(MemoryPool *memory_pool, const BufferDesc &desc);
35 
36  Buffer(MemoryPool *memory_pool, size_t size, void *ptr,
37  base::MemoryType memory_type);
38  Buffer(MemoryPool *memory_pool, const BufferDesc &desc, void *ptr,
39  base::MemoryType memory_type);
40 
41  Buffer(const Buffer &buffer);
42  Buffer &operator=(const Buffer &buffer);
43 
44  Buffer(Buffer &&buffer) noexcept;
45  Buffer &operator=(Buffer &&buffer) noexcept;
46 
47  virtual ~Buffer();
48 
49  template <typename T>
50  base::Status set(T value) {
51  if (data_ == nullptr) {
52  NNDEPLOY_LOGE("data_ is empty");
54  }
55  T *value_ptr = nullptr;
56  if (isHostDeviceType(device_->getDeviceType())) {
57  value_ptr = (T *)data_;
58  } else {
59  Device *host_device = getDefaultHostDevice();
60  value_ptr = (T *)(host_device->allocate(desc_));
61  }
62 
63  size_t size = this->getSize();
64  size_t ele_size = sizeof(T);
65  size_t ele_count = size / ele_size;
66  for (size_t i = 0; i < ele_count; ++i) {
67  value_ptr[i] = value;
68  }
69  if (!isHostDeviceType(device_->getDeviceType())) {
70  device_->upload(value_ptr, data_, size);
71  Device *host_device = getDefaultHostDevice();
72  host_device->deallocate(value_ptr);
73  }
74 
75  return base::kStatusCodeOk;
76  }
77 
78  // clone and copy
81 
82  // 序列化buffer为二进制文件
83  base::Status serialize(std::string &bin_str);
84 
85 #ifdef ENABLE_NNDEPLOY_SAFETENSORS_CPP
86  base::Status serializeToSafetensors(safetensors::safetensors_t &st,
87  const safetensors::tensor_t &tensor);
88 #endif
89 
90  // 从二进制文件反序列化回buffer
91  base::Status deserialize(const std::string &bin_str);
92 
93  // base::Status serializeFromSafetensors(const char *storage,
94  // const size_t &data_size);
95  void print(std::ostream &stream = std::cout) const;
96 
97  bool justModify(const size_t &size);
98  bool justModify(const base::SizeVector &size);
99  bool justModify(const BufferDesc &desc);
100 
101  // get
102  bool empty() const;
104  Device *getDevice() const;
106  bool isMemoryPool() const;
108  size_t getSize() const;
110  size_t getRealSize() const;
113  void *getData() const;
115 
116  inline int addRef() const { return NNDEPLOY_XADD(ref_count_, 1); }
117  inline int subRef() const { return NNDEPLOY_XADD(ref_count_, -1); }
118 
119  private:
120  void clear();
121 
122  private:
123  Device *device_ = nullptr; // 内存对应的具体设备
124  MemoryPool *memory_pool_ = nullptr; // 内存来自内存池
125  BufferDesc desc_; // BufferDesc
126  // 内存类型,例如外部传入、内部分配、内存映射
128  int *ref_count_ = nullptr; // 引用计数
136  void *data_ = nullptr;
137 };
138 
139 } // namespace device
140 } // namespace nndeploy
141 
142 #endif
Device * getDevice() const
void print(std::ostream &stream=std::cout) const
void * getData() const
bool justModify(const BufferDesc &desc)
Buffer(MemoryPool *memory_pool, size_t size)
int addRef() const
Definition: buffer.h:116
base::Status deserialize(const std::string &bin_str)
Buffer(Device *device, const BufferDesc &desc, void *ptr, base::MemoryType memory_type)
size_t getRealSize() const
int subRef() const
Definition: buffer.h:117
Buffer(MemoryPool *memory_pool, const BufferDesc &desc)
Buffer(Device *device, const BufferDesc &desc)
size_t getSize() const
base::SizeVector getSizeVector() const
MemoryPool * getMemoryPool() const
bool justModify(const base::SizeVector &size)
Buffer(MemoryPool *memory_pool, size_t size, void *ptr, base::MemoryType memory_type)
Buffer(const Buffer &buffer)
Buffer & operator=(Buffer &&buffer) noexcept
BufferDesc getDesc() const
base::Status serialize(std::string &bin_str)
Buffer(Device *device, const BufferDesc &desc, void *ptr)
bool justModify(const size_t &size)
Buffer(Device *device, size_t size, void *ptr, base::MemoryType memory_type)
Buffer(Device *device, size_t size, void *ptr)
Buffer(Buffer &&buffer) noexcept
base::Status copyTo(Buffer *dst)
base::MemoryType getMemoryType() const
Buffer(Device *device, size_t size)
base::DeviceType getDeviceType() const
Buffer(MemoryPool *memory_pool, const BufferDesc &desc, void *ptr, base::MemoryType memory_type)
Buffer & operator=(const Buffer &buffer)
base::Status set(T value)
Definition: buffer.h:50
base::SizeVector getRealSizeVector() const
base::IntVector getConfig() const
设备抽象基类
Definition: device.h:155
virtual void * allocate(size_t size)=0
分配内存
virtual void deallocate(void *ptr)=0
释放内存
#define NNDEPLOY_LOGE(fmt,...)
Definition: log.h:59
#define NNDEPLOY_CC_API
api
Definition: macro.h:29
@ kStatusCodeOk
Definition: status.h:13
@ kStatusCodeErrorNullParam
Definition: status.h:22
std::vector< int > IntVector
Definition: common.h:379
std::vector< size_t > SizeVector
Definition: common.h:380
@ kMemoryTypeNone
Definition: common.h:195
bool isHostDeviceType(base::DeviceType device_type)
判断是否为主机设备类型
Device * getDefaultHostDevice()
获取默认主机设备