MNN框架學習(三) 記憶體管理

2021-10-02 09:35:25 字數 1322 閱讀 4737

不知道是不是借鑑了ncnn的**,感覺差不多,具體可以參考大佬對於ncnn記憶體管理**的解析,具體見參考資料[1],講的非常清楚,這裡只是做乙個學習筆記。

具體**為source/core/mnnmemoryutils.c檔案:

// 使用malloc函式來進行記憶體分配

// 傳入待分配記憶體大小,及對齊記憶體大小

void *mnnmemoryallocalign(size_t size, size_t alignment)

首先,需要分配原始記憶體:

void **origin = (void **)malloc(size + sizeof(void *) + alignment);
這裡多分配的sizeof(void*)用於儲存對齊前記憶體位址;多分配的alignment為了保證對齊後,依然有size大小記憶體可用;轉換成(void**)的原因,是為了後面origin+1直接跳過用於儲存對齊前記憶體位址的預留記憶體。

然後,對齊分配的記憶體:

static inline void **alignpointer(void **ptr, size_t alignment);
對應實現部分為:

(void **)((intptr_t)((unsigned char *)ptr + alignment - 1) & -alignment);
後面加上alignment -1的目的有兩個:

(1)防止剛好為alignment倍數的size不會被多算;

(2)防止不是alignment倍數的size不會被少算;

後面&-alignment是為了保證分配記憶體為alignment倍數:

如:alignment為16,對應原碼為0001 0000(8位2進製), 0x0000 0000 0000 0010(64位16進製制)

補碼: 1111 0000(8位2進製),0xffff ffff ffff fff0(64位16進製制)

求&操作就可以自然保證前者是16倍數。

void *mnnmemorycallocalign(size_t size, size_t alignment)
實現過程差不多。

void mnnmemoryfreealign(void *aligned)
直接看**註解吧:

// 釋放掉對齊記憶體

void mnnmemoryfreealign(void *aligned)

#endif

}

打完收工~

MNN框架學習(二) 使用MNN部署模型

按照我們對乙個模型推理過程的理解,一般模型推理過程都分為兩個部分,第乙個部分為模型載入和引數初始化,第二個部分為模型前向推理及一些後處理,得到檢測或識別的結果。第一步將 分解成兩個部分 模型載入和前向推理。第乙個部分 load and config mnn model auto revertor s...

iOS開發學習筆記三 記憶體管理

最近在看唐巧先生著的 ios開發高階 此內容摘自此書,為方便個人記錄與學習 引用計數的應用 由於引用計數簡單有效,除了objective c語言外,微軟的com component object model c 11 c 11提供了基於引用計數的智慧型指標share prt 等語言也提供了基於引用計...

golang學習三 函式, 記憶體, 工程管理

二 記憶體 三 函式 4.遞迴函式 四 工程管理 函式定義 func 函式名 引數1 型別,引數2 型別,函式呼叫 函式名 引數1 引數2 函式定義 func 函式名 args.int 語法 func 函式名 引數列表 引數型別 返回值型別 var res 引數型別 res 函式名 引數列表 示例 ...