曾亞 周琦 章杰
摘要:OpenCL作為異構(gòu)系統(tǒng)下程序設(shè)計(jì)的主流架構(gòu)之一,已經(jīng)在大量異構(gòu)計(jì)算系統(tǒng)中應(yīng)用。由于異構(gòu)系統(tǒng)最初的用途是用于在計(jì)算機(jī)系統(tǒng)中加速數(shù)值計(jì)算,設(shè)計(jì)人員在OpenCL框架下編寫的模塊大部分是用于數(shù)值計(jì)算,以及與數(shù)值計(jì)算息息相關(guān)的圖像處理。本文介紹一種通過OpenCL搭建CPU模塊的方法。CPU功能模塊可在部分情況下分擔(dān)或接管異構(gòu)系統(tǒng)中部分CPU的工作。同時(shí)在一些支持可重構(gòu)架構(gòu)的異構(gòu)系統(tǒng)中,CPU模塊可以替代異構(gòu)系統(tǒng)中的CPU,這大大增加了異構(gòu)系統(tǒng)的靈活度。本文涉及的CPU模塊兼容MIPS32指令集。
關(guān)鍵詞:OpenCL;異構(gòu)系統(tǒng);CPU設(shè)計(jì);MIPS
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2018)02-0160-02
近年來,隨著單個(gè)CPU的各方面性能都達(dá)到了極限,只靠單個(gè)或者多個(gè)通用處理器(以下簡稱CPU)來提高計(jì)算機(jī)系統(tǒng)性能的解決方案已經(jīng)不適用了。專用協(xié)處理器配合CPU的組合方式成了現(xiàn)在增強(qiáng)計(jì)算機(jī)系統(tǒng)性能的主要途徑,“CPU+專用協(xié)處理器”構(gòu)建的異構(gòu)系統(tǒng)成了當(dāng)前大規(guī)模數(shù)據(jù)處理的首選解決方案。不過,由于異構(gòu)系統(tǒng)本身最初是用于解決計(jì)算機(jī)系統(tǒng)數(shù)值計(jì)算過慢的問題,也使得異構(gòu)系統(tǒng)中幾乎大部分模塊都是直接用于數(shù)值計(jì)算,造成了異構(gòu)系統(tǒng)在實(shí)際應(yīng)用中也僅限于用在與數(shù)值計(jì)算息息相關(guān)的圖像處理,信號處理,神經(jīng)網(wǎng)絡(luò)等方面。
OpenCL全稱Open Computing Language,是指開放計(jì)算語言,用于編寫在異構(gòu)平臺上執(zhí)行的程序。作為現(xiàn)在流行的異構(gòu)系統(tǒng)編程框架,可以讓異構(gòu)系統(tǒng)的應(yīng)用可以不局限于數(shù)值計(jì)算中,也可用于非數(shù)值運(yùn)算中。系統(tǒng)中協(xié)處理器不僅可以通過使用高級語言進(jìn)行編程,而且OpenCL把協(xié)處理器與主處理器(大部分情況下由CPU擔(dān)任)統(tǒng)一在一個(gè)框架下編程,這使得兩者的數(shù)據(jù)交換變得非常簡便與靈活。在某些狀況下,協(xié)處理器可以承擔(dān)主處理器的工作,分?jǐn)偵踔两庸苤魈幚砥鞯墓ぷ?,主處理器只要把?shù)據(jù)直接送入?yún)f(xié)處理器即可。這不僅拓寬了異構(gòu)系統(tǒng)的使用范圍,也減輕了主處理器的負(fù)擔(dān)。特別是異構(gòu)系統(tǒng)中如果支持協(xié)處理器可重構(gòu)功能,那異構(gòu)系統(tǒng)的使用范圍可以大大增加。
本文通過OpenCL架構(gòu),設(shè)計(jì)一個(gè)在“CPU+GPU”的異構(gòu)系統(tǒng)中能夠運(yùn)行的CPU模塊。此模塊兼容開源的MIPS32指令集,易于理解與掌握,方便設(shè)計(jì)人員應(yīng)用。選擇MIPS架構(gòu)的理由是,MIPS架構(gòu)源代碼公開,相關(guān)資料豐富,易于理解與掌握?,F(xiàn)在不少大學(xué)本科計(jì)算機(jī)專業(yè)課中,通過MIPS架構(gòu)來講解計(jì)算機(jī)系統(tǒng)原理架構(gòu),甚至部分大學(xué)的“微機(jī)原理與接口技術(shù)”課程中的用MIPS CPU代替老舊的8086CPU。
1 異構(gòu)系統(tǒng)架構(gòu)概述
1.1 OpenCL基本介紹
OpenCL(Open Computing Language,中文名為開放計(jì)算語言)是一個(gè)在異構(gòu)系統(tǒng)中設(shè)計(jì)應(yīng)用的框架,目的是方便在異構(gòu)系統(tǒng)下編寫程序的,此異構(gòu)系統(tǒng)可通過CPU、GPU、DSP、FPGA或其他類型的處理器與硬件加速器所組成。(見圖1)
OpenCL平臺模型定義了使用OpenCL的一種高層模式,這個(gè)模型如圖1所示。這平臺包括一個(gè)宿主機(jī)(圖1中的Host),設(shè)備就是執(zhí)行指令流的地方。因此OpenCL的設(shè)備通常被稱為計(jì)算設(shè)備(圖1中的Compute Device),計(jì)算設(shè)備可以是GPU、FPGA等任何OpenCL架構(gòu)下支持的任意處理器。
OpenCL的運(yùn)行步驟比較復(fù)雜。基本上分為以下步驟:
(1)初始化階段,獲取設(shè)備信息,創(chuàng)建上下文(用于協(xié)調(diào)主機(jī)以及計(jì)算設(shè)備與主機(jī)的一種交互機(jī)制)。
(2)創(chuàng)建內(nèi)存對象,然后創(chuàng)建程序?qū)ο?,同時(shí)生成內(nèi)核對象。內(nèi)存對象存儲(chǔ)內(nèi)核執(zhí)行數(shù)據(jù),程序?qū)ο蠹闯绦蛟次募蛘叨M(jìn)制代碼數(shù)據(jù)。內(nèi)核對象是設(shè)備程序的入口。
(3)配置內(nèi)核參數(shù),并配置工作數(shù)組的組織形式。同時(shí)將內(nèi)核對象,以及工作數(shù)組參數(shù)放入命令隊(duì)列中送入?yún)f(xié)處理器中執(zhí)行。
(4)返回執(zhí)行結(jié)果,并釋放資源,程序結(jié)束。
1.2 CPU模塊基本介紹
由于本文編寫的是CPU模塊,在這里需要簡單講解一下CPU的工作原理。
CPU的主要運(yùn)作原理是執(zhí)行儲(chǔ)存在內(nèi)存中里的一系列指令。CPU工作架構(gòu)有馮·諾伊曼結(jié)構(gòu)(von Neumann architecture)以及哈佛結(jié)構(gòu)(Harvard architecture),由于MIPS架構(gòu)屬于馮·諾伊曼結(jié)構(gòu)(von Neumann architecture)架構(gòu),因此本文只討論馮·諾伊曼結(jié)構(gòu)的運(yùn)行方式。馮·諾伊曼CPU的運(yùn)作原理可分為五個(gè)階段:提取、解碼、執(zhí)行、訪存和寫回(見圖2)。
提?。篊PU自動(dòng)地從存儲(chǔ)器取出指令。為此,CPU能夠知道取出指令的存儲(chǔ)器地址,提取階段中的存儲(chǔ)器地址可以是生成,也可以是指令指定。
解碼:CPU對從存儲(chǔ)器取出的指令進(jìn)行分析。指令分析有2個(gè)部分:1.指令中的操作命令,即需要CPU進(jìn)行什么操作。2.指令中的操作數(shù)地址,即操作數(shù)的有效地址。
執(zhí)行:從解碼階段中獲取“操作命令”以及“操作數(shù)地址”后,形成控制型號,通過對CPU內(nèi)各個(gè)部件的控制,完成指令操作。
訪存:CPU會(huì)訪問內(nèi)存(或者高速緩存)訪問內(nèi)存讀或者寫數(shù)據(jù)。
寫回:CPU把完成執(zhí)行階段的結(jié)果寫入對應(yīng)的存儲(chǔ)器地址中。這一步是CPU執(zhí)行的最后一個(gè)階段。
2 CPU功能模塊設(shè)計(jì)
通過上文的講解,我們知道了OpenCL的結(jié)構(gòu)以及CPU模塊的運(yùn)作原理。OpenCL最簡單的工程通常有2類文件:.c以及.cl文件,.c文件運(yùn)行于主處理器上,.cl文件運(yùn)行于協(xié)處理器上。由于在本文的工程中,主CPU的功能就是用于輸送CPU模塊的二進(jìn)制命令,所以CPU模塊的編寫集中于.cl文件中。
2.1 CPU模塊整體概述
CPU模塊的對外接口需要盡量與實(shí)際CPU保持一致,這樣能夠方便設(shè)計(jì)人員能快速熟悉模塊使用。CPU模塊對外接口主要分兩塊:指令與數(shù)據(jù)。它們各自有相同功能的輸入輸出接口變量。而這些輸入輸出接口為以下這些:
clk:時(shí)鐘信號
rst:復(fù)位信號
int_i[6]:外部硬件中斷輸入
data_i[32]:輸入數(shù)據(jù)
ack_i:輸入響應(yīng)
addr_o[32]:輸出地址
data_o[32]:輸出數(shù)據(jù)
we_o:輸出使能信號
2.2 CPU模塊內(nèi)部功能實(shí)現(xiàn)
CPU模塊內(nèi)部依照CPU執(zhí)行步驟進(jìn)行區(qū)分,分為提取、解碼、執(zhí)行、訪存和寫回 這五個(gè)部分。
提取部分:主要功能是從對應(yīng)指令地址取出指令。代碼實(shí)現(xiàn)上,是通過把指令變量上獲取的指令代碼賦到內(nèi)部變量中。同時(shí)把指令地址變量指向下一個(gè)地址。
解碼部分:主要功能是解析指令,從指令中解析出操作類型,所需的源操作數(shù),要寫入的目的寄存器地址等。代碼實(shí)現(xiàn)上,根據(jù)MIPS32指令集對指令代碼進(jìn)行分割,并把數(shù)值賦給對應(yīng)內(nèi)容的代碼。
執(zhí)行部分:主要功能是執(zhí)行指令。代碼實(shí)現(xiàn)上,通過一個(gè)巨大的switch來應(yīng)對MIPS32的各自指令操作,;例如加減乘運(yùn)算(MIPS支持乘法)、移位操作或者邏輯操作。
訪存部分:主要功能是對一些需要執(zhí)行存儲(chǔ)器操作的。代碼實(shí)現(xiàn)上,是把指令執(zhí)行結(jié)果寫到對外接口的變量中。
寫回部分:主要功能是把相關(guān)指令操作的操作數(shù)寫入寄存器。代碼實(shí)現(xiàn)上,是把相關(guān)數(shù)值寫入代表寄存器的內(nèi)容。
3 仿真與功能實(shí)現(xiàn)
CPU模塊在設(shè)計(jì)之時(shí)就需要考慮到模塊驗(yàn)證。本文通過GNU環(huán)境下的MIPS交叉編譯環(huán)境編譯生成MIPS命令文件,本文生成的二進(jìn)制文件是一個(gè)冒泡算法。通過程序?qū)嶒?yàn)證明,CPU模塊能夠正常解析程序命令,能夠得出預(yù)期的實(shí)驗(yàn)結(jié)果。
4 結(jié)語
本文通過OpenCL架構(gòu)編寫在異構(gòu)架構(gòu)中能使用的CPU模塊。此CPU模塊支持完整的MIPS32指令集,并且在支持可重構(gòu)的異構(gòu)系統(tǒng)中,能夠依照需求讓協(xié)處理器能夠?qū)崿F(xiàn)CPU功能。在實(shí)際使用中拓寬了異構(gòu)系統(tǒng)的使用范圍,同時(shí)也豐富了設(shè)計(jì)人員在設(shè)計(jì)異構(gòu)系統(tǒng)的模塊庫。由于當(dāng)前很少有用于非數(shù)值運(yùn)算的異構(gòu)系統(tǒng)模塊,不僅僅上CPU模塊本身的功能拓展(比如把CPU模塊中添加內(nèi)存管理機(jī)制等),適合異構(gòu)系統(tǒng)的非數(shù)值運(yùn)算模塊編寫成了下一階段的工作重點(diǎn)與方向。
參考文獻(xiàn)
[1]薛勃,周玉潔.MIPS32 指令集兼容的CPU模擬器設(shè)計(jì)[J].計(jì)算機(jī)工程,2010,35(1):263-265.
[2]姚英彪,曾憲彬.嵌入式系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)的QtMIPS仿真軟件開發(fā)[J].實(shí)驗(yàn)室研究與探索,2017,36(1):99-103.
[3]葉繼華,郭 帆,余 敏,馬麗紅,陶 玲.Intel X86 系列 CPU 模擬器的研究與實(shí)現(xiàn) [J].江西師范大學(xué)學(xué)報(bào)(自然科學(xué)版). 2007. 31(6): 643-644.
[4]Dominic Sweetman. See MIPS Run[M]. San Francisco, California: Morgan Kaufmann,2006.
[5]范興山,彭 軍,黃樂天.基于OpenCL的FPGA 設(shè)計(jì)優(yōu)化方法研究[J].電子技術(shù)應(yīng)用,2014,40(1):16-19.
[6]Aaftab Munshi, Benedict R. Gaster, Timothy G. Mattson, James Fung, Dan Ginsburg. OpenCL Programming Guide [M]. Boston , Massachusetts. : Addison-Wesley, 2006.