歡迎大家關注我的微信公眾賬號,支持程序媛寫出更多優秀的文章
硬件加速是指利用硬件模塊來替代軟件算法以充分利用硬件所固有的快速特性。
硬件加速實質上是通過增加運算並行性達到加速的目的的。
常常采用流水線和硬件復制的方法。
1 流水線
1.1 適合流水線的場景
如果某個設計的處理流程分為若干步驟,而且整個數據處理是“單向流”的,前一個步驟的輸出是下一個步驟的輸入,則可以考慮采用流水線設計的方法來提高系統的工作頻率。
流水線的各個步驟處理由功能單一的各個單元完成,當數據沿着流水線方向依次通過所有功能單元時,即完成了所有的數據處理並輸出。
由於流水線上各個功能單元能夠並行工作,故只要保證下一功能單元的輸入是上一功能單元的輸出,則所有功能單元並行工作可以保證整個流水線的正常工作,而無需等到整個流水線吹了結束后才開始下一份數據的處理,進而保證數據充滿了所有功能單元,提高了處理速率。
1.2 使用流水線的原因
所謂流水線(pipeline)設計,以汽車工業中的 流水生產線 舉例說明。
在汽車生產的時候,假設分為 5 個階段,每個階段都需要 1 個工人花費 1 小時完成,因為后續的階段必須等前面階段完成后才能進行,所以如果一個人來工作時,總共需要 5 個小時才能完成一輛汽車。采用流水線方式,即在生產線上安排5個人每人負責一個階段的任務,在進行后續階段時,前面的階段可以進行新的工作,那么每個小時都可以生產出一輛汽車了,生產效率提高了 5 倍。
可以看到,流水線之所以可以大大提高效率的原因在於:傳統的方式,某個階段進行時,其他階段是空閑等待的,浪費時間;而流水方式中,在處理后續階段時,前面的階段可以進行新的加工,每時每刻,每個工人都是在工作的,這就是流水線能提高生產效率的原因。
在電路上第一種方法就是總共有一個寄存器(reg1),單第二種方法會使用五個寄存器(reg1、reg2、reg3、reg4、reg5)
流水線設計就是將組合邏輯系統地分割,並在各個部分(分級)之間插入寄存器,並暫存中間數據的方法。
目的是將一個大操作分解成若干的小操作,每一步小操作的時間較小,所以能提高頻率,各小操作能並行執行,所以能提高數據吞吐率(提高處理速度)。
1.3 簡單的流水線例子
采用流水設計的方法就是:在較長的組合邏輯路徑中插入 DFF(D觸發器),將其分割為幾個小的組合邏輯,新的 Tlogic 顯然小於原來的 Tlogic,所以系統的時鍾頻率就可以提高了。
舉例來說明:設計一個電路完成 i = (a + b + c + d) + (e + f + g + h) 運算。
下面是沒有流水的設計:
第一級 DFF 到第二級 DFF 之間數據路徑的時延為:
Tff
= Tco + Tlogic = Tco + 3*Tadder
下面是插入兩級流水的設計:
現在相鄰的兩級 DFF 之間的組合邏輯只有 1 級加法器,而不是原來的 3 級,這時數據路徑的時延為:
Tff = Tco + Tlogic = Tco + Tadder
顯然,采用流水后 Tff 更小,系統能夠達到的工作時鍾頻率也就更高。數據傳輸時除了第一個數據的所耗時間為3*Tff ,其它數據所用時間均為Tff。
2 硬件復制
在某些FPGA設計中,需要很多重復設計的時候,這時候邏輯復制也就有用了。邏輯復制也可以說是並行計算,簡單的說就是把相同的計算進行堆積,提高單位周期內的計算吞吐能力。
針對現在的神經網絡計算展開說明硬件復制的高效之處。
比如說一個 3*3*ic*oc 的卷積核(kernel)對特征圖(input feature map)進行卷積操作,即對應位置的點進行相乘相加計算,得出一個通道所有的點的計算過程,需要拿 同一個特征圖 和 oc個不同的3*3*ic卷積核 進行相同,因為計算模式相同,所以可以采取硬件復制的方式。
這樣,就是等於復制了 oc 個計算模塊,同時進行 oc 個並行計算,一次計算得到 oc 個輸出。
3 總結
利用流水線的設計方法,可大大提高系統的工作速度。
這種方法可廣泛運用於各種設計,特別是大型的、對速度要求較高的系統設計。
雖然采用流水線會增大資源的使用,但是它可以降低寄存器間的傳播延時,保證系統維持高的系統時鍾速度。
在實際應用中,考慮到資源的使用和速度的要求,可以根據實際情況來選擇流水線的級數以滿足設計需要。
這是一種典型的以面積換速度的設計方法。這里的“面積”主要是指設計所占用的FPGA邏輯資源數目,即利用所消耗的觸發器(FF)和查找表(LUT)來衡量。“速度”是指在芯片上穩定運行時所能達到的最高頻率。面積和速度這兩個指標始終貫穿着FPGA的設計,是設計質量評價的最終標准。