陳虎,周鵬靈
面向國產高性能眾核處理器的編程模型
陳虎1,2,周鵬靈1*
(1.華南理工大學 軟件學院,廣州 510006; 2.廣東省高性能計算重點實驗室,廣州 510033)( ? 通信作者電子郵箱1197615077@qq.com)
在國產高性能眾核處理器上編程時,需要直接使用最底層的接口開發(fā)軟件,這使編程和調試非常困難;并且各自平臺的高性能軟件編程模型較為基礎,計算軟件不能通用,造成了重復性開發(fā)。針對以上問題,實現了通用編程模型以及所對應的支撐庫:一方面基于消息隊列機制開發(fā)國產高性能眾核處理器的線程級并行機制;另一方面基于單指令多數據流(SIMD)編程模型開發(fā)從核上的數據級并行性。首先,對國產高性能眾核處理器體系結構進行抽象;其次,設計模型的消息隊列機制,并為程序員提供一套異構并行編程接口,如系統(tǒng)參數接口、從核線程控制接口、消息隊列接口、SIMD抽象接口;最后,在上述基礎上形成全新的高性能計算軟件開發(fā)模型和方法,方便用戶開發(fā)基于國產高性能眾核處理器的并行計算軟件。性能傳輸測試結果表明,在國產眾核處理器上,當啟動核數較少時,所提模型的傳輸帶寬普遍達到了峰值直接內存訪問(DMA)帶寬的90%;當啟動的核數較多時,消息隊列模型的傳輸帶寬普遍達到了峰值DMA帶寬的70%。在矩陣乘法實驗中,與系統(tǒng)原語傳輸矩陣并計算的性能相比,所提模型的性能達到前者的90%;在口令猜測系統(tǒng)中,所提模型的代碼性能與直接使用最底層的接口開發(fā)的代碼性能基本持平。所提通用編程模型和支撐框架使高性能計算(HPC)軟件開發(fā)更簡易,并且具有更好的可移植性,可為促進國產自主HPC軟件研發(fā)提供幫助。
國產眾核處理器;單指令多數據流;并行編程模型;SW26010;消息隊列模型
為了在有限的芯片面積上提供更多的計算能力,我國研發(fā)的SW26010[1-2]和面向E級計算的異構融合加速器[3-4]等高性能眾核處理器系統(tǒng)采用異構結構,即包含數量眾多的較為簡單的從核和少量復雜的主核。主核和從核通常具有不同的指令集,通過核中單指令多數據流(Single Instruction Multiple Data, SIMD)部件提升計算能力,通過不具有Cache一致性[5]的本地存儲器和主核心交換數據。在軟件層面,主核執(zhí)行較為完善的操作系統(tǒng),可以支持通用的多線程編程模型如OpenMP(Open Multi-Processing)[6]、pthread[7]等;但從核上僅能運行一個線程,而且從核的線程控制也是非標準化的編程接口。
國產高性能眾核處理器在內存組織方面與傳統(tǒng)對稱多處理器(Symmetrical Multi-Processor, SMP)[8]和Cache一致性的統(tǒng)一存儲器訪問(Cache Coherent Uniform Memory Access, CC-UMA)[9]的結構有很大不同,而且從核多線程和SIMD指令的使用也與國際常見標準不同。這直接導致兩個問題:1)軟件開發(fā)困難,大多數情況下,在這些國產高性能眾核處理器上進行軟件開發(fā)只能遠程連接到超算中心進行調試;2)不同國產高性能眾核處理器的國產軟件無法通用,因為在這些處理器上進行軟件開發(fā)都直接選用平臺最底層的接口,導致本就薄弱的國產應用軟件研發(fā)力量變得更分散,造成大量重復性開發(fā)工作。
為此,本文提出一種面向國產高性能眾核處理器的編程模型。一方面,基于消息隊列機制開發(fā)國產高性能眾核處理器的線程級并行機制;另一方面,通過SIMD編程模型開發(fā)從核上的數據級并行機制。該編程模型已經在x86微處理器[10]、SW26010處理器、面向E級計算的異構融合加速器這三種不同平臺上實現。在此編程模型的支持下,用戶可以首先使用基于x86平臺上的模型開發(fā)和調試高性能計算(High Performance Computing, HPC)軟件,再將應用軟件移植到國產高性能眾核處理器上,這樣不僅可以有效降低開發(fā)難度,還可以在兩種不同類型的國產高性能微處理器上快速遷移同一個軟件,有效提升國產HPC軟件開發(fā)和遷移的效率。基于本文模型的國產HPC軟件開發(fā)流程如圖1所示。
OpenMP[6]是當前對稱多處理器系統(tǒng)上的常見多線程編程接口,并得到了廣泛支持?;谠摌藴书_發(fā)的應用程序具有良好的可移植性。
Cilk++[11]是一種基于C++的并行編程模型。Cilk++使用了clk_for、cilk_spawn和cilk_sync這3個關鍵字對C++進行并行擴展,運行時應用分而治之的方法在工作線程之間調度任務,以確保多個線程負載均衡。
Voss等[12]提出了開源線程構建庫(Threading Building Block, TBB),它以任務為調度單位,并在POSIX和Windows線程庫上具有可移植性。oneAPI[13]的軟件編程框架目標是為Intel各類計算架構,如CPU、GPU、現場可編程門陣列(Field Programmable Gate Array, FPGA)或者其他針對不同應用的硬件加速器等,提供一個統(tǒng)一編程模型和應用程序接口。oneAPI的核心是DPC++(Data Parallel C++)的編程語言,可以支持跨CPU和加速器上的數據并行和異構編程,目標是簡化編程,提高代碼在不同硬件上的可重用性,同時能根據特定的加速器調優(yōu)。oneAPI提供了一個統(tǒng)一的編程模型和一組開發(fā)工具和庫,可以使各種中間件和框架更輕松地利用CPU、GPU、FPGA等加速器,實現高性能計算;同時,oneAPI提供的DPC++使用戶能夠直接利用這些工具和庫,無須了解底層硬件的細節(jié)。
現代微處理器上已經廣泛使用了SIMD指令,如SSE(Streaming SIMD Extensions)[14]、AVX(Advanced Vector eXtension)[15]、AVX-512[15]和SVE(Scalable Vector Extension)[16-17]等。為了充分使用這些SIMD指令,在軟件系統(tǒng)中使用了以下方法:
1)直接書寫匯編或使用針對特定處理器的內嵌原語。這種方法與特定的硬件平臺綁定,性能較高但可移植性很差。
2)使用編譯器自動矢量化[18-19]。在編譯器自動矢量化方面,如OpenMP 4.0的#pragma omp simd語句可以將函數和循環(huán)標識為數據并行。編譯器自動矢量化使應用軟件具有較好的可移植性,但是效果取決于編譯器的能力和軟件書寫的風格,性能往往較差。
3)采用較為通用的SIMD抽象層。例如,MAL(Macro Abstraction Layer)[20]使用了一組宏代替內嵌原語函數,并可以根據配置替換為SSE、AVX指令。Kretz等[21]提出的Vc庫(Vc library)將SIMD內嵌原語封裝在高級函數中,可以提供更高級別的抽象,庫將確定目標硬件可以并行執(zhí)行的向量的寬度;但如果僅需要部分的向量寬度時,必須使用額外的屏蔽操作來禁用向量通道。Wang等[22]提出的gSIMD(generic SIMD)庫根據每個向量的通道數(fixed-lane)而非向量的字節(jié)長度(fixed-width)操作,程序員只需定義通道數,由該庫將這些元素映射到基礎SIMD向量寬度和硬件。目前,也僅支持Intel的SSE4.2以及IBM POWER7處理器的VSX指令。
4)在應用軟件系統(tǒng)(如快速傅里葉變換(Fastest Fourier Transform, FFT)軟件[23])中自行設計和使用SIMD抽象層,并按照不同硬件平臺編譯成特定的SIMD指令。這種方法在很多HPC軟件上得到了廣泛使用,但是每種HPC軟件的抽象層定義不統(tǒng)一,難以推廣。
5)使用C++等高級語言提供的庫(如Click++庫)。
可見,對于國際高性能軟件編程模型來說,應用軟件在不同硬件平臺上的可移植性仍然是一個重要的特性。但是現有的編程模型難以直接在國產高性能眾核處理器上使用,因為該處理器的體系結構和操作系統(tǒng)具有自己的特點;而且國產高性能眾核微處理器的差異性阻礙了國產高性能軟件的發(fā)展,使應用軟件在國產高性能眾核處理器之間不通用;同時,現有的SIMD編程模型也無法適用于國產眾核處理器,例如自動矢量化的OpenMP和Cilk++方法需要編譯器版本支持,而當前的SIMD抽象層比如Vc庫和gSIMD方法,它們封裝了SIMD指令,但支持的指令集僅僅包含SSE4.2以及IBM POWER7處理器的VSX指令等,十分有限;MAL也僅支持部分指令集架構(Instruction Set Architecture, ISA)中的宏,不能在國產眾核處理器中使用。
本文研究的編程模型和支撐框架可以在“神威”“天河”和x86等不同體系結構上高效運行,有效提高應用軟件的可移植性,能為我國HPC軟件研發(fā)提供幫助。
我國自行設計和實現的SW26010處理器采用了異構多核處理器結構,由4個異構群構成,通過群間傳輸網絡來實現4個異構群和系統(tǒng)接口總線的存儲共享和通信。每個異構群都可以被當作一個單獨的計算單元用于計算,它的結構如圖2所示。
每個異構群包括1個主核和64個從核。每個異構群具有相同的存儲器層次關系,它分為兩部分:一部分為8 GB的異構群內存;另一部分為從核局部存儲空間。
主核主頻為1.5 GHz,L1 Cache大小為32 KB,L2 Cache大小為256 KB,采用4譯碼7發(fā)射超標量結構。從核主頻為1.5 GHz,采用2譯碼2發(fā)射超標量結構,支持256 bit的SIMD指令集,每個從核局部存儲空間大小為64 KB,指令存儲空間為16 KB,從核可以直接離散訪問主存,也可以通過DMA的方式批量訪問主存。
面向E級高性能計算的異構融合處理器采用了異構融合架構,包含16個CPU、96個控制核心和1 536個加速核心:16個CPU組成一個通用區(qū),96個控制核心和1 536個加速核心組成加速區(qū),平均分為4個加速簇,如圖3所示。每個集群有24個控制核、384個加速核,處理器結合了超長指令字(Very Long Instruction Word, VLIW)技術和加速陣列的微結構,每個加速核心以VLIW方式工作,每16個加速核和1個控制核組成一個加速陣列。
多核CPU采用硬件維護Cache一致性,包含512 KB的 L2 Cache。每個加速簇采用6 MB的全局共享存儲(Global Shared Memory,GSM)、48 MB的HBSM(High Bandwidth Shared Memory)和32 GB DDR4(Double Data Rate Fourth Generation)多級存儲結構。另外,在每個加速陣列上還包括了64 KB的私有標量內存(Scalar Memory, SM)和768 KB的私有陣列內存(Array Memory, AM)。最高支持1 024位的SIMD指令操作。通用區(qū)域中的CPU可以訪問不同加速簇中的HBSM和DDR空間,而控制核心和加速核心只能訪問它自己簇中的GSM、HBSM和DDR空間,不同加速簇的數據共享是通過CPU完成的。
SW26010和面向E級高性能計算的異構融合處理器具有以下共同的特點:
1)它們都采用了非對稱的結構,即片上的處理器核分為少量的主控核和大量的計算從核。
2)從核上不具備多進程(線程)的操作系統(tǒng)支持,僅支持一個線程在從核上運行。不同的處理器具有不同的從核線程編程接口。
3)每個計算核都有獨立的局部存儲器空間,而且這些存儲器空間不具備Cache一致性,需要程序員通過顯式程序控制系統(tǒng)主存與各個計算核存儲器之間的數據交換。
4)主核和從核之間的數據交換有兩種方法:①從核直接訪問主核的內存空間,延遲較長,僅僅適用于傳遞控制信息;②從核啟動的DMA過程,可以傳輸規(guī)模較大的數據。
5)從核上支持SIMD指令,不同處理器的SIMD寬度各不相同。
圖3 面向E級高性能計算的加速器芯片
本文提出了如圖4所述的抽象結構描述這兩種不同類型的眾核處理器的特點。一個完整的處理器簇由一個主核和個從核構成:主核擁有片上Cache訪問主存;從核具有獨立的局部存儲器,但不支持Cache一致性協議,主核和從核之間進行數據交換,可以通過從核DMA完成。每個從核上都具有SIMD指令系統(tǒng)。不同的處理器中,SIMD的數據寬度不一定相同。
圖4 國產高性能異構處理器的體系結構抽象
為了降低并行程序編寫的難度,將x86一個主線程當作主核,其他線程當作從核,在x86平臺完成代碼開發(fā)并利用x86上廣泛使用的工具進行調試。表1給出了實驗所用x86服務器、SW26010和面向E級高性能計算的異構融合加速器的主要體系結構參數。
本文模型結構如圖5所示,主要分為系統(tǒng)參數接口、從核線程控制、消息隊列接口、從核上SIMD抽象接口等部分。主核和從核的應用程序通過系統(tǒng)參數接口獲取從核數量、SIMD寬度、局部存儲器容量等參數,并可以根據這些參數調整相應的算法和數據結構尺寸。主核通過從核線程控制接口啟動和管理從核上的線程。主核和從核之間通過消息隊列[24]交換數據,而不需要應用程序考慮不同眾核處理器局部存儲器的數據傳輸機制。從核上的應用程序可以通過SIMD抽象接口使用從核上的SIMD指令系統(tǒng)。
表1 國產高性能眾核處理器的主要參數
圖5 針對國產高性能眾核處理器的編程模型
2.2.1系統(tǒng)參數接口
系統(tǒng)參數接口主要用于標識當前高性能眾核處理器的關鍵體系結構參數。在主核和從核上均可以獲得從核數量、從核的局部存儲器空間容量、從核SIMD數據寬度等信息,在從核上還可以得到該線程所處的從核編號(對于包含個從核的多處理器,從核的標號從0開始計數,直至-1)。
2.2.2從核線程控制接口
主核可以通過這個接口創(chuàng)建并啟動從核線程組、等待線程組終止、關閉線程組,并查詢特定從核上的線程是否活躍。
int sum_calc(int *a, int n) {
…
int cluster_id=1;
int cn=mGetSlaveCoreNum(cluster_id); //獲取從核數量
ThreadID tid=mStartSlaveThreads(0, cn,
(void *)slave_sum_calc_by_slave_core, NULL); //開啟從核線程組
…
mWaitSlaveThreads(tid); //等待線程組終止
mDestroySlaveThreads(tid); //關閉線程組
…
return sum;}
上述應用程序示例中,主核根據從核數啟動從核線程,并等待從核線程結束,再銷毀所有的從核線程。該接口完全屏蔽了國產微處理器私有的athread和hThread從核線程接口,同時還支持Linux上的pthread接口,使應用程序具有良好的可移植性。
2.2.3消息隊列接口
消息隊列是主核與從核之間交換數據的主要方式。在本文模型中,消息隊列的方向分為主核到從核和從核到主核兩類,不支持從核之間直接建立消息隊列。在每個消息隊列中,消息的大小固定。當發(fā)送方往一個隊列發(fā)送多個消息時,接收方將按照發(fā)送方發(fā)送消息的順序先后接收到消息。
在主核和同一個從核之間可以建立多個消息隊列,以傳輸不同類型的消息。與消息隊列相關的接口主要包括:
1)消息隊列的創(chuàng)建和銷毀。
在創(chuàng)建消息隊列時,需要指定以下參數:消息隊列的名稱、從核的編號、消息的尺寸大小、消息隊列在主核部分所能容納的消息數量、在從核部分所能容納的消息數量、消息隊列的方向、主核消息隊列的起始地址位置、消息隊列在從核中所使用的存儲器類型等。創(chuàng)建的每一個隊列都擁有一個唯一的標識號。
隊列是由主核創(chuàng)建,但會在主核和從核都產生一個新的隊列句柄。在主核方面,將按照不同的從核編號分區(qū)設置句柄,(從核編號,句柄號)或者(從核編號,隊列名稱)可以確定一個唯一的隊列實體。在從核方面,句柄號或者隊列名稱就可以標識唯一的隊列實體。同一個隊列在主核與從核上的句柄相同,即主核上(SlaveID, handle)對應的隊列與第SlaveID個從核上對應的句柄為handle的隊列為同一個隊列實體。
例如,現在有一個主處理器和兩個從核A、B,如果主處理器和從核A建立兩個隊列,名稱分別為“MasterToA”“AToMaster”。主處理器和從核B建立了兩個隊列,名稱分別為“MasterToB”“BToMaster”。所形成的句柄如表2所示。
表2 隊列句柄示例
2)消息隊列的狀態(tài)查詢。
通過消息隊列的標識號能夠查詢到特定消息隊列的狀態(tài),主要包括隊列是否存在、消息的尺寸、當前隊列中消息的數量、消息隊列方向等。
3)發(fā)送和接收消息。
主核或者從核可以向消息隊列發(fā)送或接收消息,而且提供了阻塞版本與非阻塞版本。
從核的局部存儲器容量非常有限,本文采用了應用程序直接訪問消息隊列中消息內容的方法,可以有效減少局部存儲器中占用的空間,并避免不必要的內存拷貝。從核上消息訪問接口有所不同。
int sum_calc(int *a, int n) {
int cn=mGetSlaveCoreNum(c_id); //獲取從核數量
int sn=n/cn;
…
for (int i=0; i handle0=mCreateQueue(c_id, "Input" , i, M*sizeof(int), 1, 1, NULL, SlaveScalarMem, MasterToSlave, &err0); handle1=mCreateQueue(c_id, "Output", i, M*sizeof(int), 1, 1, NULL, SlaveScalarMem, SlaveToMaster, &err1); } … //主核發(fā)送消息程序 int *addr=(int *)mAllocateMsg(i,handle0,&err0); //分配消息內存 int len=((j+M) memcpy(addr, &a[i * sn+j], len); mSendMsg(i, handle0, addr, len, &err0); //發(fā)送消息 … //主核接收消息程序 int *ret_ptr; int sum_size; ret_ptr=(int *)mRecvMsg(i, handle1, &sum_size, &err1); //接收消息 … //處理消息 mReleaseMsg(i, handle1, ret_ptr, &err1);} //釋放消息內存 上述例子中,主核首先針對每個從核建立了一對主核到從核和從核到主核的消息隊列。主核程序在發(fā)送消息時將先使用mAllocateMsg()獲得消息塊的指針,再使用memcpy()填充消息塊內容,最后使用mSendMsg()發(fā)送這個消息。從核程序使用sResvMsg()接收消息后,將獲得這個消息塊的指針并鎖定這個消息,再直接訪問消息塊的內容,在使用完消息中的內容后再使用sReleaseMsg()向消息隊列釋放消息塊。 2.2.4SIMD抽象接口 SIMD接口為應用程序提供了多種向量數據類型,例如:_VF32表示32位單精度浮點向量,_VU32表示32位無符號整數向量。在此基礎上提供了常見的SIMD操作,主要包括數據設置、存儲器讀/寫、單精度/雙精度浮點的算術計算、整數的算術/邏輯/移位計算等。 本文模型還增加了預先定義的常量表示SIMD指令系統(tǒng)的通道數。例如_VF32_SIZE表示SIMD指令集中單精度浮點的通道數。在AVX指令集上,該值為256/32=8。使用通道數參數可以基于不同的SIMD指令系統(tǒng)構造應用程序。以下是一個具備良好可移植性的向量求和程序: void addv(float *a,float *b, float *c, int len){ int i=0; while((i+_VF32_SIZE) _VF32 va,vb,vc; va=_VF32_LOAD(a+i); //加載向量 vb=_VF32_LOAD(b+i); vc=_VF32_ADD(va,vb); //進行向量加法運算 _VF32_STORE(c+i,vc); //存儲向量 } for(;i 在系統(tǒng)中,主核需要訪問的消息隊列的管理和控制信息都存儲在主核存儲器上。因為從核到主核和主核到從核的DMA數據傳輸的請求都只能由從核來發(fā)起,而且從核是單線程,從核可以訪問到主存,所以當隊列管理模塊需要被主核訪問時,需要建立在主存,可以由主核和從核共同訪問。主核會存儲它與所有從核的交互的消息隊列信息。 系統(tǒng)主核主要的數據結構關系圖6所示,箭頭表示該表項結構體包含的指針。圖6中,SlaveArgument表示表項數量為從核設備數量,每一項作為一個對應從核線程的結構體參數,該結構體中含有需用戶指定的主核設備號、線程序號以及用戶定義的傳參,并均含有一個指向HMQTab線性表中對應設備表項的指針,它們指向同一個表項。 HMQTable表的每一項對應一個主核,并指向一個主核所對應的所有從核的消息隊列入口表HMQLinkedListHead。HMQLinkedListHead表中每個表項對應一個從核,表項指向的HMessQueueNode表為該主核和從核之間的消息隊列。SlaveArgument、HMQTable和HMQLinkedListHead表項數目與主核和從核的核心數目相關,可以根據不同的HPC平臺靈活配置。 HMessQueue線性表表項數目則由用戶代碼創(chuàng)建的消息隊列數量決定,可以通過前文所提到的句柄handle快速訪問到表項。 圖6 系統(tǒng)主核的主要數據結構 在系統(tǒng)中,因為從核訪問主核數據會產生較長的時間浪費,所以主核與從核的消息隊列的管理和控制信息分別存儲在各自的存儲器上,消息隊列整體結構如圖7所示。 圖7 消息隊列的組織 在本文模型中,1個主核和1個從核之間可以有多個單向消息隊列。按照方向區(qū)分,可以分為主處理器到從處理器(MasterToSlave),從處理器到主處理器(SlaveToMaster)兩種。主核和從核消息隊列的管理和控制信息存儲器在各自的存儲器上。不過主核的存儲器信息可以由主核和從核共同訪問。兩種類型的消息隊列在主核和從核上都具有一塊連續(xù)的存儲空間(分別成為消息隊列的主核部分和從核部分)存放消息內容。 HMessQueue線性表為主核的消息隊列管理和控制信息,每個節(jié)點對應了一個消息隊列,包含了計算核心的ID號、隊列名稱、句柄、狀態(tài)、方向、隊列在計算核心的地址類型、最長支持的消息字節(jié)數、主核部分的消息內容、主核部分的控制消息內容。 SMessQueue線性表為從核的消息隊列管理和控制信息,在啟動從核線程時,它由從核線程初始化相應信息,SMessQueue線性表每個表項與HMessQueue線性表的每個表項一一對應,除了HMessQueue線性表所包含的內容,還創(chuàng)建了本從核的消息內容,以及本從核的控制消息內容。 國產眾核處理器采用了非對稱的結構,包括少量復雜的主核和數量眾多的較為簡單的計算核,從核上不具備多進程(線程)的操作系統(tǒng)支持,僅僅支持一個線程在從核上運行,所以在進行主核與某個從核A之間的消息隊列通信時,建立一個主核與某個從核A單獨的消息隊列,這個消息隊列可以看作單生產者單消費者模型,而消息的存儲采用環(huán)形緩沖隊列,實現了不使用任何同步機制的傳遞算法。類似Lamport單生產者單消費者無鎖隊列[25],它證明了當隊列由單個使用者和單個使用者同時訪問時不需要鎖,通過位置變量充當訪問數組中的索引實現同步。 根據消息的傳遞方向不同,會有兩種相關的消息結構設計:主核到從核方向消息隊列的控制信息布局(圖8[24]),及從核到主核方向消息隊列的控制信息布局(圖9)。 圖8 主核到從核方向消息隊列的控制信息布局 圖9 從核到主核方向消息隊列的控制信息布局 每個消息隊列的控制信息分為兩部分:位置索引和狀態(tài)列表。狀態(tài)列表中的每個狀態(tài)與環(huán)形消息塊的數據區(qū)域中的每個消息塊一一對應。主核部分的消息塊狀態(tài)列表和從核部分的消息塊狀態(tài)列表(分別記為MState和SState)分別在主核地址區(qū)和從核本地存儲中。 主核部分和從核部分分別有四個位置索引,用于指示當前狀態(tài)消息塊的邊界。IMTran、IMLocked、IMIdle和IMReady為[0,MSize-1]中的整數;ISTran、ISLocked、ISIdle和ISReady的為[0,SSize-1]中的整數。 在主核發(fā)往從核的消息隊列控制信息布局(圖8)中,IMLocked和IMIdle存儲在主核地址區(qū)域。IMTran、IMReady和其余4個位置索引均位于從核局部存儲器。因為IMTran 、IMReady僅僅被從核讀寫,而不會被主核使用,可以放置在從核的局部存儲器中。從核將盡可能地將為處于MReady狀態(tài)的消息塊啟動DMA。這樣的設計將主核不必要的變量放置在從核中存儲,可以減少從核代碼對主核變量的訪問,從而提高模型的性能。初始化后,狀態(tài)列表MState中所有的狀態(tài)均為MIdle;狀態(tài)列表SState中的所有狀態(tài)均為SIdle,所有的位置索引均為0。 主核發(fā)往從核方面,消息在消息隊列中的狀態(tài)轉移變化如圖10所示,主核端消息的消息變化為MasterIdle>>MasterLocked>>MasterReady >>MasterTran>>MasterIdle,相應地從核端的消息狀態(tài)變化為SlaveIdle>>SlaveTran>>SlaveReady>>SlaveLocked>>SlaveIdle。 圖10 主核發(fā)往從核時消息隊列中消息的狀態(tài) 以將消息從主核發(fā)向從核的交換算法操作序列為例: 1)主核消息塊的初始狀態(tài)為MasterIdle; 2)在主核應用程序調用mAllocateMsg(),會將第一個MasterIdle狀態(tài)的消息塊分配給應用程序,將該消息塊的狀態(tài)轉為MasterLocked; 3)主核應用程序設置完成該消息塊內容后,調用mSendMsg(),將該消息塊的狀態(tài)轉為MasterReady,表示該消息塊內容已經準備好,等待從核接收; 4)從核消息塊的初始狀態(tài)為SlaveIdle; 5)當從核接收一個消息時,啟動DMA傳輸,會將從核第一個SlaveIdle塊改為SlaveTransfer態(tài),并將獲取主核第一個MasterReady的消息塊,將主核消息塊改為MasterTransfer態(tài); 6)DMA傳輸結束時,主核消息塊的MasterTransfer消息塊狀態(tài)又恢復到MasterIdle等待下次調用分配,從核SlaveTransfer消息塊狀態(tài)變?yōu)镾laveReady; 7)從核應用程序調用sRecvMsg()獲取第一個SlaveReady狀態(tài)的消息塊,該消息塊的狀態(tài)轉變?yōu)镾laveLocked態(tài); 8)從核使用完畢后,應用程序調用sReleaseMsg(),將從核消息塊SlaveLocked態(tài)設置為SlaveIdle狀態(tài)。 從核發(fā)往主核的消息狀態(tài)轉移和消息隊列控制信息布局都跟主核發(fā)往從核的不同,對于位置索引來說,如圖9所示,IIMTran、ISTran、ISReady、ISLocked和ISIdle存儲在從核局部存儲器,其余3個位置索引均位于主核地址區(qū)域。在消息隊列中,消息的狀態(tài)轉移變化為:主核端消息從MasterIdle>>MasterTran>>MasterReady>>MasterLocked>>MasterIdle,相應地從核端的消息狀態(tài)變化為SlaveIdle>>SlaveLocked>>SlaveReady>>SlaveTran>>SlaveIdle。 國產高性能眾核微處理器采用非對稱的結構設計,主核與從核兩者協同為具體的應用提供高效的計算平臺。各個平臺提供了各自的線程庫的管理。 以SW26010、面向E級高性能計算的異構融合加速器為例,SW26010眾核處理器提供一組athread庫。使用設計程序可以更好地發(fā)揮SW26010下從核線程組的加速性能,并能夠讓用戶方便、快捷地對核組內的線程進行創(chuàng)建和管理。主核調用加速線程庫可以進行控制線程的初始化、啟動、結束等一系列操作。每個線程都綁定到一個從核。而從核調用的加速線程庫接口可以進行啟動數據傳輸、執(zhí)行核心計算等。 而面向E級高性能計算的異構融合處理器上使用了hThread多線程編程接口。該編程接口同樣分為兩部分,一部分為主核編程接口,另一部分為從核編程接口。主核編程接口除了包括線程管理外,還包含了設備管理、鏡像管理等;從核編程接口主要包括并行管理接口、同步管理以及向量化函數接口。 本文模型通過宏定義的方式封裝了pthread、athread和hThread這三種不同類型的線程庫,形成一層更高級的抽象,提供給用戶統(tǒng)一的接口,如:創(chuàng)建并啟動從核線程組、等待線程組終止、關閉線程組、主核加載鏡像文件到設備等;以下給出了等待線程終止接口的實現方式。在編譯時,通過預先定義不同類型的宏,可以使用不同類型的線程庫。 void mWaitSlaveThreads(int cluster_id, ThreadID t_id) { #if defined(SW5_VERSION) athread_join(); #endif #if defined(MT3_VERSION) hThread_group_wait(t_id.m_thread_id); #endif #if defined(AVX_VERSION) void *retval; pthread_t *tids=(pthread_t *)t_id.m_ptr; for (int i=0; i < t_id.m_num; ++i) { pthread_join(tids[i], &retval);} #endif} 抽象層的設計主要有兩部分:一部分是SIMD數據類型即抽象向量類型;另一部分是對這些數據類型進行的一系列的操作。 1)向量數據類型和長度。針對SIMD指令中的基本數據類型(包括符號和無符號整數、浮點數等),本文定義了一系列向量類型。例如MMX指令集的__m64、SSE指令集的__m128i、AVX指令集的__m256i、__m512i等整數數據類型,都可以認為是32位無符號整數向量類型__VU32。編程模型還可以根據指令系統(tǒng)和基本數據類型指定每個向量的通道數(例如_VU32_SIZE表示了一個向量中的32位無符號整數的通道數)。除此之外,本文模型還可以描述SW26010和面向E級計算的異構融合加速器支持的SIMD數據類型。這兩種處理器分別能處理256 bit和1 024 bit的向量類型,通過一條SIMD指令能分別進行4路和32路的32 bit的向量計算。 表3 典型的32位無符號整數向量操作指令 分別在SW26010處理器上和面向E級高性能計算的加速器芯片上進行測試,實驗步驟如下: 1)初始化個元素的一維雙精度浮點數組; 2)將數組個大小的數據作為一個消息,每個消息帶上消息序號,拷貝到消息隊列中,發(fā)送次,啟動個從核接收消息; 3)每個從核利用消息序號對收到的數組進行驗證,并累加收到的消息序號的值; 4)從核接收完所有消息后,返回給主核1個累加之后的值,主核驗證是否完全收到消息。 采用了對比測試:一種為使用DMA原生接口進行傳輸的性能,它是理論上能達到的最高傳輸性能;一種為使用本文消息隊列模型的傳輸性能,每次傳輸的的大小為16 KB的結果如表4所示。 在兩種國產平臺上,消息隊列模型在從核數啟動較少時,本文模型與單純使用DMA接口的程序相比,消息隊列模型的傳輸帶寬普遍達到了峰值傳輸帶寬的90%。在從核數較多時,消息隊列模型的傳輸帶寬普遍達到了峰值傳輸帶寬的70%,因為部分控制信息是在主核中存儲,從核訪問與主核共享的數據是離散的從主存訪問(非DMA模式),大量從核離散地訪問主存,可能會影響DMA性能,而且主存帶寬效率低,大量從核離散load/store訪問的話,可能會產生阻塞,耗時會更長。 矩陣乘法[26]是科學計算的基礎方法,利用眾核處理器和并行化的特點提高它的效率也至關重要。本節(jié)根據消息隊列模型與SIMD抽象層完成線性代數中重要的矩陣乘法的設計并實現,可以在多種眾核處理器上高效并行。 傳統(tǒng)的對稱處理器在計算大規(guī)模矩陣乘法時,為了減少內存帶寬的影響,會進行多級數據分塊,分塊大小圍繞著各級緩存容量進行調整。而對于國產眾核處理器如SW26010處理器,它能為每個計算核心提供私有的高速緩沖(Local Data Memory, LDM)且從核核組空間有限,一共為64×64 KB 的局部存儲空間,無法容納超過4 MB的數據,因此對于大規(guī)模的矩陣乘法,也必須對矩陣進行分塊,將矩陣分為多個小矩陣,利用主從核傳輸接口傳輸小矩陣,從核多次接收主核分塊小矩陣進行計算。 使用編程模型的矩陣乘法代碼結構如圖11所示,類似圖5,代碼在x86平臺就可以完成軟件開發(fā)和測試,然后再移植到多個國產眾核平臺。 表4 數據傳輸性能測試結果對比 圖11 使用編程模型的矩陣乘法主核和從核的軟件模塊 SW26010處理器參數信息如表5所示,將代碼移植到SW26010處理器首先要完成一個核組內的矩陣乘法基礎計算代碼MATRIXCOMPUTE。利用SW26010下SIMD指令與vldr/vldc和ldder/lddec指令(寄存器互相廣播通信指令),達到高效的性能,最終在1個核組內以256×256規(guī)模計算矩陣的情況下,性能達到621 GFLOPs。 DMA傳輸占比矩陣計算時間過長,如果DMA傳輸和矩陣計算串行運行會顯著降低矩陣乘法計算性能。而消息隊列模型中利用了異步DMA傳輸雙緩沖的思想,DMA傳輸啟動后,軟件系統(tǒng)無須等待DMA結束即可異步地進行其他工作,通過查詢DMA結果即可得知DMA是否已經完成。當從核接收消息時,開始對主核部分中已經處于MasterReady狀態(tài)的消息進行DMA傳輸(可能不止一個消息)。當從核部分具有兩個或以上消息塊,并且主核發(fā)送消息的速度比從核使用消息的速度快時,從核應用程序讀取消息和DMA傳輸過程就可以并行完成。對于矩陣乘法的表現如圖12所示,在主從核建立了3個消息隊列QA、QB、QC,QA、QB隊列均含有兩個消息塊表示為A0、A1、B0、B1,用于接收、小矩陣,只含有1個消息塊用于返回結果小矩陣,MATRIXCOMPUTE表示矩陣計算,操作時序如圖12所示,充分利用國產眾核處理器可以異步DMA傳輸的特性,將DMA傳輸和矩陣計算并行起來,減少傳輸對矩陣乘法性能的影響。 最終想要移植矩陣乘法到國產眾核處理器SW26010,將代碼中矩陣的計算方法MATRIXCOMPUTE由x86下MKL庫的cblas_dgemm方法改為SW26010處理器一個核組內的矩陣乘法計算代碼并調整相應的傳輸數據,然后通過改變表6所述對應的編譯選項便可以移植運行。矩陣乘法代碼按照本文消息隊列模型具有極佳的可移植性。 圖12 雙緩沖操作邏輯 表5 國產眾核處理器SW26010配置 表6 不同平臺的編譯選項 本文模型提供了Makefile文件,在Makefile中修改表6所示的對應選項參數后,執(zhí)行make命令將本文模型編譯成主核與從核的鏈接庫libMHMessQueue.a、libSHMessQueue.a。最后,將應用程序和本鏈接庫編譯鏈接后即可生成不同平臺的應用程序。 本文使用兩種傳輸接口分別進行了矩陣乘法性能測試,一種為使用系統(tǒng)原語DMA傳輸矩陣并計算的性能,另一種為本文的消息隊列模型傳輸矩陣并計算的性能,如表7所示,該表為一個核組內以256×256規(guī)模進行分塊傳輸計算的性能。使用系統(tǒng)原語DMA傳輸矩陣的代碼同樣使用了雙緩沖技術,矩陣乘法的性能達到556 GFLOPs,為單純進行矩陣計算性能的91%,剩下的一些消耗主要在每次小矩陣計算結束后傳輸從核小矩陣的傳輸開銷。而利用消息隊列模型進行矩陣計算的性能為504 GFLOPs,達到了系統(tǒng)原語傳輸矩陣并計算性能的88%,達到一個核組內256×256矩陣的性能的81%。主要因為從核訪問與主核共享的數據是從主存離散訪問,比如一些消息塊的狀態(tài)信息,對于這樣頻繁訪存的應用會有一小部份的性能損耗。 表7 SW26010上的性能測試對比 隨著集成電路技術水平的提高,單個微處理器所包含的內核數量持續(xù)增長,提高單個微處理器的性能是目前提升HPC系統(tǒng)整體性能的主要方法。我國自主開發(fā)了SW26010、Matrix 2000等一系列高性能眾核微處理器,在這些處理器上編程由于眾核處理器無Cache一致性等的結構特點,需要直接使用最底層的接口開發(fā)軟件,編程和調試非常困難,各平臺的高性能線程編程模型和SIMD指令集不能通用。 本文針對國產高性能眾核處理器的線程編程庫不統(tǒng)一的問題,提供了線程控制接口層,用于在多個平臺下控制線程;針對每個計算核采用獨立的存儲器空間不具備Cache一致性,需要程序顯式控制系統(tǒng)主存與各個計算核存儲器之間的數據交換的問題,本文模型提供了消息隊列模型;針對國產高性能眾核處理器SIMD指令集不通用的問題,本文模型提供了SIMD抽象層。 模型應用在口令猜測系統(tǒng)之中,并將系統(tǒng)移植到在多個平臺進行可移植性測試,比較了使用本文模型的代碼性能與直接使用最底層的接口開發(fā)的代碼性能的差異情況。實驗結果表明,使用本文模型增加了可移植性,減少了重復性工作,但性能在線程數較多時會有所下降,未來有待繼續(xù)改進。 [1] 劉鑫,郭恒,孫茹君,等.“神威·太湖之光”計算機系統(tǒng)大規(guī)模應用特征分析與E級可擴展性研究[J].計算機學報,2018,41(10):2209-2220.(LIU X, GUO H, SUN R J, et al. The characteristic analysis and exascale scalability research of large scale parallel applications on “Sunway ·TaihuLight” supercomputer[J]. Chinese Journal of Computers, 2018,41(10):2209-2220.) [2] FU H, LIAO J, YANG J, et al. The Sunway TaihuLight supercomputer: system and applications[J]. Science China Information Sciences, 2016, 59(7): No.072001. [3] LU K, WANG Y, GUO Y, et al. MT-3000: a heterogeneous multi-zone processor for HPC[J]. CCF Transactions on High Performance Computing, 2022, 4(2):150-164. [4] 劉勝,盧凱,郭陽,等. 一種自主設計的面向E級高性能計算的異構融合加速器[J].計算機研究與發(fā)展,2021,58(06):1234-1237.(LIU S, LU K, GUO Y, et al. A self-designed heterogeneous fusion accelerator for exascale high-performance computing[J]. Journal of Computer Research and Development, 2021,58(06):1234-1237.) [5] NAGARAJAN V, SORIN D J, HILL M D, et al. A Primer on Memory Consistency and Cache Coherence[M]. 2nd ed. Cham: Springer, 2020: 10-11. [6] DE SUPINSKI B R, SCOGLAND T R W, DURAN A, et al. The ongoing evolution of OpenMP[J]. Proceedings of the IEEE, 2018, 106(11): 2004-2019. [7] ABBOTT D. Appendix B — Posix threads (pthreads) application programming interface[M]// Linux for Embedded and Real-time Applications, 2nd ed. New York: Elsevier Science Inc.,2006: 275-286. [8] BARKER D J, STUCKEY D C. A review of soluble microbial products (SMP) in wastewater treatment systems[J]. Water Research, 1999, 33(14): 3063-3082. [9] CAROTHERS C D, PERUMALLA K S, FUJIMOTO R M. The effect of state-saving in optimistic simulation on a cache-coherent non-uniform memory access architecture[C]// Proceedings of the 31st Conference on Winter Simulation: Simulation — A Bridge to the Future — Volume 2. New York: ACM, 1999: 1624-1633. [10] GUPTA K, SHARMA T. Changing trends in computer architecture: A comprehensive analysis of ARM and x86 processors[J]. International Journal of Scientific Research in Computer Science Engineering and Information Technology, 2021, 7(3): 619-631. [11] ROBISON A D. Composable parallel patterns with Intel Cilk Plus[J]. Computing in Science and Engineering, 2013, 15(2): 66-71. [12] VOSS M, ASENJO R, REINDERS J. Pro TBB: C++ Parallel Programming with Threading Building Blocks[M]. Berkeley, CA: Apress, 2019: 3-31 [13] NOZAL R, BOSQUE J L. Exploiting co-execution with oneAPI: heterogeneity from a modern perspective[C]// Proceedings of the 27th International Conference on Parallel and Distributed Computing, LNTCS 12820. Cham: Springer, 2021: 501-516. [14] RAMAN S K, PENTKOVSKI V, KESHAVA J. Implementing streaming SIMD extensions on the Pentium III processor[J]. IEEE Micro, 2000, 20(4): 47-57. [15] AMIRI H, SHAHBAHRAMI A. SIMD programming using Intel vector extensions[J]. Journal of Parallel and Distributed Computing, 2020, 135: 83-100 [16] STEPHENS N, BILES S, BOETTCHER M, et al. The ARM scalable vector extension[J]. IEEE Micro, 2017,37(2):26-39 [17] ODAJIMA T, KODAMA Y, SATO M. Performance and power consumption analysis of ARM scalable vector extension[J]. The Journal of Supercomputing, 2021, 77(6): 5757-5778. [18] WANG D, ZHAO R, WANG Q, et al. Outer-loop auto-vectorization for SIMD architectures based on Open64 compiler[C]// Proceedings of the 17th International Conference on Parallel and Distributed Computing, Applications and Technologies. Piscataway: IEEE, 2016: 19-23. [19] TIAN X, SAITO H, SU E, et al. LLVM compiler implementation for explicit parallelization and SIMD vectorization[C]// Proceedings of the 4th Workshop on the LLVM Compiler Infrastructure in HPC. New York: ACM, 2017: No.4. [20] CEBRIáN J M, JAHRE M, NATVIG L. Optimized hardware for suboptimal software: the case for SIMD-aware benchmarks[C]// Proceedings of the 2014 IEEE International Symposium on Performance Analysis of Systems and Software. Piscataway: IEEE, 2014: 66-75. [21] KRETZ M, LINDENSTRUTH V. Vc: a C++ library for explicit vectorization[J]. Software: Practice and Experience, 2012, 42(11): 1409-1430. [22] WANG H, WU P, TANASE I G, et al. Simple, portable and fast SIMD intrinsic programming: generic simd library[C]//Proceedings of the 2014 ACM SIGPLAN Workshop on Programming Models for SIMD/Vector Processing. New York: ACM, 2014: 9-16. [23] FRIGO M, JOHNSON S G. FFTW: an adaptive software architecture for the FFT[C]// Proceedings of the 1998 IEEE International Conference on Acoustics, Speech and Signal Processing, Volume 3. Piscataway: IEEE, 1998: 1381-1384. [24] 華南理工大學,廣東省科技基礎條件平臺中心.基于局部存儲器的主核與從核之間消息傳遞系統(tǒng): 2023100756041[P]. 2023-06-23. (South China University of Technology, Guangdong Science and Technology Infrastructure Center. Message transfer system between master and slave cores based on local memory: 2023100756041.1[P]. 2023-06-23.) [25] MAFFIONE V, LETTIERI G, RIZZO L. Cache-aware design of general-purpose Single-Producer-Single-Consumer queues[J]. Software: Practice and Experience, 2019, 49(5): 748-779. [26] ALMAN J, WILLIAMS V V. A refined laser method and faster matrix multiplication[C]// Proceedings of the 32nd Annual ACM-SIAM Symposium on Discrete Algorithms. Philadelphia, PA: SIAM, 2021: 522-539. Programming model for domestic high-performance many-core processor CHEN Hu1,2, ZHOU Pengling1* (1,,510006,;2,510033,) Programming on domestic high-performance many-core processors has requirement of using the lowest-level interface to develop software, making programming and debugging very difficult. Moreover, the limitations of programming models for high-performance software on these platforms and the absence of common computing software are identified as factors that contribute to repetitive development work. Aiming at the above problems, a generalized programming model and corresponding support library were realized: on the one hand, the thread-level parallelism of domestic high-performance many-core processors based on the message queue mechanism was developed; on the other hand, the data-level parallelism on slave cores based on the Single Instruction Multiple Data (SIMD) programming model was developed. Firstly, the architecture of the domestic high-performance multicore processor was abstracted. Then, a message queue mechanism was designed for the proposed model, along with a set of heterogeneous parallel programming interfaces, including system parameter interface, slave core thread control interface, message queue interface, and SIMD abstraction interface. Finally, a new software development model and methodology for high-performance computing were formed on the basis of the above, which was convenient for users to develop parallel computing software based on domestic high-performance many-core processors. The results of performance transmission test show that the transmission bandwidth of the proposed model on domestic many-core processors generally reaches 90% of the peak DMA(Direct Memory Access) bandwidth when a few multi-cores are turned on; and that the transmission bandwidth of the message queue model generally reaches 70% of the peak DMA bandwidth when a large number of multi-cores are turned on. In matrix multiplication experiments, the performance of the proposed model reaches 90% of the performance of the system’s original primitives for transferring matrices and calculating them; in password guessing system, the performance of the proposed model code is basically the same as that of the code developed by using the lowest-level interface directly. The proposed generalized programming model and support framework make the High Performance Computing (HPC) software development easier and more portable, which can help to promote the development of domestic independent HPC software. domestic many-core processor; Single Instruction Multiple Data (SIMD); parallel programming model; SW26010; message queue model 1001-9081(2023)11-3517-10 10.11772/j.issn.1001-9081.2022101548 2022?10?14; 2023?04?22; 國家自然科學基金重點項目(U1836207); 廣東省高性能計算重點實驗室開放課題。 陳虎(1974—),男,江蘇南京人,副教授,博士,主要研究方向:高性能計算、信息安全; 周鵬靈(1999—),男,湖北鄂州人,碩士研究生,主要研究方向:高性能計算、信息安全。 TP311.1 A 2023?04?24。 This work is partially supported by Key Project of National Natural Science Foundation of China (U1836207), Open Development Project of Guangdong Provincial Key Laboratory of High Performance Computing. CHEN Hu, born in 1974, Ph. D., associate professor. His research interests include high-performance computing, information security. ZHOU Pengling, born in 1999, M. S. candidate. His research interests include high-performance computing, information security.3 編程模型實現
3.1 主要數據結構
3.2 消息隊列結構
3.3 消息的狀態(tài)結構設計和傳遞算法
3.4 從核線程庫的實現
3.5 SIMD抽象設計與實現
4 實驗與結果分析
4.1 數據傳輸測試
4.2 矩陣乘法應用
5 結語