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