《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 解決方案 > Xilinx Vivado HLS中Floating-Point(浮點(diǎn))設(shè)計編碼風(fēng)格與技巧

Xilinx Vivado HLS中Floating-Point(浮點(diǎn))設(shè)計編碼風(fēng)格與技巧

2013-09-02
作者:王宏強(qiáng) – Xilinx DSP Specialist
關(guān)鍵詞: 開發(fā)工具 Vivado HLS

盡管通常Fixed-Point(定點(diǎn))比Floating-Point(浮點(diǎn))算法的FPGA實(shí)現(xiàn)要更快,且面積更高效,但往往有時也需要Floating-Point來實(shí)現(xiàn)。這是因?yàn)镕ixed-Point有限的數(shù)據(jù)動態(tài)范圍,需要深入的分析來決定整個設(shè)計中間數(shù)據(jù)位寬變化的pattern,為了達(dá)到優(yōu)化的QoR,并且要引入很多不同類型的Fixed-Point中間變量。而Floating-Point具有更大的數(shù)據(jù)動態(tài)范圍,從而在很多算法中只需要一種數(shù)據(jù)類型的優(yōu)勢。

Xilinx Vivado HLS工具支持C/C++ IEEE-54標(biāo)準(zhǔn)單精度及雙精度浮點(diǎn)數(shù)據(jù)類型,可以比較容易,快速地將C/C++ Floating-Point算法轉(zhuǎn)成RTL代碼。與此同時,為了達(dá)到用戶期望的FPGA資源與性能, 當(dāng)使用Vivado HLS directives時需要注意C/C++編碼風(fēng)格與技巧相結(jié)合。

 

  1. 編碼風(fēng)格

1.1      單雙精度浮點(diǎn)數(shù)學(xué)函數(shù)

 

#include

float example(float var)

{

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

}

 

在C設(shè)計中, 這個例子, Vviado HLS 生成的RTL實(shí)現(xiàn)將輸入轉(zhuǎn)換成雙精度浮點(diǎn),并基于雙精度浮點(diǎn)計算自然對數(shù),然后將雙精度浮點(diǎn)輸出轉(zhuǎn)換成單精度浮點(diǎn).

 

#include

float example(float var)

{

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

}

在C設(shè)計中, logf才是單精度自然對數(shù), 這個例子 Vviado HLS 生成的RTL實(shí)現(xiàn)將基于單精度浮點(diǎn)計算自然對數(shù), 而且沒有輸入輸出單雙精度的互轉(zhuǎn)。

 

1.2      浮點(diǎn)運(yùn)算優(yōu)化

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

 

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

{

*m0 = 0.2 * var; // 雙精度浮點(diǎn)乘法,單雙精度類型轉(zhuǎn)換

*m1 = 0.2f * var; // 單精度浮點(diǎn)乘法

*m2 = var / 20.0f; // 單精度浮點(diǎn)除法

}

 

Vivado HLS將日m0, m1, m2綜合成不同的RTL實(shí)現(xiàn)。

因?yàn)?.2是一個不能精確表征的雙精度數(shù)字, 所以m0運(yùn)算會被Vivado HLS綜合成一個雙精度浮點(diǎn)乘法, 并且將var 轉(zhuǎn)換成雙精度, 然后將雙精度乘法輸出m0轉(zhuǎn)換成單精度。

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

 

我們來看另外一個例子。

 

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

{

*m0 = 0.2f * 5.0f * var; // *m0 = var;常數(shù)乘法被優(yōu)化掉

*m1 = 0.2f * var * 5.0f; // 兩個雙精度浮點(diǎn)乘法

}

 

再來看另一個例子。

 

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

{

*m0 = 0.5 * var; //

*m1 = var/2; //

}

m0運(yùn)算會被Vivado HLS綜合成一個雙精度浮點(diǎn)乘法, 并且將var 轉(zhuǎn)換成雙精度, 然后將雙精度乘法輸出m0轉(zhuǎn)換成單精度。

m1運(yùn)算會被Vivado HLS綜合成簡單的右移運(yùn)算。所以如果用戶希望實(shí)現(xiàn)對var除以2, 就寫成m1這種表達(dá)式,而不是m0的表達(dá)式。

 

  1. 并行度與資源復(fù)用

由于浮點(diǎn)運(yùn)算相比整型,定點(diǎn)運(yùn)算耗用更可觀的資源。Vivado HLS會盡量用更有效的資源來實(shí)現(xiàn)浮點(diǎn)運(yùn)算,當(dāng)數(shù)據(jù)的相關(guān)性及約束許可的情況下,在Vivado HLS中,會盡量復(fù)用一些浮點(diǎn)運(yùn)算單元。為了說明這個,我們看一個簡單的四個浮點(diǎn)加法例子, Vivado HLS復(fù)用一個浮點(diǎn)加法器來串行實(shí)現(xiàn)四個浮點(diǎn)加法。

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

float c, float d)

{

*r = a + b + c + d;

}

 

有時設(shè)計需要更高的throughput及更低的latency。這時就需要提高設(shè)計的并行度。以下面例子來說明,在Vivado HLS就需要對for循環(huán)loop加pipeline與unroll 的directives。同時需要通過設(shè)置a,b,r0 為FIFO, 并對其重排以提高I/O帶寬兩倍。這樣Vivado HLS就會綜合出兩個浮點(diǎn)加法來并行實(shí)現(xiàn),這是因?yàn)槊總€加法器計算是完全獨(dú)立的。

 

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];

  }

 

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

這個例子的累加會導(dǎo)致recurrence,并且通常浮點(diǎn)加法的latency大于一個時鐘周期,加的pipeline directive并不能達(dá)到一個時鐘周期完成一次累加的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;

}

 

為了對上面例子并行展開,可以對代碼如下做較小的改動,也就是拆成先部分累加,再最后累加,當(dāng)然也需要對輸入數(shù)據(jù)進(jìn)行簡單的重新排列,以獲得相應(yīng)的I/O帶寬,從而達(dá)到期望的并行度。

 

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];

}

 

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 91免费福利视频| 中文字幕+乱码+中文乱码| 欧美日本高清视频在线观看| 免费看欧美一级特黄a大片| 菠萝蜜视频在线观看| 国产成人三级视频在线观看播放| 久久精品国产99国产| 欧美卡2卡4卡无卡免费| 亚洲香蕉免费有线视频| 精品久久无码中文字幕| 国产一级高清视频免费看| 麻豆国产精品免费视频| 国产熟女AA级毛片| 18无码粉嫩小泬无套在线观看| 成人au免费视频影院| 久久夜色精品国产亚洲| 最新在线黄色网址| 亚洲中文字幕av每天更新| 欧美日韩视频在线第一区| 亚洲精品欧美精品日韩精品| 男人j进入女人p狂躁免费观看| 国产丝袜视频一区二区三区| 黄a大片av永久免费| 国产成视频在线观看| 你懂的网址免费国产| 国产综合无码一区二区色蜜蜜| 一级毛片大全免费播放| 新婚之夜女警迎合粗大| 久久久久久一区国产精品| 日本老头变态xxxx| 久久精品国产91久久综合麻豆自制| 污污的视频在线播放| 免费做暖1000视频日本| 精品人成电影在线观看| 午夜在线视频一区二区三区| 美女被暴羞羞免费视频| 四虎永久在线精品免费影视| 色与欲影视天天看综合网| 国产zzjjzzjj视频全免费| 色视频www在线播放国产人成| 国产欧美专区在线观看|