


摘要:快速傅里葉變換(FFT)是信號處理應用的基礎。FPGA供應商一直以來提供了運行良好的FFT庫,處理適配到FPCJA片內存儲器中的大量數據。但是,如果數據規模太大,應該如何應對?為解決這一問題,FPGA設計人員現在必須要做出設計決定,這些決定互相糾纏在一起,例如,片內FFT內核的配置選擇,其數量,它們怎樣連接并訪問外部存儲器,多個內核之間的同步等。分析所有這類設計決定就是要能夠很好的結合現有產品,在HDL中編程,這會非常耗時,而且帶來了性能問題。采用OpenCL等高級編程語言,能夠很快的完成系統設計分析。本文將研究在目前FPGA體系結構上實現1M和16M點數的頻域濾波器,支持從每秒120到240百萬采樣的不同采樣率。本文研究一個2M點數單精度頻域濾波器的示例,該示例選擇OpenCL作為其設計決定。假設讀者熟悉FPGA設計,掌握OpenCL的基本概念。本文網絡版地址:http://www.eepw.com.cn/article/281882.htm
關鍵詞:FPGA;頻域濾波器;OpenCL
DOI:10.3969/j.issn.1005-5517.2015.10.006
引言
本文介紹構建一個百萬點數單精度頻域濾波器。這類濾波器使用百萬點數1D FFT,將每一個頻率和相位分量與用戶提供的數值相乘,使其輸入轉換到頻域,并通過FFT反變換,再把結果轉換回時域。在目前一代FPGA和兩個DDR3外部存儲器塊平臺上,對于兩百萬點采樣,整個系統的性能總要求是每秒處理1.50億點(MSPS)。輸入和輸出通過萬兆以太網直接傳送給FPGA。
對于這一設計,本文選擇使用Altera OpenCL SDK,在安裝了StratixV GSD8 FPGA的BittWare S5-PCIe-HQ電路板上運行FPGA編譯器。出于兩個原因,選用OpenCL而不是更底層的語言。第一個原因是設計幾百萬點數的濾波器需要構建復雜而且非常高效的外部存儲器系統。采用底層設計工具,建立片內FFT或者進行對角旋轉的獨立模塊相對簡單(特別是因為所有FPGA供應商已經提供了含有這類模塊的庫)。但是,建立外部存儲器系統通常需要付出大量的HDL工作。由于在開始時并不知道整個系統的配置,因此這特別難,在后面會看到。選擇OpenCL的第二個原因是通過主機控制FPGA邏輯。從開始時就清楚兩個完整的幾百萬點的FFT內核副本無法適配到一個器件中,因此,在獲得最終輸出之前,一組數據至少要通過FPGA邏輯兩次。協調這類共享同時還要實現動態修改數據規模、乘法系數,甚至完全修改FPGA功能等,這些工作最好留給CPU。為FPGA提供的OpenCL編譯器解決了所有這些難題——它開發可定制的高效的外部存儲器系統,能夠精確地控制FPGA邏輯。
1.片內FFT
假設已經有一個FFT內核,處理的數據長度完全能夠適配到FPGA中(將其稱之為“片內FFT”),每一家FPGA供應商都會提供此類內核。至少可以采用以下方式對這些內核配置參數:
1.數據類型f定點或者單精度浮點);2.要處理的點數,N;3.要并行處理的點數,POINTS;4.動態支持修改要處理的點數。
有了這類片內FFT內核后,需要兩個步驟來構建整個系統:開發一個能夠處理幾百萬點數的FFT內核,然后,把兩個這類內核連接在一起,它們之間是復數乘法,從而建立完整的系統。
2.幾百萬點FFT
采用外部存儲來實現FFT的傳統方法是六步算法[1],把一個一維數組當做兩維來處理(2M= 2KxlK),如圖1所示。
圖1畫出了六步算法,顯示了單獨的計算內核以及外部存儲器緩沖。“獲取”內核讀取來自外部存儲器的數據,以選擇對其進行轉置,將其輸出至通道(在OpenCL 2.0術語中,也稱之為“管道”)。在硬件中,以FIFO來實現通道,其深度由編譯器計算。“片內1D FFT”是未經修改的供應商的FFT內核,接收輸入,使用通道產生比特反轉輸出。“轉置”是將從輸入通道讀取的數據轉置,可以選擇將其與特殊的旋轉因子相乘,以自然順序把輸出寫入到外部存儲器。
正如您從圖1中所看到的,數據兩次通過獲取→1D FFT→轉置(FIT)流水線,產生最終輸出。留給第一個最重要的設計選擇采用一個FIT流水線副本以節省面積,或者兩個副本以盡可能的提高吞吐量。
在仿真器中對這一算法進行原型設計,以便能夠正確的處理轉置地址以及旋轉因子。仿真器將OpenCL內核編譯至x86-64二進制文件,可以運行在沒有FPGA的開發板上。從仿真器到硬件編譯是比較簡單的步驟——仿真器中功能正確的代碼在硬件中也是正確的,不需要仿真。出于性能和面積的原因,唯一要修改的是獲取和轉置內核所使用的本地存儲器系統。高效的轉置需要在本地存儲器中對數據POINTS列/行進行緩沖。OpenCL編譯器分析您OpenCL代碼中對本地存儲器的所有訪問,并通過創建一個定制的片內存儲系統來優化你的代碼。對于POINTS=4的情況,最初的轉置內核有四次寫和四次讀操作。一個雙泵的片內RAM模塊最多可以服務四個獨立的申請,其中最多兩次寫操作。為支持四次寫和四次讀操作,需要復制片內存儲器,含有申請仲裁邏輯,導致面積增大,性能下降。當認識到可以通過修改寫模式,來連續進行所有四次寫操作后,這四次寫操作被OpenCL編譯器分成一組,成為一次寬寫操作,這樣,只需要對本地存儲器系統訪問五次:一次寫操作,四次讀操作。進行了這一修改后,編譯器自動為構建一個小很多的五端口存儲器系統,在每一時鐘周期可以服務所有五個申請,不會出現停頓。
設計被編譯到硬件中后,可以進行性能測量。在FPGA上有一個FIT流水線副本,對于四百萬點FFT,測得了POINTS=4時,217MSPS,POINTS=8時,457 MSPS[2]。POINTS=8版本使用了兩次,因為這一配置中大量的片內模塊RAM和兩個副本無法適配。這就是要研究的第一個設計范圍——要并行處理的點數和面積。
3.全濾波器設計
現在,有了一個幾百萬點的FFT,準備好將整個設計合在一起。把兩個片外FFT連接在一起,得到圖2所示的流水線邏輯視圖。
除了復制一個片外FFT計算流水線,還將以下部件加入到系統中:
1.頻域的復數乘法被加入到第三個FIT模塊中。coef緩沖保存了兩百萬復數乘法系數。
2.增加了I/O輸入和I/O輸出內核,對萬兆以太網通道上的外部存儲器負載進行逼真的建模。采用這些內核,能夠繼續純軟件開發,在內核計算流水線完全優化好之后,再集成以太網通道。I/O輸入內核在每一時鐘周期產生一個采樣,I/O輸出每一時鐘周期占用一個采樣。
正如片外FFT試驗所示,只能適配兩個FIT模塊,采用POINTS=4。因此,要完成全部計算,數據要通過硬件兩次。對于2M點數,系統總吞吐量只有120 MSPS,低于目標150MSPS。通過把數據長度減小到1M點,能夠適配POINTS=8版本,吞吐量達到198 MSPS。這表明,只要能夠讓POINTS=8版本適配2M點數,就還能提高性能!
在圖2中,找出全流水線的優化結構是整個設計過程的下一步。首先能夠提高的是去掉tmp3緩沖。兩邊都以同樣的方式訪問它(轉置寫和讀操作)。因此,可以通過通道把第二和第三個FIT模塊直接連接起來。這要求轉置內核將其輸出寫入到外部存儲器中,或者通道中,獲取內核也是相似的修改。這類修改是由主機動態控制的,因此,可以使用獲取內核的一個物理例化。注意,這改變了與外部存儲器的連接。但是,根本不用對此擔心——OpenCL編譯器已經為系統生成了高效的定制外部存儲器互聯。
進一步的改進是,把第二個轉置“T”從寫到tmpl改為從tmpl讀(tmpl中的數據以不同的方式存儲,但是效果一樣)。這樣,轉置就不需要本地存儲器緩沖了。
原來是通過兩級來實現轉置的:第一,所需的數據被裝入到本地存儲器中,然后,使用轉置地址從本地存儲器讀取。為高效的使用這類流水線,OpenCL編譯器自動將本地存儲器系統的緩沖加倍。以這種方式,流水線的裝入部分能夠將數據裝入到一個副本中,而讀部分能夠從另一副本讀取以前的數組。自動雙緩沖非常適合的轉置算法,但是太昂貴了。相反,重新編寫轉置內核。這一內核只需要一個緩沖,支持同時讀寫多個數據點。對這一轉置內核的介紹已經超出了本文的范圍。
經過以上修改后,能夠采用POINTS=8配置適配2M點的FFT,吞吐量達到164 MSPS。
4.調度
只能適配FIT的兩個副本。圖3顯示了怎樣調度數據流,以便完全利用流水線。注意,在穩定狀態下,流水線交替處理第二和第三組數據,不需要額外的緩沖。由CPU上運行的主程序控制這種調度,使用動態分析工具進行驗證。
5.緩沖分配
在OpenCL系統中,主程序控制了包含那個緩沖區的DDR塊。DDR塊只要不是同時讀寫,在讀操作或者寫操作時的效率最高,因此,在兩個DDR塊之間按以下原則來分配5個緩沖:
DDR塊#O分配input和tmp2。
DDR塊#1分配tmpl、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://wwwaItera.com/support/support-resources/design-exaples/design-software/opencl/fft-1d-offchip.html