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