1. 程式人生 > >【NCNN原始碼分析】1.基本資料型別

【NCNN原始碼分析】1.基本資料型別

對於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變數進行深拷貝,不同於直接賦值,直接賦值的方式僅僅是地址的改變。