• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      一種基于國(guó)產(chǎn)異構(gòu)眾核處理器的C++智能源碼轉(zhuǎn)換框架*

      2021-06-25 09:46:06俞茂學(xué)賈東寧魏志強(qiáng)許佳立馬廣浩
      關(guān)鍵詞:神威實(shí)例代碼

      俞茂學(xué),賈東寧,2,魏志強(qiáng),2,許佳立,馬廣浩

      (1.青島海洋科學(xué)與技術(shù)試點(diǎn)國(guó)家實(shí)驗(yàn)室,山東 青島 266237;2.中國(guó)海洋大學(xué)信息科學(xué)與工程學(xué)院,山東 青島 266100)

      1 引言

      超級(jí)計(jì)算機(jī)是當(dāng)前信息時(shí)代世界各主要國(guó)家競(jìng)爭(zhēng)激烈的科技制高點(diǎn),是一個(gè)國(guó)家科技水平和綜合國(guó)力的重要標(biāo)志。中美競(jìng)爭(zhēng)愈演愈烈,超算作為第四次工業(yè)革命的重大基礎(chǔ)設(shè)施,已成為兩國(guó)角力的主要戰(zhàn)場(chǎng)之一,其國(guó)產(chǎn)化已經(jīng)上升為國(guó)家戰(zhàn)略。我國(guó)國(guó)產(chǎn)化處理器以異構(gòu)眾核的申威SW26010為代表,該處理器包含4個(gè)運(yùn)算核組CG(Core Group),每個(gè)核組包括1個(gè)內(nèi)存控制器MC(Memory Controller)和64個(gè)運(yùn)算核心,理論峰值性能達(dá)到125.4 Pflop/s,核心工作頻率1.5 GHz,性能指標(biāo)世界領(lǐng)先[1]。該芯片的架構(gòu)面向高性能計(jì)算,通過(guò)統(tǒng)一指令系統(tǒng)、統(tǒng)一執(zhí)行模型和支持一致性的主存共享,實(shí)現(xiàn)了異構(gòu)核心的深度融合[2]。在基礎(chǔ)軟件生態(tài)方面,已經(jīng)部署完成了神威·太湖之光操作系統(tǒng)神威睿思(RaiseOS 2.0.5),支持Linux系統(tǒng),支持國(guó)際標(biāo)準(zhǔn)的編程語(yǔ)言,如C/C++ /Fortran編譯器以及相適配的向量工具、基礎(chǔ)數(shù)學(xué)庫(kù)等。此外,在并行編程工具方面,主要采用神威OpenACC,兼容OpenACC 2.0標(biāo)準(zhǔn),并添加了部分定制功能[3]。該國(guó)產(chǎn)芯片打破了國(guó)際對(duì)我國(guó)的技術(shù)封鎖,實(shí)現(xiàn)了軟硬件全部國(guó)產(chǎn)定制開(kāi)發(fā)。

      異構(gòu)眾核架構(gòu)雖然具有諸多優(yōu)勢(shì),但在單個(gè)計(jì)算結(jié)點(diǎn)內(nèi)集成了大量不同類(lèi)型的處理器核心,使得體系結(jié)構(gòu)更為復(fù)雜,這給程序設(shè)計(jì)特別對(duì)于多核架構(gòu)的遺產(chǎn)代碼移植帶來(lái)了挑戰(zhàn)。另一方面,當(dāng)前人工智能與大數(shù)據(jù)領(lǐng)域應(yīng)用軟件九成以上是基于x86和GPU開(kāi)發(fā)的,海量的遺產(chǎn)代碼對(duì)移植工作造成了較大困難。采用人工進(jìn)行并行程序編寫(xiě)和優(yōu)化往往具有很高的運(yùn)行效率,但存在成本高、效率低等問(wèn)題。王一超等人[3,4]在神威·太湖之光上完全手工移植了科學(xué)應(yīng)用GTC-P,代碼效率高,但成本也較高。當(dāng)前,國(guó)產(chǎn)眾核架構(gòu)的并行編譯系統(tǒng)無(wú)法支持眾核C++ 編譯,導(dǎo)致大量C++ 遺產(chǎn)程序無(wú)法利用神威·太湖之光的從核加速優(yōu)勢(shì),阻礙了國(guó)產(chǎn)眾核系統(tǒng)的發(fā)展步伐。

      在眾核結(jié)構(gòu)的并行化編譯領(lǐng)域,面向GPU平臺(tái),研究人員針對(duì)并行編譯系統(tǒng)的自動(dòng)移植做了大量工作。Matsumura等人[5]提出了基于OpenACC的普適于多GPU的源-源轉(zhuǎn)換器,通過(guò)識(shí)別GPU類(lèi)型生成不同的OpenACC制導(dǎo)語(yǔ)句。Lashgar等人[6]提出了一種將OpenACC自動(dòng)翻譯成OpenCL(Open Computing Language)和CUDA(Compute Unified Device Architecture)的源-源翻譯工具,將輸入代碼進(jìn)行歸一化處理后,經(jīng)過(guò)中間層X(jué)ML格式分離出主機(jī)代碼和加速代碼,對(duì)加速代碼進(jìn)行轉(zhuǎn)換,形成CUDA和OpenACC代碼。Lee等人[7]實(shí)現(xiàn)了將面向共享存儲(chǔ)結(jié)構(gòu)的OpenMP程序轉(zhuǎn)換成GPGPU程序的自動(dòng)轉(zhuǎn)換和優(yōu)化框架,能夠?qū)⒁延械腛penMP程序移植到GPU眾核平臺(tái)。國(guó)內(nèi)研究主要集中在利用clang編譯前端對(duì)OpenACC進(jìn)行源碼轉(zhuǎn)換的工作上。江霞[8]提出利用clang編譯前端對(duì)Intel Xeon Phi協(xié)處理器進(jìn)行自動(dòng)OpenACC轉(zhuǎn)換。本研究過(guò)程中采用的開(kāi)源ANTLR(ANother Tool for Language Recognition)是一個(gè)功能強(qiáng)大的解析器生成器,用以讀取、處理、執(zhí)行或翻譯結(jié)構(gòu)化文本,被廣泛用于構(gòu)建語(yǔ)言、工具和框架,通過(guò)利用其強(qiáng)大的語(yǔ)法規(guī)則支持,源碼轉(zhuǎn)換的難度被大幅降低。

      C++ 作為面向?qū)ο蟮恼Z(yǔ)言,其關(guān)鍵語(yǔ)言特性為類(lèi)和對(duì)象、模板和泛型設(shè)計(jì)、標(biāo)準(zhǔn)庫(kù)及并發(fā)設(shè)計(jì)[9]。本文針對(duì)這幾個(gè)關(guān)鍵特性,基于ANTLR的源碼翻譯工具,探討其自動(dòng)轉(zhuǎn)換成C語(yǔ)言的原理和可實(shí)現(xiàn)性。針對(duì)科學(xué)運(yùn)算的領(lǐng)域代碼特點(diǎn),對(duì)于較少使用或者轉(zhuǎn)換復(fù)雜的STL(Standard Template Library)庫(kù)函數(shù)等進(jìn)行自動(dòng)標(biāo)注,構(gòu)建了一整套C++ 轉(zhuǎn)換成C語(yǔ)言的輔助轉(zhuǎn)換框架,協(xié)助程序開(kāi)發(fā)人員實(shí)現(xiàn)存量遺產(chǎn)代碼的快速移植。

      本文首先介紹了國(guó)產(chǎn)眾核的并行編譯系統(tǒng)、ANTLR架構(gòu)、面向?qū)ο蠛兔嫦蜻^(guò)程語(yǔ)言的特點(diǎn)及轉(zhuǎn)換要素。在此基礎(chǔ)上,詳細(xì)論述了源碼轉(zhuǎn)換的關(guān)鍵技術(shù),最終將轉(zhuǎn)換后的代碼在神威·太湖之光國(guó)產(chǎn)眾核系統(tǒng)上進(jìn)行了轉(zhuǎn)換代碼的試運(yùn)行。

      2 研究基礎(chǔ)

      2.1 國(guó)產(chǎn)眾核架構(gòu)及并行編譯系統(tǒng)

      神威·太湖之光超級(jí)計(jì)算機(jī)上使用的神威SW26010芯片架構(gòu)如圖1所示,使用64位自主申威指令系統(tǒng),采用片上融合異構(gòu)的體系結(jié)構(gòu),每個(gè)核組內(nèi)64個(gè)從核按照8×8的mesh拓?fù)浣Y(jié)構(gòu),由片上內(nèi)部網(wǎng)絡(luò)互連[2]。眾核處理器體系結(jié)構(gòu)不僅對(duì)科學(xué)工程計(jì)算具有較高的效能和較好的適應(yīng)性,對(duì)雙精度、單精度的矩陣計(jì)算的支持同樣能夠在一定程度上滿足人工智能的關(guān)鍵計(jì)算需求[10]。

      Figure 1 Architecture of Sunway many-core processor

      神威·太湖之光的軟件系統(tǒng)采用定制的64位Linux操作系統(tǒng),由基礎(chǔ)編程語(yǔ)言、并行編程語(yǔ)言和接口、用戶使用環(huán)境、基礎(chǔ)編程環(huán)境和工具等4部分組成,如圖2所示。并行編程支持與國(guó)際接軌的并行編程標(biāo)準(zhǔn),包括MPI 3.0、OpenMP 3.1、Pthreads、OpenACC 2.0,支持消息并行編程模型、共享并行編程模型、加速并行編程模型,滿足科學(xué)與工程計(jì)算課題開(kāi)發(fā)和移植的多樣性需要[11]。

      Figure 2 Software environment composition of Sunway TaihuLight

      并行開(kāi)發(fā)主要采用2種架構(gòu),MPI+Athread和MPI+OpenACC*。其中,Athread直接控制LDM和DMA,可以控制使用所有的硬件功能,需要編寫(xiě)主核、從核程序,改造時(shí)間較長(zhǎng),需要性能細(xì)節(jié)人為可見(jiàn)、可控,需要深刻理解架構(gòu)特點(diǎn),掌握優(yōu)化方法。如劉徐等人[12]對(duì)遺傳算法的并行參數(shù)自動(dòng)尋優(yōu)的研究。OpenACC*可以在短時(shí)間完成移植,并獲得可觀的加速性能,保持跨平臺(tái)的可移植性,在“神威·太湖之光”上獲得了廣泛應(yīng)用。面向申威SW26010異構(gòu)眾核處理器結(jié)構(gòu)特點(diǎn),OpenACC*是在OpenACC 2.0的基礎(chǔ)上進(jìn)行適當(dāng)精簡(jiǎn)和擴(kuò)充構(gòu)建而成的,以編譯指令的方式提供眾核編程所需的語(yǔ)言功能。編譯器為國(guó)產(chǎn)定制的SWACC/SWAFORT。整個(gè)編譯系統(tǒng)的支持情況如表1所示。

      Table 1 Sunway basic compilation command

      2.2 面向?qū)ο笳Z(yǔ)言和面向過(guò)程語(yǔ)言的特點(diǎn)及轉(zhuǎn)換要素

      面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的核心思想是數(shù)據(jù)抽象、繼承和動(dòng)態(tài)綁定。通過(guò)使用數(shù)據(jù)抽象,可以將類(lèi)的接口和實(shí)現(xiàn)分離;使用繼承,可以定義相似的類(lèi)型并對(duì)其相似關(guān)系建模;使用動(dòng)態(tài)綁定,可以在一定程度上忽略相似類(lèi)型的區(qū)別,而以統(tǒng)一的方式使用它們的對(duì)象[13]。面向過(guò)程程序設(shè)計(jì)基于結(jié)構(gòu)化程序設(shè)計(jì)思想,強(qiáng)調(diào)程序結(jié)構(gòu)規(guī)范為順序、選擇和循環(huán)3種基本結(jié)構(gòu)。以算法為核心,把數(shù)據(jù)和操作分離。按照解決問(wèn)題的過(guò)程劃分模塊,集中處理數(shù)據(jù),運(yùn)行效率高。但是,代碼的重用性和可擴(kuò)展性比較差。C語(yǔ)言作為面向過(guò)程的語(yǔ)言更為普及地應(yīng)用于并行計(jì)算。根據(jù)2種完全不同架構(gòu)的語(yǔ)言特點(diǎn),其轉(zhuǎn)換要素主要聚焦于類(lèi)的封裝、繼承和多態(tài),模板和泛型設(shè)計(jì),標(biāo)準(zhǔn)庫(kù)和并行設(shè)計(jì)。

      本文構(gòu)建了C++轉(zhuǎn)換成C語(yǔ)言的輔助開(kāi)發(fā)框架,建立C++轉(zhuǎn)換后的C代碼框架、增加轉(zhuǎn)換標(biāo)注以及建立C轉(zhuǎn)換常用函數(shù)代碼,加速開(kāi)發(fā)人員的移植速度。類(lèi)封裝和繼承的C轉(zhuǎn)換采用C語(yǔ)言的結(jié)構(gòu)體作為類(lèi)轉(zhuǎn)換的目標(biāo),識(shí)別基類(lèi)和繼承類(lèi),并賦予不同的結(jié)構(gòu)體命名規(guī)則。多態(tài)的轉(zhuǎn)換利用多態(tài)規(guī)則的識(shí)別,通過(guò)類(lèi)名和函數(shù)名對(duì)多態(tài)函數(shù)進(jìn)行區(qū)分和重定義。借鑒編譯器處理模板和實(shí)例化的方法,建立模板和實(shí)例化的關(guān)系,并通過(guò)2次語(yǔ)法樹(shù)遍歷解析,實(shí)現(xiàn)了C語(yǔ)言轉(zhuǎn)換。C++作為典型的面向?qū)ο蟮恼Z(yǔ)言,其提供了豐富的STL庫(kù),對(duì)于STL庫(kù)的解析,本文創(chuàng)建了自動(dòng)標(biāo)注及輔助部分C函數(shù)對(duì)應(yīng)實(shí)現(xiàn)的方式。通過(guò)以上設(shè)計(jì),表明了輔助快速移植的可行性和有效性。

      2.3 ANTLR的開(kāi)源翻譯工具

      ANTLR是以PCCTS(Purdue Compiler Construction Tool Set)為基礎(chǔ)構(gòu)建的開(kāi)源工具,致力于解決編譯前端的所有工作。研究表明,ANTLR的語(yǔ)法可以用來(lái)定義模板語(yǔ)言的詞法記號(hào)和語(yǔ)法規(guī)則[14]。該工具可以對(duì)Java、C/C++、C#等語(yǔ)言進(jìn)行語(yǔ)法描述,自動(dòng)生成詞法分析器和語(yǔ)法分析器,將開(kāi)發(fā)人員輸入的程序根據(jù)相對(duì)應(yīng)的編程語(yǔ)言語(yǔ)法規(guī)則轉(zhuǎn)換為抽象語(yǔ)法樹(shù)。在ANTLR強(qiáng)大的支持下,大大降低了源碼轉(zhuǎn)換的難度。首先,采用詞法分析器處理字符序列,并把產(chǎn)生的詞法符號(hào)交給語(yǔ)法分析器。其次,基于以上信息開(kāi)展語(yǔ)法檢查,并構(gòu)建一棵語(yǔ)法分析樹(shù)。在這個(gè)過(guò)程中,使用的ANTLR類(lèi)包括:CharStream、Lexer、Token Stream、Parser和ParseTree。通過(guò)TokenStream,可以把詞法分析器和語(yǔ)法分析器進(jìn)行連接[15],實(shí)現(xiàn)類(lèi)之間的交互,如圖3所示。

      Figure 3 Interaction mode between ANTLR classes

      3 C++代碼輔助智能轉(zhuǎn)換工具的設(shè)計(jì)與實(shí)現(xiàn)

      3.1 總體架構(gòu)設(shè)計(jì)

      在開(kāi)源的C++語(yǔ)法規(guī)則CPP14.g4的基礎(chǔ)上,使用ANTLR對(duì)C++源碼進(jìn)行詞法分析、語(yǔ)法分析和語(yǔ)義分析,生成抽象語(yǔ)法樹(shù),結(jié)合ANTLR自帶的ParseTreeProperty類(lèi),實(shí)現(xiàn)每個(gè)子節(jié)點(diǎn)內(nèi)容的C轉(zhuǎn)換,最終形成目標(biāo)C語(yǔ)言的解析樹(shù)。

      依據(jù)C++的代碼特點(diǎn)和抽象語(yǔ)法樹(shù)的節(jié)點(diǎn)路徑關(guān)系,本文將C++代碼分為5部分進(jìn)行解析:基類(lèi)聲明、繼承類(lèi)聲明、函數(shù)定義、函數(shù)參數(shù)和main函數(shù)。針對(duì)以上不同部分,構(gòu)建區(qū)別化的解析轉(zhuǎn)換流程。

      對(duì)于C++特有的泛型設(shè)計(jì)、引用、運(yùn)算符重載等語(yǔ)法特點(diǎn),本文采用2次語(yǔ)法樹(shù)遍歷解析的方式進(jìn)行轉(zhuǎn)換。在第1次語(yǔ)法樹(shù)遍歷中,獲取模板和實(shí)例化的對(duì)應(yīng)關(guān)系,引用變量名稱(chēng)等關(guān)鍵數(shù)據(jù),同時(shí)構(gòu)建通用的Utility類(lèi),保存關(guān)鍵解析數(shù)據(jù)。在第2次語(yǔ)法樹(shù)遍歷中,使用先前獲取到的關(guān)鍵解析數(shù)據(jù)實(shí)現(xiàn)實(shí)例化的C語(yǔ)言轉(zhuǎn)換。

      以科學(xué)計(jì)算領(lǐng)域常用的STL庫(kù)為研究對(duì)象,進(jìn)行STL庫(kù)的轉(zhuǎn)換。對(duì)頻繁調(diào)用的STL庫(kù),采用預(yù)先完成轉(zhuǎn)換的C語(yǔ)言函數(shù)進(jìn)行替代和重構(gòu)。對(duì)不常用的STL庫(kù)函數(shù)或者C++的特殊用法,創(chuàng)建自動(dòng)標(biāo)注體系輔助開(kāi)發(fā)人員進(jìn)行快速有效識(shí)別,并進(jìn)行替換。

      整個(gè)架構(gòu)設(shè)計(jì)如圖4所示。

      Figure 4 Overall architecture of source code transforms

      3.2 類(lèi)的識(shí)別及結(jié)構(gòu)體轉(zhuǎn)換

      C++的類(lèi)轉(zhuǎn)換成C的結(jié)構(gòu)體聲明,其實(shí)現(xiàn)步驟如下所示:

      (1)基類(lèi)和繼承類(lèi)的劃分。繼承類(lèi)的C轉(zhuǎn)換需要將對(duì)應(yīng)基類(lèi)作為結(jié)構(gòu)體指針變量,從而實(shí)現(xiàn)C++的繼承特性。

      (2)類(lèi)成員通用函數(shù)解析與轉(zhuǎn)換。在C++中,類(lèi)成員函數(shù)中可以直接調(diào)用類(lèi)中的其他成員變量,但對(duì)于C語(yǔ)言而言是非法的。因此,需要在C語(yǔ)言所有類(lèi)成員函數(shù)的參數(shù)中增加此類(lèi)的結(jié)構(gòu)體指針變量,用于類(lèi)成員變量的相互調(diào)用。

      (3)類(lèi)的構(gòu)造函數(shù)解析與轉(zhuǎn)換。構(gòu)造函數(shù)名稱(chēng)需要與類(lèi)名稱(chēng)進(jìn)行區(qū)別化處理,增加Str前綴,且指針化(*Str+函數(shù)名)處理。針對(duì)構(gòu)造函數(shù)使用初始化列表的過(guò)程,需要進(jìn)行2部分轉(zhuǎn)換。首先,對(duì)構(gòu)造函數(shù)的聲明進(jìn)行先行轉(zhuǎn)換;其次,在函數(shù)定義過(guò)程中進(jìn)行初始化列表轉(zhuǎn)換。

      (4)類(lèi)的虛函數(shù)和析構(gòu)函數(shù)的解析與轉(zhuǎn)換。首先,通過(guò)virtual關(guān)鍵字識(shí)別類(lèi)的虛函數(shù)。其次,采用類(lèi)名+變量名組合的形式進(jìn)行函數(shù)名稱(chēng)的轉(zhuǎn)換。然后,在虛函數(shù)參數(shù)中增加結(jié)構(gòu)體指針變量,以解決類(lèi)的多態(tài)轉(zhuǎn)換問(wèn)題。

      (5)類(lèi)成員變量的解析變換。針對(duì)C++中特有的變量,例如String、vector、list等,需要進(jìn)行類(lèi)型轉(zhuǎn)換和標(biāo)注,以滿足轉(zhuǎn)換需求。

      類(lèi)聲明的C結(jié)構(gòu)體轉(zhuǎn)換實(shí)例如圖5所示。

      Figure 5 Example of class structure transforms

      3.3 函數(shù)定義轉(zhuǎn)換

      函數(shù)定義是源碼轉(zhuǎn)換的重要環(huán)節(jié),本文采用預(yù)先設(shè)定的范圍標(biāo)簽進(jìn)行區(qū)別化轉(zhuǎn)換。函數(shù)定義的解析分為2部分:函數(shù)頭和函數(shù)體。函數(shù)定義的轉(zhuǎn)換需要考慮類(lèi)型因素。根據(jù)函數(shù)定義的特點(diǎn),其類(lèi)型主要包含類(lèi)成員函數(shù)、構(gòu)造函數(shù)、虛函數(shù)、析構(gòu)函數(shù)、普通函數(shù)和main函數(shù)等。函數(shù)定義轉(zhuǎn)換的具體過(guò)程如圖6所示。首先,通過(guò)函數(shù)類(lèi)型識(shí)別,查表獲得預(yù)先保存的函數(shù)頭。其次,在函數(shù)體轉(zhuǎn)換中,識(shí)別出構(gòu)造函數(shù)的初始化列表,結(jié)合預(yù)先保存的類(lèi)成員變量對(duì)初始化列表進(jìn)行C轉(zhuǎn)換。解析函數(shù)體中的表達(dá)式的類(lèi)型和關(guān)鍵字,進(jìn)行對(duì)應(yīng)的自動(dòng)標(biāo)注或C轉(zhuǎn)換。最后,組合解析后的函數(shù)頭和函數(shù)體,形成轉(zhuǎn)換后完整的函數(shù)定義。

      Figure 6 C transform process of function definition

      3.4 模板實(shí)例化轉(zhuǎn)換

      泛型程序設(shè)計(jì)是一種把算法程序從獨(dú)立的源程序中抽離出來(lái)的抽象編程機(jī)制,具有簡(jiǎn)化程序、提高代碼可讀性與復(fù)用性的特點(diǎn)。模板作為泛型程序設(shè)計(jì)的核心部分,一直被用于開(kāi)發(fā)可復(fù)用軟件,是C++最重要的語(yǔ)言特性之一[16]。模板作為泛型設(shè)計(jì)的一個(gè)典型應(yīng)用,分為函數(shù)模板和類(lèi)模板。其中,函數(shù)模板通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)實(shí)例化,類(lèi)模板通過(guò)將模板形參與實(shí)參實(shí)現(xiàn)綁定實(shí)現(xiàn)實(shí)例化。

      為了便于模板的實(shí)例化轉(zhuǎn)換,本文在第1次語(yǔ)法遍歷過(guò)程中,實(shí)現(xiàn)了數(shù)據(jù)的結(jié)構(gòu)化,其結(jié)構(gòu)為:map〈〈模板,實(shí)例〉,類(lèi)名(函數(shù)名)〉。在類(lèi)模板數(shù)據(jù)結(jié)構(gòu)化方面,由于其格式比較固定,一般出現(xiàn)在類(lèi)的變量定義和初始化階段,數(shù)據(jù)結(jié)構(gòu)化過(guò)程相對(duì)固定;在函數(shù)模板數(shù)據(jù)結(jié)構(gòu)化方面,由于其實(shí)例化的表現(xiàn)形式較多,會(huì)出現(xiàn)多個(gè)函數(shù)模板嵌套調(diào)用的現(xiàn)象,導(dǎo)致數(shù)據(jù)結(jié)構(gòu)化獲取不全。針對(duì)這種狀況,本文增加了map〈模板,函數(shù)名〉鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),以保證嵌套模板函數(shù)的完全實(shí)例化。

      在第2次語(yǔ)法樹(shù)遍歷過(guò)程中,實(shí)現(xiàn)了模板的實(shí)例化轉(zhuǎn)換,其主要過(guò)程如圖7所示。

      Figure 7 Instance process of template function

      具體表現(xiàn)為:

      (1)添加特殊標(biāo)簽。對(duì)語(yǔ)法樹(shù)解析的變量類(lèi)型入口trailing-type-specifier添加特殊標(biāo)簽,同步對(duì)模板名和實(shí)例名增加相同的標(biāo)簽,以解決對(duì)類(lèi)或函數(shù)模板實(shí)例化時(shí)出現(xiàn)的誤替換問(wèn)題。例如,模板名稱(chēng)為D,實(shí)例化為float類(lèi)型,如果代碼中有變量定義包含D,如 D Data = 0.1;則表達(dá)式會(huì)被誤替換為float floatata=0.1;類(lèi)型增加了特殊標(biāo)簽后,表達(dá)式變更為Dqnlm Data = 0.1;進(jìn)行模板實(shí)例化替換時(shí)則杜絕了誤替換的問(wèn)題。

      (2)語(yǔ)法樹(shù)節(jié)點(diǎn)判斷。類(lèi)的實(shí)例化導(dǎo)致實(shí)例化前后的類(lèi)所處的語(yǔ)法樹(shù)節(jié)點(diǎn)發(fā)生變化,如圖8所示。因此,在Declaration節(jié)點(diǎn)中增加判斷,確保實(shí)例化后的C結(jié)構(gòu)體聲明正確壓棧,解決了實(shí)例化后無(wú)法從下一級(jí)語(yǔ)法樹(shù)上正確獲取的問(wèn)題。

      Figure 8 Change of syntax tree after instantiation

      (3)函數(shù)模板實(shí)例化。考慮到函數(shù)模板中嵌套調(diào)用函數(shù)模板的情況,將第1次遍歷過(guò)程中未找到實(shí)例化的函數(shù)模板統(tǒng)一保存,并集中處理。首先,對(duì)第1次遍歷中找到的實(shí)例化函數(shù)進(jìn)行解析。其次,對(duì)此函數(shù)進(jìn)行2次遍歷,使用預(yù)先保存的尚未實(shí)例化的數(shù)據(jù)結(jié)構(gòu)〈模板,函數(shù)名〉進(jìn)行查找,判斷是否存在新的實(shí)例化對(duì)象,并保存到newinstance數(shù)據(jù)結(jié)構(gòu)中。最后,針對(duì)所有的未實(shí)例化的模板函數(shù)進(jìn)行統(tǒng)一實(shí)例化,通過(guò)對(duì)數(shù)據(jù)結(jié)構(gòu)newinstance的增加和刪除,實(shí)現(xiàn)所有模板函數(shù)的實(shí)例化。

      (4)類(lèi)模板實(shí)例化。首先,對(duì)類(lèi)模板及類(lèi)成員函數(shù)進(jìn)行實(shí)例化。在此基礎(chǔ)上,建立實(shí)例化的類(lèi)名稱(chēng)和類(lèi)成員函數(shù)的賦值對(duì)應(yīng)關(guān)系。對(duì)實(shí)例化的類(lèi)名和類(lèi)成員函數(shù)進(jìn)行鍵值對(duì)保存,以用于在結(jié)構(gòu)體初始化時(shí)進(jìn)行對(duì)應(yīng)賦值。

      需要說(shuō)明的是,基于函數(shù)模板的STL庫(kù)是一類(lèi)使用頻繁且封裝好的庫(kù),因此該部分的實(shí)例化轉(zhuǎn)換采用預(yù)先完成轉(zhuǎn)換的C語(yǔ)言函數(shù)進(jìn)行替代和重構(gòu)。以cout標(biāo)準(zhǔn)輸出為例,匯總其輸出的格式化標(biāo)記、格式操作符及格式化函數(shù),并進(jìn)行C語(yǔ)言Printf的對(duì)應(yīng)轉(zhuǎn)換,實(shí)現(xiàn)了cout標(biāo)準(zhǔn)輸出的C轉(zhuǎn)換方式,如表2所示。

      3.5 自動(dòng)標(biāo)注體系

      C++11的標(biāo)準(zhǔn)庫(kù)由11個(gè)子庫(kù)構(gòu)成,包括3個(gè)新型標(biāo)準(zhǔn)庫(kù)和8個(gè)傳統(tǒng)標(biāo)準(zhǔn)庫(kù)。由于C++標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)主要依賴(lài)于模板,使得STL庫(kù)組件具有廣泛通用性的底層特征。STL庫(kù)由容器、算法、迭代器、仿函數(shù)和內(nèi)存分配器組成,包含了諸多在計(jì)算機(jī)科學(xué)領(lǐng)域中常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法,提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了軟件的可復(fù)用性[17]。

      Table 2 Transform key points for cout STL library

      在C++到C語(yǔ)言的源代碼轉(zhuǎn)換過(guò)程中,STL庫(kù)的轉(zhuǎn)換是主要難點(diǎn)之一。本文基于對(duì)C++標(biāo)準(zhǔn)庫(kù)的理解,構(gòu)建了自動(dòng)標(biāo)注體系,通過(guò)關(guān)鍵字和語(yǔ)義的識(shí)別,標(biāo)注出需要替換的庫(kù)函數(shù),便于程序員進(jìn)行快速分析和開(kāi)發(fā),以實(shí)現(xiàn)STL庫(kù)的快速轉(zhuǎn)換。其中,本文構(gòu)建的自動(dòng)標(biāo)注體系類(lèi)別信息如表3所示。

      Table 3 Category corresponding information of automatic marking system

      4 實(shí)驗(yàn)結(jié)果與分析

      4.1 轉(zhuǎn)換后的代碼框架

      本文選取經(jīng)典的BableStream內(nèi)存基準(zhǔn)帶寬程序?yàn)閷?shí)驗(yàn)對(duì)象。該程序提供了基于GPU的內(nèi)存?zhèn)鬏斔俾实幕鶞?zhǔn)測(cè)試[18],編程語(yǔ)言為C++,支持包括OpenACC、OpenCL和OpenMP在內(nèi)的多種并行架構(gòu),提供了4種主要的加速任務(wù),由于具有跨平臺(tái)性及高可靠性,該程序被廣泛應(yīng)用于并行計(jì)算領(lǐng)域。BableStream僅能支持Intel和PGI的編譯器,并且編程語(yǔ)言為C++,無(wú)法在國(guó)產(chǎn)眾核平臺(tái)上直接運(yùn)行。本文對(duì)BableStream程序進(jìn)行了輔助智能轉(zhuǎn)換,加速了代碼轉(zhuǎn)換的效率,轉(zhuǎn)換框架如圖9所示。

      Figure 9 C language translation framework of BableStream

      轉(zhuǎn)換后的代碼經(jīng)過(guò)標(biāo)注代碼修改后,在神威·太湖之光的編譯系統(tǒng)上可以完成編譯并運(yùn)行,經(jīng)過(guò)實(shí)際測(cè)試,自動(dòng)轉(zhuǎn)換時(shí)間為7.9 s,轉(zhuǎn)換后的C代碼811行,標(biāo)注代碼73行,手動(dòng)對(duì)標(biāo)注代碼修改后可以編譯通過(guò)并正確運(yùn)行,修改后的代碼1 301行。目前智能轉(zhuǎn)換率為60%左右。

      4.2 在國(guó)產(chǎn)神威·太湖之光上的運(yùn)行結(jié)果展示

      實(shí)驗(yàn)平臺(tái)為神威·太湖之光異構(gòu)眾核系統(tǒng),其參數(shù)如表4所示[19]。

      Table 4 Experimental environment

      多核普通計(jì)算機(jī)的運(yùn)行環(huán)境如下所示:

      (1)Linux架構(gòu):x86體系結(jié)構(gòu)64位;

      (2)操作系統(tǒng)版本:Ubuntu 18.04.3 LTS;

      (3)CPU信息:處理器:Intel(R)Core(TM)i5-10210U CPU @ 1.6 GHz;一共8個(gè)CPU,每個(gè)CPU 4核,緩存:6 MB;

      (4)PGI的編譯版本:19.10.0。

      C++在多核計(jì)算機(jī)上的運(yùn)行結(jié)果如表5所示。

      Table 5 Test results of BableStream on mutlicore computer

      轉(zhuǎn)換后的C代碼在神威·太湖之光上的運(yùn)行結(jié)果如表6所示。

      Table 6 Test results of BableStream on Sunway TaihuLight

      通過(guò)實(shí)驗(yàn)對(duì)比分析發(fā)現(xiàn),轉(zhuǎn)換后的性能數(shù)據(jù)較差,原因是由于BableStream的OpenACC版本和神威·太湖之光使用的版本存在較大差異,OpenACC的制導(dǎo)語(yǔ)句及加速代碼都是使用類(lèi)C語(yǔ)言實(shí)現(xiàn),不涉及本文的轉(zhuǎn)換內(nèi)容。后續(xù)需要進(jìn)一步對(duì)OpenACC的制導(dǎo)語(yǔ)句進(jìn)行并行優(yōu)化。

      5 結(jié)束語(yǔ)

      從數(shù)量和性能綜合來(lái)看,我國(guó)超級(jí)計(jì)算機(jī)的臺(tái)數(shù)比美國(guó)多一倍,但總運(yùn)算性能和美國(guó)基本相當(dāng),說(shuō)明我國(guó)超級(jí)計(jì)算機(jī)的平均性能和美國(guó)相比有較大差距,這是由于在當(dāng)前超級(jí)計(jì)算機(jī)生態(tài)系統(tǒng)中,基于x86架構(gòu)的CPU生態(tài)最為完善,操作系統(tǒng)、應(yīng)用軟件和工具最多。我國(guó)基于申威CPU的超級(jí)計(jì)算機(jī)對(duì)應(yīng)的軟件生態(tài)環(huán)境一直處于劣勢(shì),急需加快建設(shè)速度。本文提出了一種基于國(guó)產(chǎn)眾核的C++輔助源碼智能轉(zhuǎn)換框架,基于開(kāi)源軟件ANTLR對(duì)C++語(yǔ)言進(jìn)行詞法、語(yǔ)法和語(yǔ)義分析并形成抽象語(yǔ)法樹(shù),結(jié)合面向?qū)ο笳Z(yǔ)言的關(guān)鍵特征,完成了C++代碼自動(dòng)轉(zhuǎn)換成C代碼的架構(gòu),建立了部分STL庫(kù)函數(shù)的預(yù)先對(duì)應(yīng)轉(zhuǎn)換代碼和自動(dòng)標(biāo)注系統(tǒng),加快了源碼轉(zhuǎn)換的效率。

      在轉(zhuǎn)換過(guò)程中發(fā)現(xiàn)了可持續(xù)優(yōu)化的方面,如針對(duì)不同C++代碼的兼容性設(shè)計(jì),對(duì)內(nèi)存的使用需要更好地予以標(biāo)注或自動(dòng)轉(zhuǎn)換,轉(zhuǎn)換后函數(shù)的順序不一致導(dǎo)致出現(xiàn)編譯出錯(cuò)的問(wèn)題,C++的容器轉(zhuǎn)換通過(guò)智能方式優(yōu)化,以及OpenACC的制導(dǎo)語(yǔ)句并行優(yōu)化的智能轉(zhuǎn)換等都需要進(jìn)行持續(xù)研究和優(yōu)化。后續(xù)會(huì)持續(xù)深入研究轉(zhuǎn)換的穩(wěn)定性和兼容性,以及并行優(yōu)化的智能轉(zhuǎn)換。

      猜你喜歡
      神威實(shí)例代碼
      流翔高鈣顯神威 科學(xué)種植促增收
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      三角函數(shù)結(jié)論求值顯神威
      《神威啟示錄》系列報(bào)道三 神威現(xiàn)代中藥研發(fā)的新思考
      完形填空Ⅱ
      完形填空Ⅰ
      蒲江县| 永泰县| 铜梁县| 蓬安县| 迁安市| 年辖:市辖区| 交口县| 阳泉市| 中阳县| 兰州市| 南京市| 武清区| 奉贤区| 克东县| 东莞市| 云阳县| 内丘县| 新和县| 达拉特旗| 衢州市| 长海县| 马公市| 宁强县| 阜宁县| 东城区| 嘉禾县| 景洪市| 长海县| 锦州市| 邻水| 南陵县| 龙州县| 资阳市| 胶南市| 惠安县| 徐州市| 高青县| 滁州市| 平凉市| 富锦市| 邹城市|