nndeploy C++ API  0.2.0
nndeploy C++ API
device.h
Go to the documentation of this file.
1 
2 #ifndef _NNDEPLOY_DEVICE_DEVICE_H_
3 #define _NNDEPLOY_DEVICE_DEVICE_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/type.h"
12 #include "nndeploy/device/util.h"
13 
14 namespace nndeploy {
15 namespace device {
16 
17 class Device;
18 class Stream;
19 class Event;
20 
21 class Buffer;
22 
30  bool is_support_fp16_ = false;
31 };
32 
42  public:
47  explicit Architecture(base::DeviceTypeCode device_type_code);
48 
52  virtual ~Architecture();
53 
60  virtual base::Status checkDevice(int device_id = 0,
61  std::string library_path = "") = 0;
62 
69  virtual base::Status enableDevice(int device_id = 0,
70  std::string library_path = "") = 0;
71 
77 
83  virtual Device *getDevice(int device_id) = 0;
84 
90  virtual std::vector<DeviceInfo> getDeviceInfo(
91  std::string library_path = "") = 0;
92 
98 
105  base::Status insertDevice(int device_id, Device *device);
106 
107  protected:
108  std::mutex mutex_;
114  std::map<int, Device *> devices_;
115 
116  private:
117  base::DeviceTypeCode device_type_code_;
118 };
119 
124 extern NNDEPLOY_CC_API std::map<base::DeviceTypeCode,
125  std::shared_ptr<Architecture>> &
127 
135 template <typename T>
137  public:
143  auto &architecture_map = getArchitectureMap();
144  if (architecture_map.find(type) == architecture_map.end()) {
145  architecture_map[type] = std::shared_ptr<T>(new T(type));
146  }
147  }
148 };
149 
156  friend class Architecture;
157 
158  public:
165 
172  virtual BufferDesc toBufferDesc(const TensorDesc &desc,
173  const base::IntVector &config) = 0;
174 
180  virtual void *allocate(size_t size) = 0;
181 
187  virtual void *allocate(const BufferDesc &desc) = 0;
188 
193  virtual void deallocate(void *ptr) = 0;
194 
200  virtual void *allocatePinned(size_t size);
201 
207  virtual void *allocatePinned(const BufferDesc &desc);
208 
213  virtual void deallocatePinned(void *ptr);
214 
223  virtual base::Status copy(void *src, void *dst, size_t size,
224  Stream *stream = nullptr) = 0;
225 
234  virtual base::Status download(void *src, void *dst, size_t size,
235  Stream *stream = nullptr) = 0;
236 
245  virtual base::Status upload(void *src, void *dst, size_t size,
246  Stream *stream = nullptr) = 0;
247 
255  virtual base::Status copy(Buffer *src, Buffer *dst,
256  Stream *stream = nullptr) = 0;
257 
265  virtual base::Status download(Buffer *src, Buffer *dst,
266  Stream *stream = nullptr) = 0;
267 
275  virtual base::Status upload(Buffer *src, Buffer *dst,
276  Stream *stream = nullptr) = 0;
277 
278  // TODO: map/unmap
279  // virtual Buffer* map(Buffer* src);
280  // virtual base::Status unmap(Buffer* src, Buffer* dst);
281  // TODO: share? opencl / vpu / hvx?
282  // virtual Buffer* share(Buffer* src);
283  // virtual base::Status unshare(Buffer* src, Buffer* dst);
284 
289  virtual void *getContext();
290 
296 
301  virtual Stream *createStream();
302 
308  virtual Stream *createStream(void *stream);
309 
316 
321  virtual Event *createEvent();
322 
328  virtual base::Status destroyEvent(Event *event);
329 
336  virtual base::Status createEvents(Event **events, size_t count);
337 
344  virtual base::Status destroyEvents(Event **events, size_t count);
345 
351 
352  public:
358  Device(base::DeviceType device_type, std::string library_path = "")
359  : device_type_(device_type) {};
360 
364  virtual ~Device() {};
365 
370  virtual base::Status init() = 0;
371 
376  virtual base::Status deinit() = 0;
377 
378  protected:
380 };
381 
388  public:
393  Stream(Device *device);
394 
400  Stream(Device *device, void *stream);
401 
405  virtual ~Stream();
406 
412 
417  virtual Device *getDevice() const;
418 
424 
448  virtual base::Status recordEvent(Event *event);
449 
473  virtual base::Status waitEvent(Event *event);
474 
480 
486 
491  virtual void *getNativeStream();
492 
498  template <typename T>
499  T *as() {
500  return static_cast<T *>(this);
501  }
502 
503  protected:
504  bool is_external_ = false;
506 };
507 
514  public:
519  Event(Device *device);
520 
524  virtual ~Event();
525 
531 
536  virtual Device *getDevice() const;
537 
557  virtual bool queryDone();
558 
579 
584  virtual void *getNativeEvent();
585 
591  template <typename T>
592  T *as() {
593  return static_cast<T *>(this);
594  }
595 
596  protected:
598 };
599 
606 
612 extern NNDEPLOY_CC_API std::shared_ptr<Architecture> getArchitectureSharedPtr(
613  base::DeviceTypeCode type);
614 
620 
626 
633 
641  std::string library_path);
642 
650  std::string library_path);
651 
658 
665 
673  void *stream);
674 
681 
688 
695 
704  Event **events, size_t count);
705 
714  Event **events, size_t count);
715 
722 extern NNDEPLOY_CC_API std::vector<DeviceInfo> getDeviceInfo(
723  base::DeviceTypeCode type, std::string library_path);
724 
730 
736 
743 
744 } // namespace device
745 } // namespace nndeploy
746 
747 #endif
base::Status insertDevice(int device_id, Device *device)
插入设备(供Python使用)
virtual ~Architecture()
析构函数
std::mutex mutex_
线程安全锁
Definition: device.h:108
std::map< int, Device * > devices_
设备映射表
Definition: device.h:114
virtual base::Status enableDevice(int device_id=0, std::string library_path="")=0
启用设备
virtual std::vector< DeviceInfo > getDeviceInfo(std::string library_path="")=0
获取设备信息列表
virtual base::Status disableDevice()
禁用设备
virtual base::Status checkDevice(int device_id=0, std::string library_path="")=0
检查设备是否可用
base::DeviceTypeCode getDeviceTypeCode() const
获取设备类型代码
Architecture(base::DeviceTypeCode device_type_code)
构造函数
virtual Device * getDevice(int device_id)=0
获取指定ID的设备
设备抽象基类
Definition: device.h:155
virtual base::Status createEvents(Event **events, size_t count)
批量创建事件
virtual void * allocatePinned(const BufferDesc &desc)
分配锁页内存
virtual base::DataFormat getDataFormatByShape(const base::IntVector &shape)
根据形状获取数据格式
virtual base::Status upload(Buffer *src, Buffer *dst, Stream *stream=nullptr)=0
缓冲区上传
virtual void * allocate(size_t size)=0
分配内存
virtual base::Status deinit()=0
反初始化设备
virtual base::Status destroyEvents(Event **events, size_t count)
批量销毁事件
virtual base::Status bindThread()
绑定线程
virtual base::Status destroyEvent(Event *event)
销毁事件
virtual void deallocatePinned(void *ptr)
释放锁页内存
virtual Event * createEvent()
创建事件
virtual void * getContext()
获取设备上下文
virtual base::Status copy(Buffer *src, Buffer *dst, Stream *stream=nullptr)=0
缓冲区拷贝
virtual base::Status init()=0
初始化设备
virtual Stream * createStream()
创建流
base::DeviceType getDeviceType() const
获取设备类型
virtual base::Status download(void *src, void *dst, size_t size, Stream *stream=nullptr)=0
从设备下载数据到主机
base::DeviceType device_type_
设备类型
Definition: device.h:379
virtual base::Status copy(void *src, void *dst, size_t size, Stream *stream=nullptr)=0
内存拷贝
Device(base::DeviceType device_type, std::string library_path="")
构造函数
Definition: device.h:358
virtual ~Device()
析构函数
Definition: device.h:364
virtual base::Status destroyStream(Stream *stream)
销毁流
virtual base::Status upload(void *src, void *dst, size_t size, Stream *stream=nullptr)=0
从主机上传数据到设备
virtual void * allocate(const BufferDesc &desc)=0
分配内存
virtual void deallocate(void *ptr)=0
释放内存
virtual void * allocatePinned(size_t size)
分配锁页内存
virtual BufferDesc toBufferDesc(const TensorDesc &desc, const base::IntVector &config)=0
转换为缓冲区描述符
virtual base::Status download(Buffer *src, Buffer *dst, Stream *stream=nullptr)=0
缓冲区下载
virtual Stream * createStream(void *stream)
从现有流创建流对象
T * as()
类型转换模板函数
Definition: device.h:592
virtual bool queryDone()
查询事件是否已完成
virtual base::Status synchronize()
同步等待事件完成
Event(Device *device)
构造函数
virtual void * getNativeEvent()
获取原生事件对象
virtual ~Event()
析构函数
Device * device_
关联的设备
Definition: device.h:597
virtual Device * getDevice() const
获取关联设备
virtual base::DeviceType getDeviceType() const
获取设备类型
virtual base::Status synchronize()
同步流
virtual void * getNativeStream()
获取原生流对象
virtual base::Status onExecutionContextTeardown()
执行上下文清理
virtual base::Status waitEvent(Event *event)
等待事件完成
Device * device_
关联的设备
Definition: device.h:505
virtual ~Stream()
析构函数
Stream(Device *device, void *stream)
构造函数(从现有流)
virtual Device * getDevice() const
获取关联设备
virtual base::Status recordEvent(Event *event)
在流中记录事件
T * as()
类型转换模板函数
Definition: device.h:499
virtual base::Status onExecutionContextSetup()
执行上下文设置
Stream(Device *device)
构造函数
virtual base::DeviceType getDeviceType() const
获取设备类型
类型架构注册器模板类
Definition: device.h:136
TypeArchitectureRegister(base::DeviceTypeCode type)
构造函数,自动注册架构
Definition: device.h:142
#define NNDEPLOY_CC_API
api
Definition: macro.h:29
std::vector< int > IntVector
Definition: common.h:379
base::Status destroyStream(Stream *stream)
销毁流
Architecture * getArchitecture(base::DeviceTypeCode type)
获取指定类型的架构
base::DeviceType getDefaultHostDeviceType()
获取默认主机设备类型
bool isHostDeviceType(base::DeviceType device_type)
判断是否为主机设备类型
base::Status enableDevice(base::DeviceType device_type, std::string library_path)
启用设备
base::Status disableDevice()
禁用设备
base::Status createEvents(base::DeviceType device_type, Event **events, size_t count)
批量创建事件
Device * getDevice(base::DeviceType device_type)
获取指定类型的设备
base::Status checkDevice(base::DeviceType device_type, std::string library_path)
检查设备是否可用
Device * getDefaultHostDevice()
获取默认主机设备
Stream * createStream(base::DeviceType device_type)
创建指定类型的流
base::Status destroyEvents(base::DeviceType device_type, Event **events, size_t count)
批量销毁事件
std::map< base::DeviceTypeCode, std::shared_ptr< Architecture > > & getArchitectureMap()
获取架构映射表
std::shared_ptr< Architecture > getArchitectureSharedPtr(base::DeviceTypeCode type)
获取指定类型架构的共享指针
base::Status destoryArchitecture()
销毁架构
Event * createEvent(base::DeviceType device_type)
创建指定类型的事件
base::Status destroyEvent(Event *event)
销毁事件
std::vector< DeviceInfo > getDeviceInfo(base::DeviceTypeCode type, std::string library_path)
获取设备信息
base::Status shape(device::Tensor *input, std::shared_ptr< ir::ShapeParam > param, device::Tensor *output)
设备信息结构体
Definition: device.h:28
base::DeviceType device_type_
设备类型
Definition: device.h:29