宮明,蔣翔宇,陳瑩,劉朝峰
1. 中國科學(xué)院高能物理研究所,北京 100049;2. 中國科學(xué)院大學(xué),北京 100049
人類所處的物質(zhì)世界,從微觀粒子到整個(gè)宇宙,是按怎樣的規(guī)律運(yùn)行的?答案的最新版本自20世紀(jì)中期以來逐漸成形,目前其被稱作“標(biāo)準(zhǔn)模型”。這個(gè)標(biāo)準(zhǔn)模型把萬物的相互作用歸結(jié)為4種:用廣義相對(duì)論描述的引力,其支撐了宇宙學(xué)模型;用量子規(guī)范場論描述的強(qiáng)相互作用、弱相互作用、電磁相互作用,其支撐了粒子物理標(biāo)準(zhǔn)模型。
為了找到更深刻的答案,對(duì)標(biāo)準(zhǔn)模型的檢驗(yàn)工作也在持續(xù)進(jìn)行中。目前絕大多數(shù)實(shí)驗(yàn)結(jié)果與理論計(jì)算符合得相當(dāng)好,但也有一些不確定性,這些不尋常的跡象有可能是新物理理論的濫觴之處。比如最近的一個(gè)熱點(diǎn)——關(guān)于繆子的反常磁矩的測量,實(shí)驗(yàn)結(jié)果與理論計(jì)算似有分歧[1]。然而,微妙之處在于,其中的強(qiáng)相互作用貢獻(xiàn)的計(jì)算是非常困難的,需要采用超級(jí)計(jì)算機(jī)進(jìn)行大規(guī)模數(shù)值模擬才有可能理清結(jié)果的系統(tǒng)誤差和統(tǒng)計(jì)誤差。這樣的計(jì)算采用的理論和方法就是格點(diǎn)量子色動(dòng)力學(xué)(lattice quantum chromo dynamics,LQCD)。
一般說來,電磁相互作用和弱相互作用可以采用“微擾”的方法把計(jì)算逐級(jí)展開逼近,可以達(dá)到很高的精度。但這種方法對(duì)于強(qiáng)相互作用,尤其在較低的能量標(biāo)度下,是徹底失效的。因此,基于計(jì)算機(jī)數(shù)值模擬的LQCD幾乎成為唯一有效的方法。在人類尋找超出標(biāo)準(zhǔn)模型的新物理理論的征途上,它的重要性不言而喻。這些年來,在國際頂級(jí)超級(jí)計(jì)算機(jī)上進(jìn)行的自然科學(xué)計(jì)算中,LQCD往往是占用計(jì)算資源最多的應(yīng)用。
LQCD把時(shí)空切分成四維的格子,把閔可夫斯基時(shí)空上的量子場論問題轉(zhuǎn)化為歐幾里得時(shí)空上的統(tǒng)計(jì)問題。在這里,時(shí)間和空間是等同對(duì)待的,而且都是分立且有限的,可以用外推的辦法把有限的計(jì)算推廣到無限的自然世界上。把代表夸克的(偽)費(fèi)米子場定義在時(shí)空格點(diǎn)上,把代表膠子的規(guī)范場定義在相鄰格點(diǎn)之間的連線上。每個(gè)格點(diǎn)上的費(fèi)米子場可以用12個(gè)復(fù)數(shù)表示,每條連線上的規(guī)范場可以用3×3的復(fù)矩陣表示,這樣的模型就可以在計(jì)算機(jī)上用內(nèi)存對(duì)象來實(shí)現(xiàn)了。
LQCD的計(jì)算流程是:先產(chǎn)生規(guī)范場組態(tài),再基于這些組態(tài)計(jì)算費(fèi)米子的傳播子,然后用這些傳播子構(gòu)造各種關(guān)聯(lián)函數(shù),最后從這些關(guān)聯(lián)函數(shù)中擬合抽取目標(biāo)物理量。這個(gè)過程涉及幾十種復(fù)雜的算法,計(jì)算規(guī)模和中間數(shù)據(jù)非常龐大,耗時(shí)常以年計(jì),數(shù)據(jù)文件規(guī)模常以PB計(jì)。然而,這些不同算法的熱點(diǎn)函數(shù)頗為集中,數(shù)據(jù)雖大但非常規(guī)整,這為軟件設(shè)計(jì)和優(yōu)化提供了重要的有利條件。
LQCD的主要熱點(diǎn)函數(shù)可分為兩類:以Dslash函數(shù)為核心的大規(guī)模稀疏矩陣求解、以關(guān)聯(lián)函數(shù)縮并為代表的大規(guī)模張量計(jì)算。
稀疏矩陣求解的典型階數(shù)為108~109數(shù)量級(jí),由于物理上的近鄰相互作用的特點(diǎn),矩陣往往是稀疏的(也有不稀疏的情況,可以用稀疏矩陣的分式級(jí)數(shù)來逼近)。在其他研究領(lǐng)域的一般情況的稀疏矩陣往往是不規(guī)則的,需要在運(yùn)行時(shí)動(dòng)態(tài)尋址,優(yōu)化難度較大[2]。而LQCD的矩陣非常規(guī)則,數(shù)據(jù)的并行切分和矩陣元的構(gòu)造都很方便直觀,有較大的潛在優(yōu)化空間。因此類似于很多其他差分問題,LQCD的矩陣操作往往寫成模板計(jì)算(stencil)的形式,只不過是更復(fù)雜的四維九點(diǎn)的模板計(jì)算。在具體的實(shí)現(xiàn)中,往往采用“內(nèi)部+外暈”的數(shù)據(jù)模型,并采用異步通信實(shí)現(xiàn)計(jì)算與數(shù)據(jù)傳輸?shù)闹丿B。矩陣求解算法一般采用Krylov子空間迭代算法,并配合各種預(yù)處理算法,如多重網(wǎng)格算法和域分解算法等。這部分的常用算法非常多樣,如LQCD特殊的multi-shift算法、奇偶預(yù)處理技術(shù)等。
相對(duì)來說,張量計(jì)算比較清晰簡單,一般可以用愛因斯坦求和記號(hào)簡潔地進(jìn)行描述,在程序中的實(shí)現(xiàn)往往是多重循環(huán)配合對(duì)稱并行的。但考慮到它實(shí)際消耗的計(jì)算資源的比例,現(xiàn)有的軟件大多嚴(yán)重地低估了這類函數(shù),并沒有給出通用的接口,針對(duì)性的優(yōu)化也比較少見。
國內(nèi)外的每個(gè)LQCD研究合作組都擁有自己獨(dú)特的代碼積累,其中一些較通用的部分往往以開源的方式與其他合作組共享。美國USQCD合作組在美國SciDac經(jīng)費(fèi)的支持下開發(fā)的USQCD軟件集是一個(gè)相當(dāng)成熟完善的開源范例,形成了一定程度上的事實(shí)標(biāo)準(zhǔn)。這個(gè)軟件集包括4層框架,每層有若干特定功能的軟件,它們按照接口協(xié)議相互協(xié)作,可實(shí)現(xiàn)復(fù)雜且高效的計(jì)算功能。
USQCD軟件集的最底層包括負(fù)責(zé)基本線性代數(shù)操作的QLA(QCD linear algebra)、包裝多進(jìn)程和多線程并行的QMP(lattice QCD message passing)和QMT(QCD support for multi-thread);第2層包括QDP(SciDAC QFT data parallel library)協(xié)議的各種實(shí)現(xiàn)、包裝文件輸入輸出的QIO(QCD input/output applications programmer interface)和c-lime;第3層包括實(shí)現(xiàn)稀疏矩陣求解的各類算法;第4層負(fù)責(zé)整合功能,并提供人機(jī)接口,比如Chroma提供了一個(gè)集成框架和XML交互協(xié)議,QLua為QDP協(xié)議提供了一個(gè)Lua語言的包裝,CPS(columbia physics system)以C++庫包的形式提供了編程接口。
在這個(gè)4層框架中,最關(guān)鍵的特點(diǎn)是USQCD獨(dú)創(chuàng)的QDP協(xié)議。QDP為上層提供了一個(gè)方便的編程模型:在這里,規(guī)范場或費(fèi)米子場等數(shù)據(jù)可以被自動(dòng)拆分,并被安排到不同的計(jì)算節(jié)點(diǎn)上,所有的操作也都是單程序多數(shù)據(jù)(SPMD)風(fēng)格的并行實(shí)現(xiàn),然而這些實(shí)現(xiàn)都被包裝在一些C++對(duì)象里,上層程序不需要考慮任何有關(guān)并行的細(xì)節(jié)??紤]到LQCD數(shù)據(jù)往往都是四維的場,QDP利用四維時(shí)空指標(biāo)切分?jǐn)?shù)據(jù),并提供了全局的平移(shift)操作。QDP協(xié)議有C語言和C++語言的實(shí)現(xiàn),后來又有了采用運(yùn)行時(shí)編譯技術(shù)的C++實(shí)現(xiàn),即目前最常用的QDP-JIT。
隨著GPU在高性能計(jì)算中的普遍應(yīng)用,在NVIDIA公司的大力支持下,QUDA逐漸成熟。QUDA在USQCD框架中的定位是第3層,即它充分利用GPU的性能實(shí)現(xiàn)了各種稀疏矩陣的高效求解。然而,為了充分利用GPU硬件的特點(diǎn),QUDA自身實(shí)現(xiàn)了大量底層功能,擊穿了下面的兩層協(xié)議,偏離了USQCD框架關(guān)于分層解耦的設(shè)計(jì)初衷。
另外一個(gè)流行軟件Grid試圖代替QDP重新構(gòu)建一個(gè)框架。Grid的一個(gè)設(shè)計(jì)特點(diǎn)是面向CPU的向量指令,不僅把四維時(shí)空的切分放在不同的進(jìn)程上,也放在向量指令的內(nèi)部。這個(gè)方法可以實(shí)現(xiàn)大量程序的自動(dòng)向量化,而且對(duì)于不同字長的向量指令具有良好的可移植性。后來,隨著GPU的發(fā)展,Grid也提供了對(duì)GPU的良好支持,它采用一些宏和預(yù)編譯指令精巧地實(shí)現(xiàn)了跨平臺(tái)運(yùn)行。
中國格點(diǎn)合作組(China Lattice QCD Collaboration,CLQCD)在近十幾年的科學(xué)研究中,積累了很多特定功能的計(jì)算代碼,但沒有一個(gè)成體系的軟件框架。隨著國產(chǎn)超級(jí)計(jì)算(以下簡稱超算)的發(fā)展,這個(gè)問題在代碼研發(fā)和移植過程中越來越凸顯。
近年來,研究人員基于神威·太湖之光超算從零開始研發(fā)了神威格點(diǎn)原型軟件(SWLQCD),通過優(yōu)化流程細(xì)節(jié)、嵌入?yún)R編、手工向量化等細(xì)致的工作實(shí)現(xiàn)了較理想的運(yùn)行效率[3-4]。但由于目前沒有國產(chǎn)的軟件框架,只能通過制作QSunway接口與QDP協(xié)議連接,然后把SWLQCD作為一個(gè)模塊嵌入U(xiǎn)SQCD的Chroma軟件內(nèi),實(shí)現(xiàn)與上層的其他算法協(xié)作運(yùn)行。
同時(shí),筆者團(tuán)隊(duì)也在“天河三號(hào)”原型機(jī)上移植了Chroma和Grid,并針對(duì)國產(chǎn)處理器的向量指令進(jìn)行了優(yōu)化[5];針對(duì)曙光的新超算環(huán)境,移植了QUDA,把原本面向CUDA的代碼改寫成面向HIP的代碼[6]。
目前,在國產(chǎn)的3個(gè)超算環(huán)境上,都實(shí)現(xiàn)了LQCD軟件的研發(fā)或移植。然而,由于軟硬件環(huán)境與國外區(qū)別很大、國產(chǎn)環(huán)境的不完善,開源軟件的移植效率、自主研發(fā)的可持續(xù)性等都是研究者面臨的嚴(yán)峻挑戰(zhàn)。
軟件更新?lián)Q代的動(dòng)因往往是編程模型的革新,而底層編程模型依賴于硬件的實(shí)現(xiàn)。隨著計(jì)算機(jī)硬件的不斷發(fā)展,對(duì)應(yīng)的編程模型和基礎(chǔ)軟件應(yīng)運(yùn)而生,應(yīng)用層的軟件面臨更替或重構(gòu)的挑戰(zhàn)。近年來,國產(chǎn)超算的硬件平臺(tái)發(fā)展速度非??欤辽儆?個(gè)主要的架構(gòu)在并行發(fā)展,而對(duì)應(yīng)的編程模型和基礎(chǔ)軟件尚未跟上步伐,這使得應(yīng)用層的軟件無所適從,難以做到高效且可移植。在多種異構(gòu)環(huán)境下,提出新的編程模型,并將其實(shí)現(xiàn)為高效且可移植的標(biāo)準(zhǔn)庫,這是國產(chǎn)環(huán)境的軟件生態(tài)發(fā)展的關(guān)鍵環(huán)節(jié)。
縱觀LQCD軟件的發(fā)展歷程,這個(gè)脈絡(luò)是很清晰的。
20世紀(jì)末,隨著向量機(jī)的退場,Beowulf集群成為大規(guī)模高性能計(jì)算和大數(shù)據(jù)處理的主流平臺(tái)。在這樣的集群下,節(jié)點(diǎn)之間通過網(wǎng)絡(luò)互聯(lián),無法直接訪問遠(yuǎn)端內(nèi)存,天然適合多進(jìn)程和消息傳遞的并行模型。因此,各合作組研發(fā)的LQCD軟件都開啟了MPI(message passing interface)并行化的變革。隨后,片上對(duì)稱多核處理器的流行推動(dòng)了共享內(nèi)存的線程模型,可以很方便地用OpenMP預(yù)編譯指令指導(dǎo)熱點(diǎn)循環(huán)塊的本地并行化。USQCD的QDP協(xié)議就是在這個(gè)時(shí)候抓住了關(guān)鍵的抽象要素——把對(duì)稱的數(shù)據(jù)放在對(duì)稱的處理器上,設(shè)計(jì)了一套針對(duì)LQCD計(jì)算的SPMD抽象層,從而封裝了單進(jìn)程、多進(jìn)程、多線程的各種底層實(shí)現(xiàn)。
Grid的設(shè)計(jì)大約是在Intel公司提出Xeon Phi系列處理器的時(shí)候進(jìn)行的,此時(shí)各種不同的單指令多數(shù)據(jù)流(SIMD)指令對(duì)代碼的高效移植已形成了很大的負(fù)擔(dān)??紤]到SIMD指令的向量維度其實(shí)也可被看作對(duì)稱多處理器的一個(gè)新維度,因此可以把時(shí)空點(diǎn)在這個(gè)維度上進(jìn)行切分。這個(gè)思路啟發(fā)了Grid的設(shè)計(jì)與實(shí)現(xiàn)。
然而,Intel公司并沒有繼續(xù)發(fā)展融核技術(shù),目前美國最新的超級(jí)計(jì)算機(jī)都是基于CPU+GPGPU架構(gòu)的。因此,用CUDA編程模型開發(fā)的QUDA逐步走上前臺(tái),成為在GPU上計(jì)算LQCD的首選軟件。
隨著C++標(biāo)準(zhǔn)的不斷升級(jí),C++能夠承載的編程模型更加豐富。ROCm/HIP是在C++語法基礎(chǔ)上重建的一套類似CUDA的編程模型和相應(yīng)的基礎(chǔ)庫,可以適配AMD公司和曙光公司的GPU。未來C++標(biāo)準(zhǔn)中有可能會(huì)加入異構(gòu)計(jì)算的支持,目前比較接近的編程模型是SYCL和Kokkos,它們的特點(diǎn)是把匿名函數(shù)作為核函數(shù)下放給加速設(shè)備去運(yùn)行。這兩個(gè)編程模型下的LQCD原型程序已經(jīng)實(shí)現(xiàn)了初步的版本。
然而,我國LQCD軟件的未來發(fā)展路徑需要走向另一個(gè)方向,這是由國產(chǎn)軟硬件環(huán)境決定的。
美國的幾個(gè)商業(yè)公司分別正在推動(dòng)CUDA、HIP、SYCL幾個(gè)編程模型的互相交叉兼容。因?yàn)槊绹钕冗M(jìn)的超算都是基于CPU+GPGPU的硬件模型的,所以編程模型也是類似的。又由于對(duì)CUDA的路徑依賴,HIP需要兼容CUDA,SYCL需要兼容CUDA和HIP。它們的編程模型有一個(gè)基本的共同之處:都是基于“主-從”模型的,默認(rèn)的主控代碼運(yùn)行在CPU端,它可以控制加速設(shè)備執(zhí)行熱點(diǎn)函數(shù)。
我國的超算有3個(gè)并列發(fā)展方向,軟硬件環(huán)境各不相同,編譯器對(duì)語法標(biāo)準(zhǔn)的支持也很有限,因此沒必要盲目跟隨SYCL等編程模型。由于沒有路徑依賴的歷史包袱,我國的基礎(chǔ)軟件研發(fā)可以面向更長遠(yuǎn)的目標(biāo),尋找最適合未來國產(chǎn)超算發(fā)展方向的新編程模型。
國產(chǎn)申威處理器是片上異構(gòu)的設(shè)計(jì),包含若干核組,每個(gè)核組包含一個(gè)主核與64個(gè)從核。軟件環(huán)境提供的是Athread編程接口,這個(gè)編程模型是面向硬件特性設(shè)計(jì)的,因此抽象程度不足。雖然Athread中也用主核調(diào)度從核,但研究人員在實(shí)際的代碼研發(fā)實(shí)踐中發(fā)現(xiàn),把大部分邏輯留給從核處理是很好的策略,主核只需要被動(dòng)地做一些數(shù)據(jù)傳輸和輸入輸出等輔助性的工作。代碼設(shè)計(jì)的視角和重心在從核一側(cè),這與傳統(tǒng)異構(gòu)編程的思路有所不同。
日本的超級(jí)計(jì)算機(jī)“富岳”采用的處理器也是片上異構(gòu)的,每核組也是一個(gè)輔助核心和一組計(jì)算核心陣列的組合。
實(shí)際上,即使是在GPU硬件環(huán)境下,這種不協(xié)調(diào)的感覺也已經(jīng)浮現(xiàn)。由于PCIE(peripheral component interconnect express)的帶寬有限,在多GPU節(jié)點(diǎn)上,NVIDIA公司采用NVLink或NVSwitch來實(shí)現(xiàn)GPU之間的直接通信,這種做法繞過了CPU和主內(nèi)存。另外,統(tǒng)一內(nèi)存映射和遠(yuǎn)程直接數(shù)據(jù)存?。╮emote direct memory access,RDMA)也弱化了CPU在數(shù)據(jù)傳輸中的重要性。因此,未來的代碼會(huì)不可避免地向加速設(shè)備傾斜,目前流行的以CPU代碼為主線的編程模型并非最優(yōu)之選。
國產(chǎn)的神威、天河、曙光3個(gè)系列大規(guī)模超算平臺(tái)的共同點(diǎn)是異構(gòu)。異構(gòu)意味著計(jì)算單元和存儲(chǔ)單元都不是單一、對(duì)稱的,它們之間應(yīng)當(dāng)有豐富的分工協(xié)作,未必是單純的“主-從”模型。筆者期望,下一代編程模型應(yīng)該更細(xì)致地刻畫不同的處理器和內(nèi)存資源,并定義出通用的控制權(quán)轉(zhuǎn)移和數(shù)據(jù)傳輸?shù)囊?guī)則和相關(guān)接口。
LQCD計(jì)算的性能瓶頸經(jīng)常體現(xiàn)在數(shù)據(jù)流動(dòng)上。代碼優(yōu)化的重點(diǎn)經(jīng)常是節(jié)點(diǎn)間的MPI傳輸?shù)臅r(shí)機(jī)、CPU緩存的合理復(fù)用、GPU顯存的充分安排、申威從核直接內(nèi)存訪問(direct memory access,DMA)的錯(cuò)峰傳輸?shù)?。然而,目前的高性能?jì)算的編程模型很少有面向數(shù)據(jù)流動(dòng)和異構(gòu)內(nèi)存空間的支持,絕大多數(shù)細(xì)節(jié)需要手動(dòng)安排。申威和NVIDIA公司都為各自的硬件實(shí)現(xiàn)了OpenAcc編程模型,這對(duì)于初學(xué)者而言入門方便,但也阻擋了優(yōu)化的可能性,無法支撐優(yōu)秀的應(yīng)用。筆者期望,下一代的編程模型應(yīng)當(dāng)在數(shù)據(jù)流動(dòng)方面做出更合理的抽象,使得這方面的優(yōu)化可以被自動(dòng)或半自動(dòng)地完成。
把前述兩個(gè)對(duì)下一代編程模型的期望進(jìn)行綜合考慮,筆者發(fā)現(xiàn)符合要求的編程模型難以用庫包或語法設(shè)計(jì)實(shí)現(xiàn),它很可能更像一個(gè)大數(shù)據(jù)處理引擎,只不過它的粒度比Spark等傳統(tǒng)引擎要細(xì)得多,要直接深入硬件細(xì)節(jié)中,才能保證極限的計(jì)算效率。為了配合一個(gè)引擎風(fēng)格的編程模型,應(yīng)用層的程序需要被拆分成很多獨(dú)立的算子,這些算子根據(jù)數(shù)據(jù)依賴關(guān)系構(gòu)成了有向無環(huán)圖,被引擎依序分配給不同的資源進(jìn)行計(jì)算,這種做法與傳統(tǒng)的大數(shù)據(jù)處理引擎相同。
由于算子的粒度較小,算子切換的代價(jià)需要被極限優(yōu)化,這在不同硬件環(huán)境上可能需要完全不同的優(yōu)化技術(shù)。在國產(chǎn)申威架構(gòu)下,從核有能力獨(dú)立處理復(fù)雜的任務(wù)切換,但多從核互相配合進(jìn)行異步操作時(shí)的靈活性不足。這是因?yàn)閺暮耸菃尉€程的,沒有天然的并發(fā)支持。為此,筆者團(tuán)隊(duì)做了一個(gè)試驗(yàn)性的代碼OSP,它是在程序塊粒度上的超輕量級(jí)協(xié)程庫,能夠支持多個(gè)偽多線程并發(fā),并提供了私有變量支持。雖然筆者團(tuán)隊(duì)采用了一些非常特殊的語法技巧,但全部代碼完全符合C89標(biāo)準(zhǔn)語法,可移植性非常高。筆者團(tuán)隊(duì)利用OSP在申威平臺(tái)上為從核DMA做了異步包裝,初步測試成功。與此同時(shí),筆者團(tuán)隊(duì)還設(shè)計(jì)了一套被稱作虛擬機(jī)生成器(CVM)的優(yōu)化框架,采用遺傳算法為64個(gè)申威從核尋找最優(yōu)的靜態(tài)任務(wù)調(diào)度方案,相比人工方案,優(yōu)化了13%的效率。這兩項(xiàng)工作分別成功驗(yàn)證了動(dòng)態(tài)調(diào)度和靜態(tài)調(diào)度的可行性,為今后在各類國產(chǎn)平臺(tái)上建立輕量級(jí)的任務(wù)調(diào)度引擎奠定了基礎(chǔ)。
與粗粒度的大數(shù)據(jù)處理引擎不同,貼近硬件的細(xì)粒度引擎需要細(xì)致地考慮各種不同內(nèi)存之間的數(shù)據(jù)傳輸,包括主內(nèi)存(可能有核心綁定)、多級(jí)緩存、GPU的多種不同訪問模式的顯存、申威從核便箋存儲(chǔ)器(LDM)等。目前不同軟硬件環(huán)境的接口各不相同,沒有統(tǒng)一的公共編程模型,這是需要努力創(chuàng)新的地方。
一般來說,通信有兩種效果:數(shù)據(jù)傳輸和控制流同步。從形式上看,MPI和申威寄存器通信等基于消息傳遞模型的方式是顯式的數(shù)據(jù)傳輸、隱式的同步;而線程模型的共享內(nèi)存方式是顯式的同步、隱式的數(shù)據(jù)傳輸。目前看來,后者似乎更有希望成為未來高性能計(jì)算的主流,MPI-3版本也增加了共享內(nèi)存的接口??紤]到訪問局部性對(duì)效率至關(guān)重要,完全的統(tǒng)一編址并不符合人們的期待。在目前已有的訪問模型中,遠(yuǎn)程內(nèi)存訪問(remote memory access,RMA)可能是比較適用且高效的。
那么,新的編程模型需要提供對(duì)不同內(nèi)存的統(tǒng)一描述,對(duì)遠(yuǎn)程數(shù)據(jù)的讀寫提供統(tǒng)一的接口。異步的遠(yuǎn)程讀寫往往會(huì)有一些標(biāo)志用于判斷傳輸完成情況,這就給任務(wù)調(diào)度引擎提供了一個(gè)重要的信息:它可以根據(jù)當(dāng)前數(shù)據(jù)的完備情況安排算子的運(yùn)行。
在這樣的編程模型下,應(yīng)用層的軟件編寫應(yīng)當(dāng)分為兩部分:一部分是各類算子的代碼實(shí)現(xiàn),另一部分是描述性地列出數(shù)據(jù)依賴關(guān)系和傳輸?shù)耐負(fù)潢P(guān)系。這種編程模型與目前常見的模型迥然不同,它是面向數(shù)據(jù)的,代碼是連接數(shù)據(jù)的橋梁,是零散的。
這樣的編程模型有利于極限編譯優(yōu)化和高效運(yùn)行,但對(duì)于大部分程序員來說并不友好。因此,還需要另外一個(gè)面向應(yīng)用層的編程模型,把底層模型進(jìn)一步抽象化,讓它符合用戶的思維方式。
回顧LQCD的計(jì)算需求:大部分計(jì)算熱點(diǎn)函數(shù)可以描述為張量表達(dá)式。求解大規(guī)模稀疏矩陣時(shí),此稀疏矩陣作用在向量上的操作也可以寫成張量表達(dá)式的形式——在物理理論里就是如此表述的。從計(jì)算機(jī)程序的角度看,稠密的張量就是多維數(shù)組,稀疏的張量往往是簡單的枚舉函數(shù),用這兩種簡單的元件可以構(gòu)筑出LQCD絕大多數(shù)的計(jì)算過程??梢赃M(jìn)一步猜想,張量運(yùn)算形式的描述能力可能覆蓋了各領(lǐng)域的科學(xué)計(jì)算中的很大一部分,做好張量計(jì)算的封裝和優(yōu)化可能會(huì)為科學(xué)計(jì)算提供強(qiáng)有力的支持。
在LQCD的計(jì)算實(shí)踐中,因處理數(shù)據(jù)的需求,筆者團(tuán)隊(duì)設(shè)計(jì)并實(shí)現(xiàn)了QScheme語言。它在Scheme語言的基礎(chǔ)上,增加了xdata數(shù)據(jù)格式和對(duì)應(yīng)的xfile文件格式。這兩種格式本質(zhì)上就是“帶有元數(shù)據(jù)的多維數(shù)組”,這個(gè)元數(shù)據(jù)包括數(shù)組的維數(shù)、每個(gè)維度的名稱、每個(gè)維度的指標(biāo)列表。筆者團(tuán)隊(duì)為xdata實(shí)現(xiàn)了豐富的操作功能,這些操作的基礎(chǔ)是xdata四則運(yùn)算的規(guī)則:
● 運(yùn)算結(jié)果的維度集合是各參數(shù)的維度集合的并集;
● 運(yùn)算結(jié)果的每個(gè)維度的指標(biāo)集合是含有這個(gè)維度的參數(shù)的對(duì)應(yīng)指標(biāo)集合的交集;
● 程序?qū)崿F(xiàn)保證對(duì)各參數(shù)維度的對(duì)應(yīng)指標(biāo)分別進(jìn)行計(jì)算, 與它們?cè)趦?nèi)存中的存儲(chǔ)順序無關(guān);
● 普通數(shù)值被視作包含0個(gè)維度的 xdata。
這個(gè)規(guī)則可以被視為擴(kuò)展的張量運(yùn)算規(guī)則(與數(shù)學(xué)規(guī)則相比,多了一個(gè)“自動(dòng)丟棄無法匹配的指標(biāo)”的例外規(guī)則),可以把那些平時(shí)不被視為張量分量的維度納入張量處理的框架中,進(jìn)一步提高了模型的適用性。
筆者團(tuán)隊(duì)使用QScheme進(jìn)行了長時(shí)間的實(shí)際科研工作,發(fā)現(xiàn)xdata的表達(dá)能力強(qiáng)、優(yōu)化方便,非常適合科學(xué)計(jì)算和數(shù)據(jù)處理。因此,前述的底層編程模型如果能夠進(jìn)一步被抽象為類似xdata的張量計(jì)算模型,會(huì)非常適合科研人員使用和進(jìn)行二次開發(fā)。
張量表達(dá)式的形式簡單、規(guī)則明確,可以進(jìn)行靜態(tài)分析,進(jìn)而能夠用程序估算出表達(dá)式的計(jì)算資源需求,包括浮點(diǎn)操作計(jì)數(shù)、內(nèi)存占用等預(yù)算信息??梢曰陧?xiàng)或指標(biāo)拆分表達(dá)式,利用子表達(dá)式的資源預(yù)算找到最優(yōu)的拆分方案,然后用元編程技術(shù)把子表達(dá)式輸出為算子的計(jì)算程序,把數(shù)據(jù)拆分情況整理成數(shù)據(jù)描述信息,最后把這些信息傳遞給下層的調(diào)度引擎。這樣,兩層計(jì)算模型之間就可以用一套靜態(tài)分析算法和代碼生成算法連接起來。
至此,筆者團(tuán)隊(duì)期待的高性能大數(shù)據(jù)處理的基礎(chǔ)軟件已逐漸成形:它包含上下兩層編程模型,下層實(shí)現(xiàn)高效跨平臺(tái)的遠(yuǎn)程內(nèi)存訪問接口和算子調(diào)度引擎;上層是在此基礎(chǔ)上構(gòu)建的擴(kuò)展張量計(jì)算模型,為研究者提供張量表達(dá)式形式的代碼接口。
本文回顧了LQCD的計(jì)算特點(diǎn)和軟件沿革,基于國產(chǎn)超算的軟硬件環(huán)境和發(fā)展方向提出了面向LQCD和其他科學(xué)計(jì)算的上下兩層編程模型。筆者團(tuán)隊(duì)研發(fā)了試驗(yàn)性的軟件,用原型測試和實(shí)際使用的經(jīng)驗(yàn)為這個(gè)設(shè)想中的編程模型提供了可行性的支撐。這個(gè)編程模型的實(shí)現(xiàn)既是國產(chǎn)環(huán)境基礎(chǔ)軟件的一項(xiàng)挑戰(zhàn),也是繁榮軟件生態(tài)的一個(gè)可能的契機(jī)。