520N-MX PCIe卡圖片

白皮書

加速 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 記憶體。

2D FFT 轉角圖
使用帶有拐角轉彎的一維 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 結果流線到拐角轉彎邏輯中。

1 FFT 延遲啟動圖示

32 位元組 突發

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

32 位元組突發圖示
oneAPI 徽標

使用 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將使用此地址發送。
位址和城市*