異構(gòu)計(jì)算是指不斷增長的一類系統(tǒng),其中應(yīng)用程序在不同的處理器和加速器設(shè)備的混合上執(zhí)行以最大化吞吐量。在這種系統(tǒng)上執(zhí)行程序需要一種編程范式,該范式向應(yīng)用程序開發(fā)人員提供一致的系統(tǒng)視圖。OpenCL 框架是為解決異構(gòu)計(jì)算系統(tǒng)的需求和挑戰(zhàn)而創(chuàng)建的行業(yè)標(biāo)準(zhǔn)。
在最基本的層面上,OpenCL 框架為應(yīng)用程序程序員提供了與設(shè)備供應(yīng)商無關(guān)的平臺定義和跨所有實(shí)現(xiàn)該標(biāo)準(zhǔn)的設(shè)備的單一內(nèi)存模型。這些特性使 OpenCL 程序員能夠?qū)W⒂谡陂_發(fā)的應(yīng)用程序的核心挑戰(zhàn),而不是特定計(jì)算設(shè)備的特定細(xì)節(jié)。
OpenCL 框架的第一個(gè)組件是平臺,它定義了可用于執(zhí)行程序的資源。在一個(gè) OpenCL 平臺中,總是有一個(gè)主機(jī)處理器和至少一個(gè)加速設(shè)備。主機(jī)處理器負(fù)責(zé)將作業(yè)分派給加速器以及啟動主機(jī)/加速器內(nèi)存?zhèn)鬏?。此主機(jī)始終使用 CPU 實(shí)現(xiàn),加速器可以是 CPU、GPU 或 FPGA。這些加速設(shè)備的控制是通過一組通用的 API 函數(shù)來實(shí)現(xiàn)的,這些 API 函數(shù)是 OpenCL 標(biāo)準(zhǔn)的一部分。
加速設(shè)備上的作業(yè)采用內(nèi)核執(zhí)行的形式。內(nèi)核是運(yùn)行在加速設(shè)備上的應(yīng)用程序的計(jì)算功能。OpenCL 中的一個(gè)應(yīng)用程序可能有一個(gè)或多個(gè)內(nèi)核,每個(gè)內(nèi)核的特點(diǎn)是表達(dá)一個(gè)數(shù)據(jù)并行操作。例如,圖 1 顯示了將在 CPU 上執(zhí)行的程序轉(zhuǎn)換為適合 OpenCL 的數(shù)據(jù)和任務(wù)并行表示。
圖 1:從順序到 sata 和任務(wù)并行應(yīng)用程序
在圖 1 中代碼的順序版本中,函數(shù) f、g 和 h 在“for”循環(huán)內(nèi)執(zhí)行。每個(gè)函數(shù)將數(shù)據(jù)集 X 和 Y 作為輸入源并產(chǎn)生一個(gè)輸出 T,它不會被“for”循環(huán)內(nèi)的任何其他函數(shù)消耗。因此,代碼的順序版本中的循環(huán)可以分配給函數(shù) f、g 和 h,以創(chuàng)建應(yīng)用程序的任務(wù)并行表示,如圖 1 的中心列所示。如果函數(shù) f、g 和 h 的每次調(diào)用獨(dú)立于上一個(gè)和下一個(gè)調(diào)用,則應(yīng)用程序是任務(wù)和數(shù)據(jù)并行的,如圖 1 的右側(cè)列所示。函數(shù) f、g 或 h 的每次調(diào)用代表加速設(shè)備執(zhí)行的一個(gè)工作項(xiàng)。根據(jù)可用的計(jì)算資源,
除了為應(yīng)用程序員提供與設(shè)備無關(guān)的數(shù)據(jù)并行編程模型外,OpenCL 還提供了統(tǒng)一的內(nèi)存模型層次結(jié)構(gòu),如圖 2 所示。
圖 2:OpenCL 內(nèi)存模型
在模型的應(yīng)用層,內(nèi)存空間分為主機(jī)內(nèi)存和設(shè)備內(nèi)存。與設(shè)備相關(guān)的內(nèi)存進(jìn)一步分為三個(gè)層次結(jié)構(gòu),包括全局內(nèi)存、本地內(nèi)存和私有內(nèi)存。全局內(nèi)存由連接到設(shè)備的內(nèi)存組件(如 SDRAM)創(chuàng)建。映射到全局內(nèi)存的緩沖區(qū)的管理由主機(jī)代碼應(yīng)用程序通過使用 OpenCL API 函數(shù)來處理。OpenCL API 函數(shù)用于確定緩沖區(qū)的大小以及對緩沖區(qū)的讀寫訪問。在 OpenCL 內(nèi)存模型支持的所有內(nèi)存類型中,請務(wù)必記住,全局內(nèi)存是容量最大、延遲最長的內(nèi)存,
OpenCL 和 FPGA
FPGA 可以在制造后針對不同的算法進(jìn)行編程,如圖 3 所示,具有執(zhí)行邏輯操作的查找表 (LUT)、存儲 LUT 結(jié)果的觸發(fā)器 (FF) 以及元件之間的連接和 I/O 焊盤,用于將數(shù)據(jù)輸入和輸出 IC。當(dāng)代 FPGA 架構(gòu)包含額外的計(jì)算 (DSP)、數(shù)據(jù)存儲 (BRAM)、高速串行收發(fā)器和片外存儲器控制器塊。這些元素的組合為 FPGA 提供了為給定軟件工作負(fù)載實(shí)現(xiàn)自定義邏輯的靈活性。
圖 3:FPGA 的基本結(jié)構(gòu)
在 OpenCL 的上下文中,由于內(nèi)核代碼的數(shù)據(jù)并行特性,F(xiàn)PGA 架構(gòu)非常適合這種工作負(fù)載。與其他能夠執(zhí)行 OpenCL 內(nèi)核的設(shè)備不同,F(xiàn)PGA 架構(gòu)可以使用針對特定內(nèi)核完全優(yōu)化的內(nèi)核進(jìn)行定制,從而允許內(nèi)核執(zhí)行的并行性隨 FPGA 設(shè)備的大小而擴(kuò)展。
在加速器計(jì)算單元上執(zhí)行的 OpenCL 應(yīng)用程序內(nèi)核。計(jì)算單元是指執(zhí)行內(nèi)核功能中的操作的處理器內(nèi)核或加速器邏輯。
SHA-1 算法
SHA-1 算法是最常用的加密哈希函數(shù)之一。使用這些功能確保和檢查數(shù)據(jù)完整性的能力已經(jīng)成為在線簽名和作為電子商務(wù)解決方案核心的安全套接字層 (SSL) 的基礎(chǔ)。該函數(shù)非常適合 FPGA,因?yàn)樗峭ㄟ^ 80 輪處理對 512 位數(shù)據(jù)集的與、異或、旋轉(zhuǎn)、加法或移位操作組成的。每輪計(jì)算中使用的 512 位數(shù)據(jù)負(fù)載可以并行或塊方式計(jì)算。
圖 4:用于 SHA-1 的 FPGA 計(jì)算單元
SHA-1 功能的 FPGA 實(shí)現(xiàn)如圖 4 所示。在此設(shè)計(jì)中,關(guān)鍵元素是創(chuàng)建自定義計(jì)算單元,以包含計(jì)算單個(gè) SHA-1 所需的 80 輪處理。通過將所有 80 輪處理分組到同一個(gè)處理邏輯中,應(yīng)用程序設(shè)計(jì)人員可以最大限度地減少與標(biāo)準(zhǔn) CPU 實(shí)現(xiàn)所需的高速緩存或內(nèi)存元素的交互。這反過來又增加了此功能的吞吐量并降低了維持所達(dá)到的吞吐量所需的功耗。下表總結(jié)了 FPGA 實(shí)現(xiàn)與 CPU 實(shí)現(xiàn)的優(yōu)勢:
對于此比較,英特爾 Haswell CPU 有 12 個(gè)內(nèi)核,能夠執(zhí)行任何 OpenCL 內(nèi)核代碼,但未針對任何特定工作負(fù)載進(jìn)行優(yōu)化。相比之下,F(xiàn)PGA 實(shí)現(xiàn)有 16 個(gè)內(nèi)核優(yōu)化為僅執(zhí)行 SHA1 工作負(fù)載。加速器計(jì)算單元定制級別的差異直接轉(zhuǎn)化為該工作負(fù)載的兩個(gè)設(shè)備之間的性能差異。
Xilinx FPGA 結(jié)果是通過使用適用于 OpenCL、C 和 C++ 的 SDAccel 開發(fā)環(huán)境編譯 SHA1 算法并在 Xilinx Virtex 7 器件上運(yùn)行生成的二進(jìn)制程序生成的。SDAccel 利用 FPGA 為數(shù)據(jù)中心應(yīng)用程序加速提供高達(dá) 25 倍的性能功耗比,并結(jié)合了業(yè)界第一個(gè)支持 OpenCL、C 和 C++ 內(nèi)核的任意組合的架構(gòu)優(yōu)化編譯器,以及庫、開發(fā)板和第一個(gè)完整的 CPU/GPU類似 FPGA 的開發(fā)和運(yùn)行時(shí)經(jīng)驗(yàn)。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1630文章
21799瀏覽量
606194 -
cpu
+關(guān)注
關(guān)注
68文章
10908瀏覽量
213084 -
OpenCL
+關(guān)注
關(guān)注
2文章
48瀏覽量
33391
發(fā)布評論請先 登錄
相關(guān)推薦
評論