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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于PYNQ-Z2开发板实现矩阵乘法加速详细流程

發(fā)布時間:2023/12/19 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于PYNQ-Z2開發(fā)板實現(xiàn)矩陣乘法加速

主要內(nèi)容

1、在Vivado HLS中生成矩陣乘法加速的IP核。
2、在Vivado中完成Block Design。
3、在Jupyter Notebook上完成IP的調(diào)用。
完整項目工程文件下載鏈接見文末

所需硬件

PYNQ-Z2開發(fā)板、USB數(shù)據(jù)線、網(wǎng)線
SD卡、讀卡器
開發(fā)板配置參考鏈接

1、Vivado HLS生成矩陣乘法加速IP

  • HLS硬件配置信息
  • mul.h關(guān)鍵代碼
#define MAT_A_ROWS 32 #define MAT_A_COLS 32 #define MAT_B_ROWS 32 #define MAT_B_COLS 32typedef int mat_a_t; typedef int mat_b_t; typedef int result_t;void matrixmul(mat_a_t a[MAT_A_ROWS][MAT_A_COLS],mat_b_t b[MAT_B_ROWS][MAT_B_COLS],result_t res[MAT_A_ROWS][MAT_B_COLS]);

定義輸入的a,b矩陣維度和輸出矩陣的維度

  • mul.cpp關(guān)鍵代碼
#include "mul.h"void matrixmul(mat_a_t a[MAT_A_ROWS][MAT_A_COLS],mat_b_t b[MAT_B_ROWS][MAT_B_COLS],result_t res[MAT_A_ROWS][MAT_B_COLS]) {int tempA[MAT_A_ROWS][MAT_A_COLS];int tempB[MAT_B_ROWS][MAT_B_COLS];int tempAB[MAT_A_ROWS][MAT_B_COLS];for (int ia = 0; ia<MAT_A_ROWS ;ia++){for(int ja = 0; ja< MAT_A_COLS; ja++){tempA[ia][ja] = a[ia][ja];}}for (int ib = 0; ib<MAT_B_ROWS ;ib++){for(int jb = 0; jb< MAT_B_COLS; jb++){tempB[ib][jb] = b[ib][jb];}}/* for each row and column of AB */row: for(int i = 0; i < MAT_A_ROWS; ++i) {col: for(int j = 0; j < MAT_B_COLS; ++j) {/* compute (AB)i,j */int ABij = 0;product: for(int k = 0; k < MAT_A_COLS; ++k) {ABij += tempA[i][k] * tempB[k][j];}tempAB[i][j] = ABij;}}for (int iab = 0; iab<MAT_A_ROWS ;iab++){for(int jab = 0; jab< MAT_B_COLS; jab++){res[iab][jab] = tempAB[iab][jab];}}}
  • 在約束文件中添加接口約束和循環(huán)流水,實現(xiàn)矩陣乘法的硬件加速

    此處IP核使用ap_ctrl_none接口協(xié)議,輸入的a,b矩陣和輸出的res矩陣均使用axis流數(shù)據(jù),注意流數(shù)據(jù)傳輸中Block Design中需添加DMAip核進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換。
  • 編寫相關(guān)的C仿真代碼,此處不表,詳見項目文件。
    進(jìn)行C仿真

  • C仿真結(jié)果

  • 進(jìn)行C綜合


  • 進(jìn)行IP導(dǎo)出


  • 生成的IP在./solution1/impl/ip路徑下,為一壓縮包,如下圖所示。

2、Vivado進(jìn)行Block Design

  • Vivado硬件配置信息

  • 添加Vivado HLS生成的IP,PROJECT MANAGER->Settings

  • Project Settings->IP->Repository

  • 點擊+號,選擇IP所在路徑進(jìn)行IP的添加

  • 然后進(jìn)行Block Design


  • 首先添加ZYNQ的IP



  • 雙擊生成的ZYNQip核,進(jìn)行配置參數(shù)的修改,首先使能HP接口

  • 取消勾選USB接口,然后點擊OK

  • 添加HLS編寫的IP

  • 添加兩個DMA的IP

  • 結(jié)果如下

  • 因為我們有兩個AXI流數(shù)據(jù)的入口,一個AXI流數(shù)據(jù)的輸出,所以要對DMA的讀寫端口數(shù)量進(jìn)行修改,配置兩個DMA的讀端口,1個DMA的寫端口。下面對DMA的IP參數(shù)進(jìn)行設(shè)置。
  • DMA0:

  • DMA1:





  • 之后進(jìn)行手動連線,下圖中標(biāo)黃的部分

  • 然后繼續(xù)自動完成連線

  • 最終的Block如下圖所示

  • 進(jìn)行驗證

  • 此處出現(xiàn)警告信息,可以不管,主要是流數(shù)據(jù)的Last信號缺失。

  • 之后生成頂層調(diào)用文件,右擊頂層模塊,點擊Create HDL Wrapper…


  • 之后生成BIT文件 PROGRAM AND DEBUG->Generate Bitstream



  • Bitstream生成后彈出彈窗,點擊cancel。然后點擊File->Export->Export Hardware


  • 然后點擊File->Export->Export Bitstream File,輸出路徑選擇項目根目錄。

  • 在下圖所示的路徑中,找到.hwh文件,拷貝到文件的根目錄。

  • 將bit文件、tcl文件和hwh文件重命名成一個名字,如下所示。


至此完成了Vivado相關(guān)的工作。

3、Jupyter Notebook進(jìn)行矩陣乘法加速IP的調(diào)用

PYNQ-Z2板的詳細(xì)配置過程見文章頂?shù)南嚓P(guān)鏈接,此處默認(rèn)大家能正常啟動板子。

  • 在Jupyter Notebook上新建文件夾,進(jìn)行文件的上傳。點擊Upload上傳之前生成的bit文件、tcl文件和hwh文件。



  • 進(jìn)行新建python文件操作

  • python調(diào)用IP相關(guān)代碼
import pynq.lib.dma import numpy as npmmol = pynq.Overlay("./mul.bit")dma0 = mmol.axi_dma_0 dma1 = mmol.axi_dma_1from pynq import Xlnk xlnk = Xlnk() a = xlnk.cma_array(shape=(32,32), dtype=np.int) b = xlnk.cma_array(shape=(32,32), dtype=np.int) res = xlnk.cma_array(shape=(32,32), dtype=np.int)for i in range(32):for j in range(32):a[i][j] = 8;b[i][j] = 8;dma0.sendchannel.transfer(a) dma1.sendchannel.transfer(b) dma0.recvchannel.transfer(res) print(res)
  • 點擊run查看結(jié)果


傳入的a,b矩陣為32*32的矩陣,元素均為8。結(jié)果顯示乘法IP核調(diào)用正常。

項目工程下載鏈接

[2020.6.18更新,解決Block Design中TLAST管腳警告的問題]
改變數(shù)據(jù)類型
mul.c:

#include "mul.h"void matrixmul(mat_a_t a[SIZE],mat_b_t b[SIZE],result_t res[SIZE]) {int tempA[MAT_A_ROWS][MAT_A_COLS];int tempB[MAT_B_ROWS][MAT_B_COLS];int tempAB[MAT_A_ROWS][MAT_B_COLS];for (int ia = 0; ia<MAT_A_ROWS ;ia++){for(int ja = 0; ja< MAT_A_COLS; ja++){tempA[ia][ja] = a[ia*MAT_A_ROWS+ja].data;}}for (int ib = 0; ib<MAT_B_ROWS ;ib++){for(int jb = 0; jb< MAT_B_COLS; jb++){tempB[ib][jb] = b[ib*MAT_A_ROWS+jb].data;}}/* for each row and column of AB */row: for(int i = 0; i < MAT_A_ROWS; ++i) {col: for(int j = 0; j < MAT_B_COLS; ++j) {/* compute (AB)i,j */int ABij = 0;product: for(int k = 0; k < MAT_A_COLS; ++k) {ABij += tempA[i][k] * tempB[k][j];}tempAB[i][j] = ABij;}}for (int iab = 0; iab<MAT_A_ROWS ;iab++){for(int jab = 0; jab< MAT_B_COLS; jab++){res[iab*MAT_A_ROWS+jab]=push_stream<int>(tempAB[iab][jab],iab==(MAT_A_ROWS-1)&&jab==(MAT_B_COLS-1));}}}

mul.h:

#ifndef __MATRIXMUL_H__ #define __MATRIXMUL_H__#include <cmath> #include <ap_axi_sdata.h>// Uncomment this line to compare TB vs HW C-model and/or RTL //#define HW_COSIM#define MAT_A_ROWS 32 #define MAT_A_COLS 32 #define MAT_B_ROWS 32 #define MAT_B_COLS 32 #define SIZE 1024typedef ap_axis<32,0,0,0> mat_a_t; typedef ap_axis<32,0,0,0> mat_b_t; typedef ap_axis<32,0,0,0> result_t;// Prototype of top level function for C-synthesis void matrixmul(mat_a_t a[SIZE],mat_b_t b[SIZE],result_t res[SIZE]);template <typename T> ap_axis<32,0,0,0> push_stream(T const &v, bool last = false) { #pragma HLS INLINEap_axis<32,0,0,0> e;//assert(sizeof(T) == sizeof(int));union{int oval;T ival;} converter;converter.ival = v;e.data = converter.oval;e.strb=-1;e.keep=15;e.last = last ? 1 : 0;return e; }#endif // __MATRIXMUL_H__ not defined

使用ap_axis數(shù)據(jù)類型,其中含有l(wèi)ast信號,需對最后一次輸出的信號的last信號賦1。或者自己定義數(shù)據(jù)類型的結(jié)構(gòu)體,含last信號即可。這時進(jìn)行Block Design的驗證時不會再報TLAST信號丟失的Warning。

總結(jié)

以上是生活随笔為你收集整理的基于PYNQ-Z2开发板实现矩阵乘法加速详细流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一二在线 | 国产真人无码作爱视频免费 | 在线观看国产 | 亚洲国产精品无码久久久 | 日韩美女网站 | 老司机伊人 | 看毛片的网址 | 久久国产视频网站 | 日韩欧美国产成人精品免费 | 国产在线免费观看 | 99久久免费看精品国产一区 | 日韩七区| 日本一区二区视频在线观看 | 操bbbbb| 国产黄色大片在线观看 | 日日射天天干 | 中国黄色录像一级片 | 私人影院毛片 | a√天堂网| 日本理论片 | 日本免费一二三区 | 老司机午夜性大片 | 丁香七月激情 | 国产精品99精品久久免费 | 午夜视频在线看 | 青青草国产精品视频 | 亚洲色图国产精品 | av大片网站 | 伦伦影院午夜理伦片 | 天天操天天操天天操天天操天天操 | 久草av在线播放 | 亚洲成人精品一区 | 青青视频网 | 国产精品免费视频一区二区三区 | 日本一区二区三区在线视频 | 欧美毛片免费看 | 性综艺节目av在线播放 | 一区二区三区精彩视频 | 欧美精品一区二 | 亚洲色图在线观看视频 | 成年人看的视频网站 | 王者后宫yin肉h文催眠 | 久久久精品电影 | 69av片 | 韩国激情呻吟揉捏胸视频 | 国产在线观看第一页 | 精品美女久久久久 | 水多多在线 | 国产成人一区二区三区影院在线 | 都市激情 亚洲 | 日本少妇色 | 午夜福利毛片 | 久久精品国产露脸对白 | 久草视频中文在线 | 久久国内 | 青草视频在线免费观看 | 日本一级淫片1000部 | 涩涩资源站 | 日韩精选视频 | 91麻豆蜜桃一区二区三区 | 后进极品美女白嫩翘臀 | 337p粉嫩日本欧洲亚洲大胆 | 女人张开腿让男人插 | 草av在线 | 绿帽单男 | 伊人成人22 | 国产高清在线观看视频 | 欧美狂猛xxxxx乱大交3 | 日韩精品成人在线观看 | 欧美va天堂 | 日美韩av | 欧美手机在线 | 一级免费毛片 | 爆操av| 日韩成人精品在线观看 | 九七精品 | 亚洲国产日韩在线观看 | 亚洲av片一区二区三区 | 亚洲www色 | 在线日韩中文字幕 | 男女在楼梯上高潮做啪啪 | 91性色| 亚洲av综合av一区二区三区 | 手机在线观看毛片 | 曰本无码人妻丰满熟妇啪啪 | 久久精品免费在线观看 | 中文在线一区二区 | 日本免费福利视频 | 国产精品性 | 人妻一区二区三区四区五区 | 亚洲区自拍偷拍 | 在线看片网址 | 日本裸体网站 | www.日本精品| 亚洲无码高清精品 | 中文字幕人妻一区二区三区视频 | 日韩人妻精品一区二区 | 日韩av不卡在线观看 | 中文字幕被公侵犯的漂亮人妻 |