Xilinx Vivado HLS中Floating-Point(浮點)設計介紹

2020-12-04 電子發燒友

編碼風格與技巧

儘管通常Fixed-Point(定點)比Floating-Point(浮點)算法的FPGA實現要更快,且面積更高效,但往往有時也需要Floating-Point來實現。這是因為Fixed-Point有限的數據動態範圍,需要深入的分析來決定整個設計中間數據位寬變化的pattern,為了達到優化的QoR,並且要引入很多不同類型的Fixed-Point中間變量。而Floating-Point具有更大的數據動態範圍,從而在很多算法中只需要一種數據類型的優勢。

Xilinx Vivado HLS工具支持C/C++ IEEE-54標準單精度及雙精度浮點數據類型,可以比較容易,快速地將C/C++ Floating-Point算法轉成RTL代碼。與此同時,為了達到用戶期望的FPGA資源與性能, 當使用Vivado HLS directives時需要注意C/C++編碼風格與技巧相結合。

編碼風格

1.1 單雙精度浮點數學函數

#include

float example(float var)

{

return log(var); // 雙精度自然對數

}

在C設計中, 這個例子, Vviado HLS 生成的RTL實現將輸入轉換成雙精度浮點,並基於雙精度浮點計算自然對數,然後將雙精度浮點輸出轉換成單精度浮點。

#include

float example(float var)

{

return logf(var); // 單精度自然對數

}

在C設計中, logf才是單精度自然對數, 這個例子 Vviado HLS 生成的RTL實現將基於單精度浮點計算自然對數, 而且沒有輸入輸出單雙精度的互轉。

1.2 浮點運算優化

我們先來看一個例子,三個從代數上看起來差不多的寫法,但其在Vivado HLS中綜合出來的是三個完全不一樣的結果。

void example(float *m0, float *m1, float *m2, float var)

{

*m0 = 0.2 * var; // 雙精度浮點乘法,單雙精度類型轉換

*m1 = 0.2f * var; // 單精度浮點乘法

*m2 = var / 20.0f; // 單精度浮點除法

}

Vivado HLS將日m0, m1, m2綜合成不同的RTL實現。

因為0.2是一個不能精確表徵的雙精度數字, 所以m0運算會被Vivado HLS綜合成一個雙精度浮點乘法, 並且將var 轉換成雙精度, 然後將雙精度乘法輸出m0轉換成單精度。

特別注意,如果希望Vivado HLS綜合出單精度常熟,需要在常數後面加f, 如0.2f。這樣m1綜合成一個單精度乘法的輸出。同理,m2將被Vivado HLS綜合成單精度除法的輸出。

我們來看另外一個例子。

void example(float *m0, float *m1, float var)

{

*m0 = 0.2f * 5.0f * var; // *m0 = var;常數乘法被優化掉

*m1 = 0.2f * var * 5.0f; // 兩個雙精度浮點乘法

}

再來看另一個例子。

void example(float *m0, float *m1, float var)

{

*m0 = 0.5 * var; //

*m1 = var/2; //

}

m0運算會被Vivado HLS綜合成一個雙精度浮點乘法, 並且將var 轉換成雙精度, 然後將雙精度乘法輸出m0轉換成單精度。

m1運算會被Vivado HLS綜合成簡單的右移運算。所以如果用戶希望實現對var除以2, 就寫成m1這種表達式,而不是m0的表達式。

並行度與資源復用

由於浮點運算相比整型,定點運算耗用更可觀的資源。Vivado HLS會儘量用更有效的資源來實現浮點運算,當數據的相關性及約束許可的情況下,在Vivado HLS中,會儘量復用一些浮點運算單元。為了說明這個,我們看一個簡單的四個浮點加法例子, Vivado HLS復用一個浮點加法器來串行實現四個浮點加法。

void example(float *r, float a, float b,

float c, float d)

{

*r = a + b + c + d;

}

有時設計需要更高的throughput及更低的latency。這時就需要提高設計的並行度。以下面例子來說明,在Vivado HLS就需要對for循環loop加pipeline與unroll 的directives。同時需要通過設置a,b,r0 為FIFO, 並對其重排以提高I/O帶寬兩倍。這樣Vivado HLS就會綜合出兩個浮點加法來並行實現,這是因為每個加法器計算是完全獨立的。

void example(float r0[32], float a[32], float b[32])

{

#pragma HLS interface ap_fifo port=a,b,r0

#pragma HLS array_reshape cyclic factor=2 variable=a,b,r0

for (int i = 0; i 《 32; i++)

{

#pragma HLS pipeline

#pragma HLS unroll factor=2

r0[i] = a[i] + b[i];

}

}

然而,如果更多複雜的運算,或許會導致不獨立的浮點運算,在這種情況下,Vivado HLS不能重新排列這些運算的順序,這樣會導致更低的,不是所期望的復用。 下面舉例來說明如何提高帶有反饋浮點運算的性能。

這個例子的累加會導致recurrence,並且通常浮點加法的latency大於一個時鐘周期,加的pipeline directive並不能達到一個時鐘周期完成一次累加的throughput。

float example(float x[32])

{

#pragma HLS interface ap_fifo port=x

float acc = 0;

for (int i = 0; i 《 32; i++)

{

#pragma HLS pipeline

acc += x[i];

}

return acc;

}

為了對上面例子並行展開,可以對代碼如下做較小的改動,也就是拆成先部分累加,再最後累加,當然也需要對輸入數據進行簡單的重新排列,以獲得相應的I/O帶寬,從而達到期望的並行度。

float top(float x[32])

{

#pragma HLS interface ap_fifo port=x

float acc_part[4] = {0.0f, 0.0f, 0.0f, 0.0f};

for (int i = 0; i 《 32; i += 4) { // 手動unroll by 4

for (int j = 0; j 《 4; j++) { // 部分累加

#pragma HLS pipeline

acc_part[j] += x[i + j];

}

for (int i = 1; i 《 4; i++) { //最後累加

#pragma HLS unroll

acc_part[0] += acc_part[i];

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • ARM 浮點運算詳解
    當使用軟浮點工具鏈編譯浮點操作時,編譯器會用內聯的浮點庫替換掉浮點操作,使得生成的機器碼完全不含浮點指令,但是又能夠完成正確的浮點操作。三:浮點協處理器:在較新版本的ARM中,可以添加協處理器。 一些ARM CPU為了更好的處理浮點計算的需要,添加了浮點協處理器。並定義了浮點指令集。
  • 《抖音》hls可樂桶介紹
    《抖音》上面最近出現了一個非常奇怪的詞,這一個詞就是「hls可樂桶」,聽上去是不是非常像KFC新出的套餐呢?不過,真實的意思可遠遠不是這樣的。接下來小編就給各位玩家小夥伴詳細的講解一下《抖音》hls可樂桶介紹,一起來看看吧。
  • 《抖音》上火的hls可樂桶是什麼
    抖音上火的hls可樂桶是什麼?最近刷《抖音》的小夥伴相信都看到了一些關於hls可樂桶的視頻,視頻除搞笑之外,還有很多小夥伴都在想這個hls可樂桶是什麼意思,那麼今天小編就給大家介紹一下抖音上火的hls可樂桶的相關含義。
  • Xilinx Vivado I/O延遲約束介紹
    Xilinx Vivado I/O延遲約束介紹 FPGA開源工作室 發表於 2020-11-29 10:01:16   要在設計中精確建模外部時序,必須為輸入和輸出埠提供時序信息
  • 基於FPGA的高速流水線浮點乘法器設計與實現
    同時由於基於IEEE754 標準的浮點運算具 有動態範圍大,可實現高精度,運算規律較定點運算更為簡捷等特點,浮點運算單元的設計 研究已獲得廣泛的重視。本文介紹了 32 位浮點乘法器的設計,採用了基4 布思算法,改進的4:2 壓縮器及布思 編碼算法,並結合FPGA自身特點,使用流水線設計技術,在實現高速浮點乘法的同時,也 使是系統具有了高穩定性、規則的結構、易於FPGA 實現及ASIC 的HardCopy 等特點。
  • PYNQ中實現SoftMax函數加速器
    傳統的ZYNQ開發板(Zedboard等)需要結合vivado和SDK兩大工具分別對PL、PS端進行硬體和軟體開發。本次我介紹的平臺為PYNQ開發板可使用Python將軟體操作和硬體控制進行無縫銜接,目前已經出到Z2版本,由依元素進行代理銷售,999塊極具性價比。
  • 基於FPGA高精度浮點運算器的FFT設計與仿真
    摘要 基於IEEE浮點表示格式及FFT算法,提出一種基2FFT的FPGA方法,完成了基於FPGA高精度浮點運算器的FFT的設計。利用VHDL語言描述了蝶形運算過程及地址產生單元,其仿真波形基本能正確的表示輸出結果。
  • 抖音hls可樂桶是什麼梗
    抖音hls可樂桶是什麼梗?抖音上最近一個hls可樂桶很火,很多網友都在學習做和研究怎麼兌和怎麼調,那麼大家知道抖音hls可樂桶是什麼梗要怎麼調嗎? 抖音hls可樂桶是什麼梗 hls可樂桶是一種可樂和威士忌的新喝發,就是簡單的威士忌混可樂,但是真的不要隨便嘗試哦。
  • 抖音hls是什麼意思?Helens可樂桶調酒配方與你分享
    抖音hls是什麼意思?Helens可樂桶調酒配方與你分享時間:2020-12-06 15:00   來源:手遊之家   責任編輯:沫朵 川北在線核心提示:原標題:抖音hls是什麼意思?Helens可樂桶調酒配方與你分享 抖音hls是很多人都聽到的一個詞語,很多人都不知道這個是什麼意思,其實這個就是一種特殊的酒,主要是威士忌和可樂,對於很多人來說都是非常有意思的,作為一種雞尾酒飲品是比較符合大眾的口味的,下面小編帶   原標題: 抖音hls是什麼意思?
  • Adsp-TS101性能分析及其在雷達信號處理中的應用
    Adsp-TS101是64位處理器,工作在250 MHz時鐘下,可進行32位定點和32位或40位浮點運算,提供最高1500 MFLOPS(Millions of floating-pointoperations per second,每秒執行百萬次浮點操作)的運算能力;內部具有6 M位雙口 SRAM,同時集成了I/O處理器,加上內部總線,消除了I/O瓶頸。
  • 比拼浮點運算速度 超算排行榜是這樣「算」出來的
    大多數處理器中,都有專門處理浮點運算的浮點運算單元(FPU),FLOPS就是浮點運算單元的執行速度。」錢銀中說。中國高性能計算重點研發專項總體組組長、中山大學數據科學計算機學院院長錢德沛表示,選用浮點運算速度作為超算運算能力的評價標準,是因為科學工程計算軟體中包含了大量的浮點數運算,浮點運算速度快的計算機通常也能夠更快運行相關的科學工程計算軟體。
  • 數學之美:平方根倒數速算法中的神奇數字 0x5f3759df
    來看看平方根倒數速算法:float FastInvSqrt(float x) {  float xhalf = 0.5f * x;  int i = *(int*)&x;         // evil floating point bit level hacking  i =
  • 漂移農場 floating farm
    本屆上海世博會中國船舶館中,科學家向人們展示了中國造船業的主要成就,以及未來新概念:漂移農場船。文中的floating farm就是指「漂移農場」。漂移農場船上可以種植蔬菜水果、養殖家禽魚類以及進行食物加工等,還可以進行sea water desalinization(海水淡化),提供生產用水和飲用水。
  • Xilinx FPGA支持MIPI接口的兩種方式
    MIPI分為CSI(Camara sensor interface)與DSI(Display interface) 電氣特性1.low power model 0-1.2V 單端電壓;2.high-speed model 0.1-0.3差分 jedec xilinx
  • 關於Xilinx FPGA如何獲取FPGA的Device DNA
    Evening 發表於 2021-01-02 09:44:00 作者:Evening Xilinx每一個FPGA都有一個獨特的ID,也就是Device DNA,這個ID相當於我們的身份證,在FPGA晶片生產的時候就已經寫死在晶片的eFuse寄存器中,
  • Xilinx、Spline.AI、AWS 推出 X 射線分型深度學習模型和參考設計
    通過採用這樣的開源設計,醫療診斷設備、臨床設備製造商以及醫療服務提供商能夠快速地為行動裝置、可攜式設備或護理點邊緣設備中的大量臨床應用和放射醫學應用開發和部署經過訓練的模型,並提供向雲端擴展的選項。 賽靈思核心市場業務部市場營銷與業務開發副總裁 Kapil Shankar 表示:「AI 是醫療行業中發展速度最快、需求最強勁的應用領域。因此,能夠向業界推出這種自適應的開源解決方案,我們感到十分高興。這種低成本的解決方案兼具低時延、高能效和可擴展能力。
  • In pics: morning fog floating above Yarlung Zangbo River in...
    Aerial photo taken on Dec. 2, 2020 shows morning fog floating(Xinhua/Tang Tao)Aerial photo taken on Dec. 2, 2020 shows morning fog floating above the
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    1.1 FIF0數據緩存器  在該設計方案中選擇FIFO作為數據存儲器,這是因為一旦多路接收機有數據輸出,就會啟動FIFO進行存儲,進而FIFO的不空信號有效(empty=O),觸發後續的矩陣運算;否則,運算停止