Floating-Point設計編碼風格與技巧

2020-12-11 電子發燒友

Floating-Point設計編碼風格與技巧

George Wang 發表於 2017-11-22 15:20:01

儘管通常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];
}
return acc_part[0];
}

打開APP閱讀更多精彩內容

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

相關焦點

  • 編碼風格不是編碼規範
    編碼風格很容易會和編碼規範混為一談,因為這兩個詞經常會被人換著使用。我認為,編碼規範同時包括了編碼風格和其它規範,不僅僅指代碼格式。例如,像「返回成功/失敗的函數應該用一個整數作為返回值」,這樣的規則不屬於編碼風格。在這篇文章中,編碼風格簡單的指一個描述如何格式化代碼的說明。
  • 裝修十大風格概念 裝修風格設計技巧是什麼
    裝修風格設計技巧是什麼?裝修十大風格概念各設計風格同時對應了不同的生活方式:現代前衛對應另類;現代簡約對應時尚;雅致對應優雅(閒雅);新中式對應懷舊;新古典對應高貴;歐式古典對應華麗(奢華);美式鄉村對應休閒(自然);地中海對應浪漫。
  • 田園風格種類有哪些 田園風格設計技巧有什麼
    目前,很多家庭會選擇田園風格進行裝修,比較美觀、清新,然而很多人對它也並不了解。那麼田園風格種類有哪些?田園風格設計技巧有什麼?PChouse就帶大家來了解一下吧。
  • 絕美中式風——新中式家裝風格設計有什麼技巧?
    中式的沉穩大氣和西式的時尚流行碰撞出了新中式,新中式風的盛行嚴格說起來已經好幾年了,而且這兩年愈加流行,今年的家裝風格翹楚,非新中式和輕奢莫屬,其實新中式被越來越多消費者選擇正式國人對中式傳統文化的另一種繼承,新中式家居也是很傳統時尚的延伸,今天,我們來說說新中式家裝風格設計有什麼技巧
  • 五筆打字技巧分享,漢字的編碼基礎
    我們學習五筆打字,我們首先要學習漢字的編碼基礎,我們要明白漢字是如何通過五筆打字的。漢字的編碼基礎首先我們要明白字根的含義,字根是由筆畫交叉而成的相對固定的結構,比如漢字「苦」,它是由「艹」和「古」構成,而「艹」和「古」就叫做字根。
  • ...morning fog floating above Yarlung Zangbo River in Tibet
    Aerial photo taken on Dec. 2, 2020 shows morning fog floating above the Yarlung Zangbo River in Medog County, southwest
  • FPGA設計風格經驗談
    在進行FPGA設計時,有很多需要我們注意的地方。具有好的設計風格才能做出好的設計產品,這一點是毋庸置疑的。那麼,接下來,小編就帶大家一起來看看,再進行FPGA設計時,我們都要注意哪些呢?A-Z是一個規則;7使模塊名、實例名和文件名相同;二.編碼風格記住,一個好的代碼是其他人可以很容易閱讀和理解的。
  • Floating 不只是"浮動" | 外貿英語
    這次我們就來講講floating 這個詞。 例一:...that the world saw a return to the exchange rate system. Central banks were no longer required to support their own currencies. 在這種情況下,世界各國又恢復浮動匯率就不足為奇了。
  • 【吳慧專欄】《數字編碼》教學設計
    (報警電話)3.像110這樣,將數字或者字母按照一定的規則排列,用來表達一定含義的,我們把它稱為編碼。(完成板書:數字既可以表示數量和順序,也能用來表示編碼。)編碼能表達一定的信息。今天,我們一起來學習《數字編碼》。
  • 圖像編碼:面向色彩意象的設計再現
    徐博群  劉肖健浙江工業大學  設計藝術學院《創意之代碼》已經發過很多色彩相關的文章了,這篇關注的重點是「編碼」,對圖像進行編碼。所以對同一個事物,可以有多種不同的編碼:就像我們描述一個點的位置可以有直角坐標、極坐標等不同的方式;我們觀察一個機械零件有前視圖、側視圖、頂視圖,還可以有局部剖。選對坐標或找準觀察角度,可以讓問題的解決方案變得簡單,這就是「編碼設計」的作用。這篇文章面對的問題是:設計師如何把一幅滿意的圖像的色彩意象用於設計,並希望設計方案的色彩能再現圖像中那些令人滿意的色彩特徵。
  • PHP編碼風格規範詳細介紹
    由於PHP的靈活性,很多人寫起代碼來也不講求一個好的代碼規範,使得本就靈活的PHP代碼看起來很亂,其實PSR規範中的PSR-1和PSR-2已經定義了在PHP編碼中的一些規範
  • Floating Christmas Tree Beams Peace in Violent City
    The lights are blazing from the world's largest floating Christmas tree -- a gigantic metal structure as tall as a 27-storey tower block set on a lagoon
  • Verilog HDL設計進階:有限狀態機的設計原理及其代碼風格
    由於寄存器傳輸級(RTL)描述是以時序邏輯抽象所得到的有限狀態機為依據的,所以把一個時序邏輯抽象成一個同步有限狀態機是設計可綜合風格的Verilog HDL模塊的關鍵。在本章中我們將通過各種實例由淺入深地來介紹各種可綜合風格的Verilog HDL模塊,並把重點放在時序邏輯的可綜合有限狀態機的Verilog HDL設計要點。
  • 帶你走進編碼的世界——Unicode編碼
    美國人發明了計算機,設置了最早的編碼,他們只將數字、大小寫英文字母及一些符號一共128個字符編碼到計算機中。這套編碼表就是著名的ASCII編碼表,例如大寫字母A的二進位編碼為01000001,十進位編碼為65,十六進位編碼為41;小寫字母a的二進位編碼為01100001,十進位編碼為97,十六進位編碼為61。
  • 哈爾濱鳴雀裝飾 北歐風格裝修技巧!年輕人最喜愛的家裝設計!
    什麼是北歐風格: 北歐風格融合了歐洲丹麥、挪威、芬蘭等國家的建築設計風格,與追求潮流時尚的理念有別,北歐風格更加注重裝飾本身的實用性能,一切人性化設計為出發點
  • FPGA設計小技巧(時鐘/性能/編程)
    打開APP FPGA設計小技巧(時鐘/性能/編程) FPGA技術聯盟 發表於 2020-12-11 10:26:44 FPGA儘量採取同步設計,也就是所有時鐘都是同一個源頭,如果使用兩個沒有相位關係的異步時鐘,必須要解決跨時鐘域問題。 性能篇 邏輯級的時延不要超過時序預算的百分之五十,否則會影響系統的運行頻率。可以通過分析時序報告中某個路徑的時序統計量來掌握系統的邏輯級時延。
  • 愛奇藝編碼團隊:我們讓AV1編碼速度提升5倍
    愛奇藝綜藝《青春有你》THE9成團編者按:如果說VVC是編碼標準中的白富美,那麼AV1就代表了廣大的網際網路玩家——承受不起高昂的專利版稅。為了實現免專利費的目標,AV1不得不「捨近求遠」的方式躲開已有的專利,這導致其計算複雜度非常高。愛奇藝科學家王志航透露,在同等的畫質下,編碼速度是開源SVT-AV1的5倍。
  • Tableau 技巧(121):用 Makepoint 和 Makeline 函數實現連線地圖
    尤其是通過 Makepoint 和 Makeline 函數製作連線地圖,是我最感興趣的技巧之一。《舉個慄子》的老朋友們,對第 68 號慄子肯定不陌生:製作連線衝蝕雙軸地圖(內附 完整中國地圖 方法)。這個慄子是 @棒棒的東 在 2018 年投稿的,那時候,想實現連線地圖(如下圖),必須把數據結構改為特定形式,並且操作步驟也較為複雜。
  • excel 小技巧如何將雜亂的商品編碼變為統一編碼
    在系統中導出來的商品編碼長度不一,比較雜亂,那麼該如何快速將這些雜亂的商品編碼變為統一長度的商品編碼呢?打開「商品資料表」數據表,如圖所示,含有「商品名稱」及"商品編碼「相關信息,我們需要將雜亂的商品編碼變為統一長度規格的商品編碼。
  • COCO2018 Keypoint冠軍算法解讀
    下面先上一個我們模型的視頻結果:COCO2018 Keypoint算法結果展示。Background人體關鍵點檢測(Human Keypoint Detection)又稱為人體姿態識別,旨在準確定位圖像之中人體關節點的位置,是人體動作識別、人體行為分析、人機互動的前置任務。