白皮書

加速 2D FFT

在 Stratix 10 MX 上使用 HBM2 和 oneAPI

概述

當演算法包括「轉彎」時,具有 HBM2 記憶體的 FPGA 比 GPU 晶片更快。這是因為FPGA可以將轉角操作與計算重疊,從延遲的角度來看,它“免費”。我們使用2D FFT演示該技術,並在下面提供原始程式碼。為了保持“公平”,該代碼使用 GPU 也支持的數據類型。FPGA 可以輕鬆處理任何數據類型。 

BittWare之前使用英特爾的OpenCL編譯器為FPGA創建了一個2D FFT內核。現在,我們重寫了該代碼,以利用英特爾的 oneAPI 程式設計模型,特別是其 DPC++ 程式設計語言。我們在 520N-MX 卡上實現了類似的性能。英特爾正在推廣 oneAPI 作為需要 GPU 或 FPGA 加速的應用程式的最佳工具鏈。

我們為什麼要實施2D FFT?

2D FFT經常出現在FPGA IP庫中,因此程式師通常不是自己實現的。然而,並行硬體上 2D FFT 的常見實現策略涉及“轉彎”或“數據轉置”步驟,這會對 CPU 和 GPU 造成主要的性能瓶頸。

自由轉彎

我們在此演示中強調的見解是,FPGA實現可以與計算並行執行數據轉置,從延遲的角度來看,它幾乎“免費”。

GPU 無法執行相同的操作,因為 GPU 架構在 GPU 內部沒有足夠的記憶體來管道中間結果,而無需接觸 HBM2/GDDR6 記憶體。

使用帶有拐角轉彎的一維 FFT 的兩個通道實現的 2D FFT 的圖示。

使用 oneAPI 在 FPGA 上使用 HBM2

Stratix 10 MX具有32個偽HBM2記憶體通道。我們的 2D FFT 實現使用了這些通道的一半。
  • 我們可以在晶元中放置兩個 2D FFT 內核。一個內核使用晶元北側的所有偽通道介面。 另一個使用南側的通道。
  • 嘗試在單個 2D FFT 中使用所有 32 個通道會產生我們不想在演示代碼中處理的路由挑戰。
每個 2D FFT 內核消耗的 MX2100 FPGA DSP 資源約為 30%。

每個 FPGA HBM2 通道一行

2D FFT 是使用許多 1D FFT 實現的。單個 1D FFT 使其使用的 HBM2 通道飽和。通過 16 個 HBM2 通道,我們的 2D FFT 實現並行處理 1024 行矩陣中的 16 行。 高端 GPU 可能一次處理所有 1024 行。FPGA 需要 64 次通過。但是,通過次數無關緊要,因為HBM2 / GDDR6頻寬是這兩種情況下的限制因素。

400 MHz Fmax 就足夠了

我們需要一個 400 MHz 的 OpenCL 時鐘頻率來飽和每個 HBM2 通道,從而獲得最佳的 32 位元組突發。走得更快是沒有價值的。走得慢一點不是最佳選擇。英特爾目前實施的DPC++利用了BittWare現有的OpenCL板支援包。因此,這兩種實現在FPGA中看起來都像OpenCL。兩種實現都需要相同的調整才能實現400 MHz。這些調整只是在原始程式碼中以不同的方式表達。

一維FFT輸出

1D FFT 不會將結果直接輸出到 HBM2 中。相反,它寫入FPGA內部記憶體。額外的 FPGA 邏輯 收集多個 1D FFT 的結果,將這些結果轉彎,然後將它們寫回 HBM2,所有這些都與計算並行。

一維FFT延遲啟動

我們不會在同一時鐘周期內啟動16個1D FFT。相反,我們將它們的起點錯開一個複雜的元素。這樣做允許我們將 1D FFT 結果流線到拐角轉彎邏輯中。

32 位元組 突發

我們需要等待四個 1D FFT 的輸出,以便能夠以 32 位元組塊將轉置數據寫入 HBM。

使用 oneAPI 輕鬆程式設計

BittWare的開發團隊使用RTL(Verilog和VHDL),HLS(主要是C++),OpenCL和現在的DPC++。 我們之前發佈過一份 比較RTL和HLS的白皮書。這個專案是我們第一次有機會將OpenCL與DPC++進行比較。

我們很高興地報告,從 FPGA 的 OpenCL 代碼遷移到 FPGA 的 DPC++ 很容易。FPGA和HBM2封裝記憶體的適配與OpenCL版本非常相似。 在主機上移動數據非常簡單。我們甚至從NumPy調用了我們的2D FFT內核,我們從未嘗試過使用OpenCL版本。

用於 FPGA 加速的 oneAPI 概述視頻

其他詳細資訊

內部記憶體備用

我們使用512個M20K記憶體(MX2100的12.5%)。

二維FFT參數

為 FPGA 實現的 FFT 長度通常在比特流編譯時設置。

  1. 我們的演示使用固定的 1024 x 1024 複雜 32 位浮點數矩陣。
  2. 我們的FFT實現交錯了複數的分量(而不是使用單獨的實數和虛部矩陣)。
  3. 對齊並不重要,因為數據被複製到 HBM 記憶體中,在那裡它將變為 32 位元組對齊。

一維FFT實現

我們實現了自己的1D FFT(而不是使用某人的FPGA IP庫)。1D FFT 是基數 2 並且完全流水線。它不在位。

性能

2D FFT 性能將始終受到 HBM2 頻寬的限制。因此,我們的重點是找到一種演算法,使我們能夠最大化HBM2頻寬。這也意味著我們可以使用 HBM2 頻寬基準測試來準確估計 FFT 性能。

批次 1 實現的峰值 HBM2 性能為 291 GB/秒,在同一設備中有兩個獨立的內核。流水線/批處理時,峰值頻寬可達 337 GB/秒

結論

我們很高興能夠快速將我們的 2D FFT 從 OpenCL 版本移植到 oneAPI。雖然優化支援 HBM2 的 FPGA 卡的方法的工作已經完成,但它仍然為基於 OpenCL 的使用者提供了一條極好的途徑,可以在 BittWare 硬體上遷移到 oneAPI,同時將影響降至最低。

在 FPGA 上使用 HBM2 在某些應用中具有一些顯著的優勢,例如我們在這裡看到的。如果您正在尋找有關我們提供的代碼的更多資訊,請使用下面的表格與我們聯繫以查詢可用性,或了解有關BittWare的 520N-MX FPGA卡 的更多資訊。

請求原始程式碼

您可以通過填寫此表單來請求開源 TAR 檔。 您將收到的代碼具有開原始圖例。

如何使用代碼:

我們將OneAPI 2D FFT編譯成一個Linux動態連結的共享物件庫。只需鍵入「cmake .」即可創建該庫。

我們從一個簡單的 NumPy 腳本調用該庫,該腳本創建一些輸入數據,然後驗證或繪製輸出。鍵入「python runfft.py」以查看圖形。

上述軟體在 Centos 8 上使用英特爾 OneAPI 工具 Beta 10 版本進行了測試,使用 BittWare 520N-MX 卡託管 MX2100 FPGA。該卡發佈的OpenCL板支援包還允許OneAPI工作

*”表示必填欄位

姓名*
請檢查這是一封有效的電子郵件,因為PDF將使用此地址發送。
位址和城市*