日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zynqNet整体思路框架

發布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zynqNet整体思路框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

zynqNet整體思路框架

  • ZynqNet CNN Accelerator: Schedule
    • 分析FPGA端頂層函數
    • P_TOP_SETUP
    • P_setLayerConfigs
    • 算法

ZynqNet CNN Accelerator: Schedule

分析FPGA端頂層函數

首先CPU端會通過AXI_Lite總線將一層網絡的參數傳輸到FPGA的PL端進行硬件加速計算,接下來將詳細進行分析
首先關注HLS端的頂層函數,這些參數是用來生成IPcore的接口,需要使用相應的#pragma語法進行限定

void fpga_top(layer_t layer, data_t *SHARED_DRAM, unsigned int weights_offset,weightaddr_t num_weights, unsigned int input_offset){ /*map pointer SHARED_DRAM to AXI-master interface for global memory access*/ #pragma HLS INTERFACE m_axi port=SHARED_DRAM offset=slave bundle=gmem /*we also need to map SHARED_DRAM and return to a bundled axilite slave interface*/ #pragma HLS INTERFACE s_axilite port=SHARED_DRAM bundle=control #pragma HLS INTERFACE s_axilite port = layer bundle = control #pragma HLS INTERFACE s_axilite port = num_weights bundle = control register #pragma HLS INTERFACE s_axilite port = weights_offset bundle = control register #pragma HLS INTERFACE s_axilite port = input_offset bundle = control register #pragma HLS INTERFACE s_axilite port = return bundle = control register ... }

這里放一篇關于如何對頂層函數接口進行設置的文章

P_TOP_SETUP

P_TOP_SETUP : {// Setup Memory ControllerMemoryController::setup(SHARED_DRAM, weights_offset, input_offset);// Setup Global Pooling Cache// if (layer.pool == POOL_GLOBAL) GPoolCache::reset(); -> in loop. }

用于設置weight和data的地址偏移量,將頂層函數的weights_offset和input_offset寫入以下兩個全局變量

unsigned int MemoryController::dram_weights_offset; unsigned int MemoryController::dram_data_offset;

P_setLayerConfigs

P_layer_setup : { P_setLayerConfigs : {ImageCache::setLayerConfig(layer);WeightsCache::setLayerConfig(layer, num_weights);MemoryController::setLayerConfig(layer);ProcessingElement::setLayerConfig(layer); }LOG_LEVEL_DECR;// Load Weights from DRAMWeightsCache::loadFromDRAM(SHARED_DRAM);// Preload Row 0 + Pixel (1,0)MemoryController::setPixelLoadRow(0);ImageCache::preloadRowFromDRAM(SHARED_DRAM);MemoryController::setPixelLoadRow(1);ImageCache::preloadPixelFromDRAM(SHARED_DRAM); }

注意ImageCache::setLayerConfig函數里兩個變量的設置,為什么要這樣設計呢?這兩個變量與地址計算相關

line_width = ch_in * width_in; loads_left = line_width * height_in;

以第一層網絡為例,width=256,height=256,ch=3
那么line_width=3*256,loads_left=256,


接下來看preloadRowFromDRAM函數,意思是從DRAM中,每個像素都取出3通道,這256個3個通道組成新的1行數據。如上圖所示:

再來看被調用的preloadPixelFromDRAM函數,從SHARED_DRAM中取數據,并存入IBRAM


為什么設置NUM_IMG_CACHE_LINES=4

算法

總結

以上是生活随笔為你收集整理的zynqNet整体思路框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。