【NCNN原始碼分析】1.基本資料型別
阿新 • • 發佈:2018-12-11
對於NCNN而言,核心在於網路的前向推理過程(Inference),其主要資料型別為mat
,該資料型別以類的形式定義在src/mat.h
中,其中包含了mat
的建構函式、解構函式、常見的運算過程。
#if __ARM_NEON
#include <arm_neon.h>
#endif
通過巨集變數__ARM_NEON
控制Neon
的使用。
// empty Mat(); // vec Mat(int w, size_t elemsize = 4u, Allocator* allocator = 0); // image Mat(int w, int h, size_t elemsize = 4u, Allocator* allocator = 0); // dim Mat(int w, int h, int c, size_t elemsize = 4u, Allocator* allocator = 0); // copy Mat(const Mat& m); // external vec Mat(int w, void* data, size_t elemsize = 4u, Allocator* allocator = 0); // external image Mat(int w, int h, void* data, size_t elemsize = 4u, Allocator* allocator = 0); // external dim Mat(int w, int h, int c, void* data, size_t elemsize = 4u, Allocator* allocator = 0); // release ~Mat();
類的一開始聲明瞭多種建構函式和解構函式。其中有空建構函式、向量的建構函式、二維矩陣的建構函式、三維矩陣的建構函式等。Allocator
用於建立記憶體池構造器,手動為mat
分配記憶體空間。在32位架構中size_t
表示四位元組,定義為typedef unsigned int size_t
;在64位架構中,size_t
表示八位元組,定義為typedef unsigned long size_t
。
void fill(float v);
void fill(int v);
template <typename T> void fill(T v);
定義資料填充函式,最後一行採用泛型進行統一,但是出於一定的考慮,又單獨實現了對於int
float
型別的介面。
// deep copy
Mat clone(Allocator* allocator = 0) const;
重新分配記憶體,對一個mat
變數進行深拷貝,不同於直接賦值,直接賦值的方式僅僅是地址的改變。