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