使用面向FPGA的OpenCL設計兩百萬點頻域濾波器
除了復制一個片外FFT計算流水線,還將以下部件加入到系統(tǒng)中:
本文引用地址:http://2s4d.com/article/281882.htm1. 頻域的復數乘法被加入到第三個F1T模塊中。coef緩沖保存了兩百萬復數乘法系數。
2. 增加了I/O輸入和I/O輸出內核,對萬兆以太網通道上的外部存儲器負載進行逼真的建模 。采用這些內核,能夠繼續(xù)純軟件開發(fā),在內核計算流水線完全優(yōu)化好之后,再集成以太網通道。I/O輸入內核在每一時鐘周期產生一個采樣,I/O輸出每一時鐘周期占用一個采樣。
正如片外FFT試驗所示,只能適配兩個F1T模塊,采用POINTS=4。因此,要完成全部計算,數據要通過硬件兩次。對于2M點數,系統(tǒng)總吞吐量只有120 MSPS,低于目標150 MSPS。通過把數據長度減小到1M點,能夠適配POINTS=8版本,吞吐量達到198 MSPS。這表明,只要能夠讓POINTS=8版本適配2M點數,就還能提高性能!
在圖2中,找出全流水線的優(yōu)化結構是整個設計過程的下一步。首先能夠提高的是去掉tmp3緩沖。兩邊都以同樣的方式訪問它(轉置寫和讀操作)。因此,可以通過通道把第二和第三個F1T模塊直接連接起來。這要求轉置內核將其輸出寫入到外部存儲器中,或者通道中,獲取內核也是相似的修改。這類修改是由主機動態(tài)控制的,因此,可以使用獲取內核的一個物理例化。注意,這改變了與外部存儲器的連接。但是,根本不用對此擔心——OpenCL編譯器已經為系統(tǒng)生成了高效的定制外部存儲器互聯。
進一步的改進是,把第二個轉置“T”從寫到tmp1改為從tmp1讀(tmp1中的數據以不同的方式存儲,但是效果一樣)。這樣,轉置就不需要本地存儲器緩沖了。
原來是通過兩級來實現轉置的:第一,所需的數據被裝入到本地存儲器中,然后,使用轉置地址從本地存儲器讀取。為高效的使用這類流水線,OpenCL編譯器自動將本地存儲器系統(tǒng)的緩沖加倍。以這種方式,流水線的裝入部分能夠將數據裝入到一個副本中,而讀部分能夠從另一副本讀取以前的數組。自動雙緩沖非常適合的轉置算法,但是太昂貴了。相反,重新編寫轉置內核。這一內核只需要一個緩沖,支持同時讀寫多個數據點。對這一轉置內核的介紹已經超出了本文的范圍。
經過以上修改后,能夠采用POINTS=8配置適配2M點的FFT,吞吐量達到164 MSPS。
4 調度
只能適配F1T的兩個副本。圖3顯示了怎樣調度數據流,以便完全利用流水線。注意,在穩(wěn)定狀態(tài)下,流水線交替處理第二和第三組數據,不需要額外的緩沖。由CPU上運行的主程序控制這種調度,使用動態(tài)分析工具進行驗證。
5 緩沖分配
在OpenCL系統(tǒng)中,主程序控制了包含那個緩沖區(qū)的DDR塊。DDR塊只要不是同時讀寫,在讀操作或者寫操作時的效率最高,因此,在兩個DDR塊之間按以下原則來分配5個緩沖:
? DDR塊#0分配input和tmp2。
? DDR塊#1分配tmp1、coef和out。
給DDR塊分配一個緩沖就是在OpenCL主程序中修改一行代碼。編譯器和底層平臺完成其他任務。能夠自動完成這一過程,在2-DDR和4-DDR電路板上進行了試驗,為每一塊電路板找到緩沖到存儲器塊的最佳映射。
6 結論
在本文中,介紹了怎樣使用為FPGA提供的Altera OpenCL SDK,設計2M點數頻域濾波器。使用軟件類型的仿真對所有功能進行了驗證。每一個硬件編譯都能夠正確工作。并沒有打開硬件仿真器,也不用擔心時序收斂問題。
參考文獻:
[1]D. H. Bailey. FFTs in external of hierarchical memory Proc. of ACM/IEEE Conf. on Supercomputing’89 (SC89), 1989, 234-242
[2]FFT (1D) Off-Chip Design Example.[EB/OR] https://www.altera.com/support/support-resources/design-examples/design-software/opencl/fft-1d-offchip.html
評論