Files
SDK_SG200x_V2/cviruntime/include/runtime/neuron.hpp
carbon e25f20f7a3 add cviruntime
commit 3f4938648950a7f3bf9a19c320ca9fae7c52de20
Author: sophgo-forum-service <forum_service@sophgo.com>
Date:   Mon May 13 13:44:23 2024 +0800

    [feat] cviruntime opensource for cv18xx soc.

    - a4b6a3, add cumsum and gatherelements_pt.
2024-05-31 11:51:34 +08:00

149 lines
3.3 KiB
C++

/*
* Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved.
*/
#ifndef RUNTIME_NEURON_H
#define RUNTIME_NEURON_H
#include <map>
#include <vector>
#include <memory>
#include "cviruntime.h"
#include "cviruntime_context.h"
namespace cvi {
namespace runtime {
class Neuron {
public:
enum NeuronState {
TPU_MEM = 0,
CPU_MEM = 1,
};
enum NeuronType {
WEIGHT = 0,
ACTIVATION = 1,
};
Neuron(CVI_RT_HANDLE ctx, const void *model_tensor,
CVI_RT_MEM weight_mem, const char *model_name);
Neuron(CVI_RT_HANDLE ctx, CVI_RT_HANDLE cvk,
const void *model_tensor,
uint64_t *baseAddrArray,
CVI_RT_MEM *baseMemArray,
const char *model_name);
~Neuron();
template <typename T>
inline T* cpu_data() {
_state = Neuron::CPU_MEM;
return (T *)sys_mem();
}
inline size_t count() {
return _count;
}
inline size_t size() {
return _size;
}
inline size_t offset(int n, int c = 0, int h = 0, int w = 0) {
return (((n * shape[1] + c) * shape[2] + h) * shape[3] + w);
}
inline bool overwrote() {
return _overwrote;
}
inline void setState(NeuronState state) {
_state = state;
}
inline uint8_t *sys_mem() {
return (_vaddr ? _vaddr : _cpu_mem);
}
inline uint64_t paddr() {
return _paddr;
}
inline float qscale() {
return _qscale;
}
inline void setQScale(float scale) {
_qscale = scale;
}
inline int zero_point(){
return _zero_point;
}
CVI_RC preloadChannelAndCompact(int32_t channel_idx, uint64_t src_paddr);
CVI_RC preloadFrameAndCompact(int32_t frame_idx, uint64_t src_paddr);
CVI_RC preload(int32_t frame_idx, uint64_t src_paddr);
void load(CVI_TENSOR &tensor);
void store(CVI_TENSOR &tensor);
void toCpu();
void toTpu();
CVI_RC reserveIonMem(int64_t offset);
CVI_RC reserveSysMem();
void updateBaseAddr(uint64_t paddr);
bool isPacked();
private:
void updateBaseAddr(CVI_RT_MEM mem);
inline void setZeroPoint(int zp) { _zero_point = zp; }
void setPixelFormatAndSize(const std::string &pixel_format, int32_t dsize);
void setPixelAlign(CVI_NN_PIXEL_FORMAT_E format);
uint32_t yuv_size(int n, int c, int h, int w, CVI_NN_PIXEL_FORMAT_E format);
public:
std::string name;
std::vector<int> shape;
CVI_FMT fmt;
NeuronType type;
CVI_NN_PIXEL_FORMAT_E pixel_format;
std::vector<float> scale;
std::vector<float> mean;
bool aligned = false;
int vpss_w_align, vpss_y_align, vpss_channel_align;
private:
CVI_RT_HANDLE _ctx;
CVI_RT_KHANDLE _cvk;
CVI_RT_MEM _streamCopyCmdbuf = nullptr;
CVI_RT_MEM _channelPreloadCmdbuf = nullptr;
CVI_RT_MEM _framePreloadCmdbuf = nullptr;
CVI_RT_MEM _base_mem = nullptr;
CVI_RT_MEM _gmem = nullptr;
uint8_t* _cpu_mem = nullptr;
uint8_t* _vaddr = nullptr;
uint64_t _paddr = 0;
NeuronState _state;
uint32_t _id;
uint32_t _count;
uint32_t _size;
uint32_t _tensor_size = 0;
bool _overwrote = false;
float _qscale = 1.0f;
int _zero_point = 0;
uint64_t *_baseAddrArray;
CVI_RT_MEM *_baseMemArray;
int32_t _baseAddrIndex = 1;
std::string _model_name;
std::string _module_name;
};
typedef std::map<std::string, std::shared_ptr<Neuron>> tensor_map_t;
typedef std::vector<std::shared_ptr<Neuron>> tensor_list_t;
} // namespace runtime
} // namespace cvi
#endif