賽靈思 FPGA 器件主要由可編程邏輯架構組成,能讓應用設計人員利用空間和時間并行性,最大化算法性能或大型應用中關鍵內核的性能。位于這種架構核心的是由基于查找表的邏輯元、分布式存儲器單元和乘法-累加單元構成的陣列。設計人員可以用不同方式組合這些元件,把邏輯實現在算法中,同時滿足功耗、吞吐量和時延方面的設計目標要求。把 FPGA 架構元件組合為邏輯功能一直是硬件工程人員的工作范疇,這個過程更類似于匯編層面的編碼,與現代軟件設計實務相去甚遠。雖然常用軟件設計流程早已脫離匯編編碼的層面,但由于 CPU 編譯和 FPGA 編譯之間內在的差異,FPGA 設計實踐的發展步伐要緩慢一些。
在 CPU 和 GPU 領域,硬件是固定的,所有的程序均根據靜態指令集架構 (ISA) 編譯。雖然 CPU 和 GPU 之間的 ISA 不同,但基本的底層編譯方法是相同的。這種相似性促使設計實踐從手動匯編編碼向使用 OpenCL C、C 和 C++ 等軟件開發常用的編程語言進行編譯、調試和優化的設計流程發展演化。
在 FPGA 設計方面,設計人員能夠為運行特定工作負載開發自己的處理架構。FPGA 的一大重要優勢就是能夠根據特定系統需求定制架構,但這不利于 FPGA 應用開發中采用軟件開發實踐方法。
六年前賽靈思開始積極的研發工作,通過開發一種把直觀的軟件開發設計循環引入 FPGA 的開發環境,來打破這一障礙。面向 OpenCL C、C 和 C++ 的賽靈思 SDAccel 能夠讓 FPGA 器件的應用編譯、調試與優化方式類似于 CPU 和 GPU 的流程,而且在用于數據中心應用加速時,可將性能功耗比提升高達 25 倍。
軟件設計人員可以使用 SDAccel 開發環境開發和加速眾多功能與應用。下面介紹如何使用 SDAccel 環境實現中值濾波器應用的編譯、調試與優化設計循環。
中值濾波器
中值濾波器是一種常在圖像處理中用于降噪目的的空間函數(圖 1)。中值濾波器使用的算法用圍繞中心像素的 3x3 像素窗口,根據所有相鄰像素的中值計算中心像素值。這一計算公式為:
outputPixel[i][j] =
median (
inputPixel[i-1][j-1],
inputPix- el[i-1][j],
inputPixel[i-1][j+1],
inputPixel[i][j-1],
inputPixel[i] [j],
inputPixel[i][j+1],
inputPixel[i+1][j-1],
inputPixel[i+1][j],
inputPixel[i+1][j+1]
) ;
編譯
運用 OpenCL C 等語言編寫中值濾波器函數后,就進入開發的第一個階段——編譯。在 CPU 或 GPU 上,編譯是軟件設計流程中的一個必要的也是必然的步驟。目標 ISA 是固定而公開的,編程人員只需關心可用的處理內核數量和算法的高速緩存缺失情況。FPGA 編譯更像一個開放問題:在編譯時目標 ISA 并不存在,邏輯資源還有待組合成處理架構,系統存儲器架構也尚未定義。
SDAccel 開發環境中的編譯器提供三項功能,可幫助編程人員應對如下這些挑戰:自動在循環內的語句間和跨循環迭代提取并行性、根據對陣列的讀寫模式自動調用存儲器架構、以及對給定 FPGA 器件內部基本邏輯元的類型和數量的架構感知能力。這三項功能對中值濾波器的源代碼的重要性見圖示(圖 2)。
中值濾波器的運算可以表達為由一系列由兩個部分組成的嵌套循環。第一個部分負責從名為“輸入”的外部存儲器中陣列取出數據,然后把值存儲在本地陣列“RGB”中。算法第二個部分是一個圍繞 getMedian 函數的“for”循環。getMedian 就是計算發生的位置。
通過分析圖 2 中的代碼,SDAcell 環境認為 RGB 陣列上不存在循環-承載數據依賴關系。每次循環迭代都有一個專有 RGB 副本,這個副本可以存儲在不同物理資源上。從這個代碼看出的 SDAccel 環境的另一大特點是對 getMedian 函數調用的獨立性。
圖 2 所示的算法版本在帶有固定邊界的“for”循環內部執行 getMedian 函數。根據濾波器的性能目標和所選的 FPGA,SDAccel 環境可以跨所有三個通道重復利用計算資源,或是分配更多邏輯,實現空間并行性,同時運行所有通道。這項決定相應地會影響如何為陣列 RGB 實現存儲器存儲。
從應用編程人員的角度出發,上述步驟是透明的,可視為 GNU 編譯器套件 (GCC) 中的–O1 到 –O3 優化。
SDAccel 環境中的 printf 設計無需耗用額外邏輯資源即可提供此項功能。
調試
軟件開發的一條公理就是應用編譯不等同于應用正確。只有在應用在目標硬件上開始運行之后,編程人員才能開始發現、追蹤和糾正應用中的錯誤,換句話說進行調試。
CPU 應用的調試是一個容易理解的問題,商業廠商和開源社區提供有大量工具來解決這個問題。FPGA 再度成為另類。應用編程人員如何才能調試好創建用于實現一段代碼的功能的軟件,使之實現既定性能目標呢?
SDAccel 開發環境借鑒了 CPU 環境的兩個概念——printf 和 GDB 調試——來解決這個問題。
printf 功能是軟件編程人員工具箱中的基本工具。每一種編程語言都會提供 printf 功能,用于顯示程序執行過程中主要應用變量的狀態。對 CPU 器件而言,這就同監測寄存器狀態一樣簡單。printf 功能不占用硬件資源。
就 FPGA 的情況來說,實現 printf 可能會消耗本可用于實現邏輯功能的邏輯資源。在 SDAccel 環境中實現 printf 無需消耗額外的邏輯資源即可提供此項功能。該環境是通過將 printf 數據生成獨立于解碼和用戶表示層來實現的。就硬件資源而言,為 printf 生成數據會占用幾個寄存器,在寄存器豐富的 FPGA 架構中這完全可以忽略不計。數據解碼在針對 FPGA 的驅動程序中完成。通過讓主機 CPU 執行 printf 的數據解碼和表示層,軟件編程人員可以在基本不占用 FPGA 資源的情況下使用 printf。
從 CPU 借鑒的第二個調試技巧是使用 GNU 項目調試器 (GDB) 等工具,在代碼中各處插入斷點和單步執行。編程人員可以使用 SDAccel 環境的仿真模式,將 GDB 連接到正在運行的仿真流程。該仿真流程是對開發人員準備在 FPGA 器件上執行的專用硬件的仿真。在仿真流程環境下,GDB 能夠觀察各種變量的狀態,在代碼各處插入斷點和單步執行。從應用編程人員的角度,這與 GDB 在 CPU 上工作的方式完全相同。
優化
完成編譯和調試后,軟件開發周期的下一步是優化應用。在 FPGA 上進行應用優化的原理與在 CPU 上優化應用一致。唯一差別在于方法不同。對 CPU 來說,需要細調應用代碼,使之適應處理器的高速緩存和算術單元的邊界。在 FPGA 中,計算邏輯是為當前應用定制匯編的。因此決定優化約束的是 FPGA 的大小和應用的目標性能。
使用 SDAccel 的軟件編程人員可以借助邏輯架構的靈活性,不必了解有關硬件設計的細節,即可構建高性能、低功耗應用。
SDAccel 環境的編譯器能自動優化計算邏輯。編程人員可通過對從代碼調用的數據傳輸模式的分析來協助自動優化工作。圖 3 所示的是輸入和輸出過程中發生的中值濾波器代碼與存儲器之間的讀寫事務處理。
圖中的每條垂直線代表一個到存儲器的事務處理。綠條所示的是中值濾波器函數的活動時間。從圖中可以看出,雖然中值濾波器一直處于活動狀態,存儲器事務處理之間存在明顯的間隔。這些間隔代表的是中值濾波器從一個事務處理切換到下一個事務處理所使用的時間。由于每項對存儲器的事務處理只訪問一個值,事務處理之間的間隔說明該應用存在嚴重的性能瓶頸。
解決該性能問題的途徑之一是在應用代碼中明示地聲明從外部存儲器到本地存儲器的突發事務處理。圖 4 所示的代碼片段使用了 OpenCL C 語言內核采用的 async_work_group_copy 函數。這項功能的目的是通知編譯器每項對存儲器的事務處理都是一個包含多重值的突發事件。這樣能夠更高效率地利用目標器件上的可用存儲器帶寬,并減少對存儲器的事務處理總數。在圖 4 的代碼中,async_work_group_copy 函數把 DDR 存儲器中輸入圖像的全部行內容提交給內核數據路徑內的存儲器。圖 5 中的存儲器事務處理跡線體現了使用 async_work_group_copy 的結果。如圖 5 所示,在存儲器事務處理發生之前內核有一個建立時間,但這并沒有體現在中值濾波器的原始代碼中(圖 2)。
這部分建立時間差異用于處理從代碼中衍生出的邏輯。在圖 2 的原始代碼中,應用立即啟動對存儲器的單次事務處理,然后等待數據可用。與此相反,圖 4 中的優化代碼能判斷是否需要進行存儲器事務處理或是否內核的本地存儲器中的數據已經可用。它還能讓生成的邏輯背對背地調度存儲器事務處理和覆蓋讀寫事務處理。
不管最終器件是 CPU 還是 FPGA,特性分析都是應用開發過程中的主要組成部分。SDAccel 環境的可視化和分析器功能能讓應用編程人員從內核占用、存儲器事務處理和存儲器帶寬利用率等方面對代碼修改和應用要求進行特征描述。
由編譯、調試和優化操作建立的設計環路是軟件開發流程的基礎。SDAccel 開發環境使用類似于 CPU 開發環境的工具和技巧來實現這一設計環路,同時基于 FPGA 的應用加速可將性能功耗比提升 25 倍,時延則縮短 50 至 75 倍。使用 SDAccel,軟件編程人員無需了解有關硬件設計的所有細節,就能夠充分發揮 FPGA 邏輯架構的靈活性,從而開發出高性能、低功耗應用。
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603039 -
可編程邏輯
+關注
關注
7文章
515瀏覽量
44083
發布評論請先 登錄
相關推薦
評論