優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法
【專利摘要】本發(fā)明公開了一種優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法。本發(fā)明方法采用的QCSR存儲(chǔ)結(jié)構(gòu)結(jié)合四叉樹結(jié)構(gòu)和CSR存儲(chǔ)結(jié)構(gòu)的優(yōu)勢(shì)對(duì)稀疏矩陣進(jìn)行遞歸式分解和重排列實(shí)現(xiàn)稀疏矩陣的存儲(chǔ),使得稀疏矩陣向量乘運(yùn)行過程對(duì)矩陣形式更具有普適性,尤其適用于總體稀疏但局部存在較多稠密子矩陣的矩陣。本發(fā)明方法在CPU/GPU異構(gòu)并行系統(tǒng)上通過線程映射優(yōu)化、數(shù)據(jù)存取優(yōu)化、數(shù)據(jù)傳輸優(yōu)化和數(shù)據(jù)復(fù)用優(yōu)化四個(gè)策略實(shí)現(xiàn)了基于QCSR存儲(chǔ)結(jié)構(gòu)的稀疏矩陣向量乘。本發(fā)明所公開的方法可在稀疏矩陣向量乘數(shù)值計(jì)算過程提高數(shù)據(jù)局部性和緩存命中率,取得了更好的計(jì)算加速和整體加速效果,進(jìn)而提升了不可壓縮管流模擬效率。
【專利說明】?jī)?yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于流體力學(xué)數(shù)值模擬,尤其涉及一種優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法。
【背景技術(shù)】
[0002]不可壓縮管流問題作為流體力學(xué)的重要研究對(duì)象,對(duì)此進(jìn)行的研究成果被廣泛應(yīng)用于等離子體物理學(xué)、磁流體力學(xué)和天體物理學(xué)等相關(guān)領(lǐng)域的科學(xué)研究和工業(yè)技術(shù)中。隨著計(jì)算機(jī)科學(xué)技術(shù)的發(fā)展,需經(jīng)過現(xiàn)場(chǎng)試驗(yàn)才能解決的不可壓縮管流問題已可以由計(jì)算機(jī)數(shù)值模擬方法解決。不可壓縮管流模擬需求解大型線性方程組,即形式O為矩陣
辦為向量),而求解方程組的矩陣^往往是稀疏矩陣,其中非零元素?cái)?shù)目占矩陣總?cè)萘坎蛔?%。因此可以通過優(yōu)化稀疏向量矩陣乘過程來提升不可壓縮管流模擬的效率。
[0003]稀疏矩陣向量乘運(yùn)算因矩陣稀疏模式與存儲(chǔ)格式,矩陣元素缺乏時(shí)間局部性,非零元素的間接內(nèi)存引用和向量的不規(guī)則訪問等因素導(dǎo)致計(jì)算性能并不高。當(dāng)前研究主要從降低時(shí)間復(fù)雜度和計(jì)算機(jī)體系結(jié)構(gòu)兩方面改進(jìn)稀疏矩陣向量乘運(yùn)算的效果。降低稀疏矩陣向量乘的時(shí)間復(fù)雜度的優(yōu)化方法在大規(guī)模矩陣運(yùn)算過程中因浮點(diǎn)運(yùn)算操作會(huì)導(dǎo)致誤差累積,主要適用于對(duì)精度要求低的領(lǐng)域。針對(duì)計(jì)算機(jī)處理器體系結(jié)構(gòu)特點(diǎn)進(jìn)行稀疏矩陣向量乘優(yōu)化的方法主要從數(shù)據(jù)結(jié)構(gòu)的改進(jìn)、底層指令優(yōu)化、并行優(yōu)化技術(shù)和自動(dòng)調(diào)優(yōu)等四方面提聞了運(yùn)算效率。
[0004]這些方法受矩陣非零元素分布特性的影響大,并不具有一般性。對(duì)于總體稀疏但局部存在較多稠密子矩陣特點(diǎn)的矩陣,基于傳統(tǒng)稀疏矩陣存儲(chǔ)格式的稀疏矩陣向量乘運(yùn)算的空間和時(shí)間局部性較差,為此進(jìn)行的優(yōu)化也會(huì)引入額外的開銷,不可壓縮管流的模擬效率仍有待提升。
【發(fā)明內(nèi)容】
[0005]針對(duì)上述方法存在的問題,本發(fā)明提出一種優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法,通過結(jié)合四叉樹結(jié)構(gòu)和CSR存儲(chǔ)結(jié)構(gòu)的組合優(yōu)勢(shì)對(duì)稀疏矩陣進(jìn)行遞歸式分解和重排列實(shí)現(xiàn)稀疏矩陣的存儲(chǔ),并在CPU/GPU異構(gòu)并行系統(tǒng)上實(shí)現(xiàn)基于QCSR存儲(chǔ)結(jié)構(gòu)的高效稀疏矩陣向量乘方法。本發(fā)明所公開的方法可在稀疏矩陣向量乘數(shù)值計(jì)算過程中更有效提高數(shù)據(jù)局部性和緩存命中率,并且更具有普適性,取得了更好的計(jì)算加速和整體加速效果,進(jìn)而提升了不可壓縮管流的效率。
[0006]本發(fā)明方法的具體步驟如下:
步驟1、讀取方程組,利用QCSR存儲(chǔ)結(jié)構(gòu)存儲(chǔ)稀疏矩陣。首先按照行主序依次讀入稀疏矩陣的非零元素,然后按照分塊方式對(duì)矩陣進(jìn)行行平均劃分,并根據(jù)列主序?qū)γ總€(gè)劃分塊內(nèi)的元素重新排序存儲(chǔ),在當(dāng)前劃分塊區(qū)間內(nèi),以第一個(gè)未在塊區(qū)間內(nèi)的非零元素所在列為起始列,按分塊方式對(duì)矩陣進(jìn)行列平均劃分,如此遞歸進(jìn)行劃分。最后,當(dāng)子矩陣塊大小小于設(shè)定的分塊大小時(shí),遞歸劃分矩陣結(jié)束,得到葉子結(jié)點(diǎn)分塊矩陣,依次保存各葉子結(jié)點(diǎn)邊界內(nèi)的元素信息即可完成存儲(chǔ)。此時(shí)葉子結(jié)點(diǎn)分塊矩陣的大小與Cache容量相適應(yīng)。
[0007]步驟2、將轉(zhuǎn)換后的稀疏矩陣數(shù)據(jù)傳輸?shù)紾PU。采用分頁鎖定的傳輸方式申請(qǐng)一塊寫結(jié)合類型的內(nèi)存,再將稀疏矩陣的非零元素拷貝到全局存儲(chǔ)器,降低了數(shù)據(jù)傳輸?shù)臅r(shí)間。
[0008]步驟3、數(shù)據(jù)存取優(yōu)化。全局存儲(chǔ)器訪問方式采用硬件優(yōu)化的合并訪問模式,采用線程塊中連續(xù)的線程訪問連續(xù)元素,計(jì)算出非零元素的部分乘積。為了滿足合并訪問模式的要求,對(duì)稀疏矩陣進(jìn)行數(shù)組尾部補(bǔ)零對(duì)齊,使每行元素個(gè)數(shù)為16的倍數(shù),起始全局存儲(chǔ)器地址對(duì)齊到訪問數(shù)據(jù)長度的16倍。
[0009]步驟4、線程映射優(yōu)化。一個(gè)線程塊對(duì)應(yīng)一個(gè)行分塊,線程塊中的線程對(duì)應(yīng)一個(gè)葉子節(jié)點(diǎn)分塊的一行,為每個(gè)矩陣行分配一個(gè)線程串完成矩陣中相對(duì)應(yīng)的一行非零元素的計(jì)算。為了降低稀疏矩陣非零元素分布的影響,在已經(jīng)進(jìn)行補(bǔ)零對(duì)齊的基礎(chǔ)上,各線程塊先計(jì)算含有葉子節(jié)點(diǎn)分塊數(shù)目較多的行分塊。最后將各個(gè)線程計(jì)算的結(jié)果并行求和規(guī)約得到最終的計(jì)算結(jié)果。
[0010]步驟5、數(shù)據(jù)復(fù)用優(yōu)化。利用共享存儲(chǔ)器存儲(chǔ)中間結(jié)果元素和行索引,利用紋理存儲(chǔ)器存儲(chǔ)輸入向量。
[0011]步驟6、執(zhí)行稀疏矩陣向量乘數(shù)值計(jì)算。利用GPU的編程模型CUDA實(shí)現(xiàn)稀疏矩陣向量乘的并行運(yùn)算。
[0012]步驟7、將計(jì)算結(jié)果傳輸?shù)紺PU。通過并行運(yùn)算得到稀疏矩陣向量乘的結(jié)果,并將結(jié)果向量傳輸?shù)紺PU。
[0013]本發(fā)明提供的優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法,具有以下優(yōu)勢(shì):
1、采用高度壓縮及靈活方便的QCSR存儲(chǔ)結(jié)構(gòu),可在稀疏矩陣向量乘數(shù)值計(jì)算過程中更有效提高數(shù)據(jù)局部性和緩存命中率,同時(shí)通過對(duì)矩陣存儲(chǔ)的重排序,降低了運(yùn)算過程中矩陣內(nèi)非零元素分布的影響因素,更具有普適性。
[0014]2、采用CPU/GPU協(xié)同運(yùn)算方法,并結(jié)合線程映射優(yōu)化、數(shù)據(jù)存取優(yōu)化、數(shù)據(jù)傳輸優(yōu)化和數(shù)據(jù)復(fù)用優(yōu)化四個(gè)策略,提高了稀疏矩陣向量乘的加速效率,進(jìn)而提升了不可壓縮管流的模擬效率。
【專利附圖】
【附圖說明】
[0015]圖1為本發(fā)明流程圖。
【具體實(shí)施方式】
[0016]下面結(jié)合附圖和實(shí)施方法對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。
[0017]如圖1所示,本發(fā)明方法包括以下步驟:
步驟1、讀取方程組,利用QCSR存儲(chǔ)結(jié)構(gòu)存儲(chǔ)稀疏矩陣。首先按照行主序依次讀入稀疏矩陣的非零元素,然后按照分塊方式對(duì)矩陣進(jìn)行行平均劃分,并根據(jù)列主序?qū)γ總€(gè)劃分塊內(nèi)的元素重新排序存儲(chǔ),在當(dāng)前劃分塊區(qū)間內(nèi),以第一個(gè)未在塊區(qū)間內(nèi)的非零元素所在列為起始列,按分塊方式對(duì)矩陣進(jìn)行列平均劃分,如此遞歸進(jìn)行劃分。最后,當(dāng)子矩陣塊大小小于設(shè)定的分塊大小時(shí),遞歸劃分矩陣結(jié)束,得到葉子結(jié)點(diǎn)分塊矩陣,依次保存各葉子結(jié)點(diǎn)邊界內(nèi)的元素信息即可完成存儲(chǔ)。此時(shí)葉子結(jié)點(diǎn)分塊矩陣的大小與Cache容量相適應(yīng)。[0018]步驟2、將轉(zhuǎn)換后的稀疏矩陣數(shù)據(jù)傳輸?shù)紾PU。采用分頁鎖定的傳輸方式申請(qǐng)一塊寫結(jié)合類型的內(nèi)存,再將稀疏矩陣的非零元素拷貝到全局存儲(chǔ)器,降低了數(shù)據(jù)傳輸?shù)臅r(shí)間。
[0019]步驟3、數(shù)據(jù)存取優(yōu)化。全局存儲(chǔ)器訪問方式采用硬件優(yōu)化的合并訪問模式,采用線程塊中連續(xù)的線程訪問連續(xù)元素,計(jì)算出非零元素的部分乘積。為了滿足合并訪問模式的要求,對(duì)稀疏矩陣進(jìn)行數(shù)組尾部補(bǔ)零對(duì)齊,使每行元素個(gè)數(shù)為16的倍數(shù),起始全局存儲(chǔ)器地址對(duì)齊到訪問數(shù)據(jù)長度的16倍。
[0020]步驟4、線程映射優(yōu)化。一個(gè)線程塊對(duì)應(yīng)一個(gè)行分塊,線程塊中的線程對(duì)應(yīng)一個(gè)葉子節(jié)點(diǎn)分塊的一行,為每個(gè)矩陣行分配一個(gè)線程串完成矩陣中相對(duì)應(yīng)的一行非零元素的計(jì)算。為了降低稀疏矩陣非零元素分布的影響,在已經(jīng)進(jìn)行補(bǔ)零對(duì)齊的基礎(chǔ)上,各線程塊先計(jì)算含有葉子節(jié)點(diǎn)分塊數(shù)目較多的行分塊。最后將各個(gè)線程計(jì)算的結(jié)果并行求和規(guī)約得到最終的計(jì)算結(jié)果。
[0021]步驟5、數(shù)據(jù)復(fù)用優(yōu)化。利用共享存儲(chǔ)器存儲(chǔ)中間結(jié)果元素和行索引,利用紋理存儲(chǔ)器存儲(chǔ)輸入向量。
[0022]步驟6、執(zhí)行稀疏矩陣向量乘數(shù)值計(jì)算。利用GPU的編程模型CUDA實(shí)現(xiàn)稀疏矩陣向量乘的并行運(yùn)算。
[0023]步驟7、將計(jì)算結(jié)果傳輸?shù)紺PU。通過并行運(yùn)算得到稀疏矩陣向量乘的結(jié)果,并將結(jié)果向量傳輸?shù)紺PU。
【權(quán)利要求】
1.優(yōu)化稀疏矩陣向量乘提升不可壓縮管流模擬效率的方法,其特征在于該方法具體是: 步驟1、讀取方程組,利用QCSR存儲(chǔ)結(jié)構(gòu)存儲(chǔ)稀疏矩陣:首先按照行主序依次讀入稀疏矩陣的非零元素,然后按照分塊方式對(duì)矩陣進(jìn)行行平均劃分,并根據(jù)列主序?qū)γ總€(gè)劃分塊內(nèi)的元素重新排序存儲(chǔ),在當(dāng)前劃分塊區(qū)間內(nèi),以第一個(gè)未在塊區(qū)間內(nèi)的非零元素所在列為起始列,按分塊方式對(duì)矩陣進(jìn)行列平均劃分依次遞歸劃分;最后,當(dāng)子矩陣塊大小小于設(shè)定的分塊大小時(shí),矩陣遞歸劃分結(jié)束,獲取葉子結(jié)點(diǎn)分塊矩陣并保存各葉子結(jié)點(diǎn)邊界內(nèi)的元素信息即可完成存儲(chǔ),此時(shí)葉子結(jié)點(diǎn)分塊矩陣的大小與Cache容量相適應(yīng); 步驟2、將轉(zhuǎn)換后的稀疏矩陣數(shù)據(jù)傳輸?shù)紾PU:采用分頁鎖定的傳輸方式申請(qǐng)一塊寫結(jié)合類型的內(nèi)存,再將稀疏矩陣的非零元素拷貝到全局存儲(chǔ)器; 步驟3、數(shù)據(jù)存取優(yōu)化:全局存儲(chǔ)器訪問方式采用硬件優(yōu)化的合并訪問模式,采用線程塊中連續(xù)的線程訪問連續(xù)元素,計(jì)算出非零元素的部分乘積,為了滿足合并訪問模式的要求,對(duì)稀疏矩陣進(jìn)行數(shù)組尾部補(bǔ)零對(duì)齊,使每行元素個(gè)數(shù)為16的倍數(shù),起始全局存儲(chǔ)器地址對(duì)齊到訪問數(shù)據(jù)長度的16倍; 步驟4、線程映射優(yōu)化:一個(gè)線程塊對(duì)應(yīng)一個(gè)行分塊,線程塊中的線程對(duì)應(yīng)一個(gè)葉子節(jié)點(diǎn)分塊的一行,為每個(gè)矩陣行分配一個(gè)線程串完成矩陣中相對(duì)應(yīng)的一行非零元素的計(jì)算,為了降低稀疏矩陣非零元素分布的影響,在已經(jīng)進(jìn)行補(bǔ)零對(duì)齊的基礎(chǔ)上,各線程塊先計(jì)算含有葉子節(jié)點(diǎn)分塊數(shù)目較多的行分塊;最后將各個(gè)線程計(jì)算的結(jié)果并行求和規(guī)約得到最終的計(jì)算結(jié)果; 步驟5、數(shù)據(jù)復(fù)用優(yōu)化:利用共享存儲(chǔ)器存儲(chǔ)中間結(jié)果元素和行索引,利用紋理存儲(chǔ)器存儲(chǔ)輸入向量; 步驟6、執(zhí)行稀疏矩陣向量乘數(shù)值計(jì)算:利用GPU的編程模型CUDA實(shí)現(xiàn)稀疏矩陣向量乘的并行運(yùn)算: 步驟7、將計(jì)算結(jié)果傳輸?shù)紺PU:通過并行運(yùn)算得到稀疏矩陣向量乘的結(jié)果,并將結(jié)果向量傳輸?shù)紺PU。
【文檔編號(hào)】G06F9/38GK103984527SQ201410129845
【公開日】2014年8月13日 申請(qǐng)日期:2014年4月1日 優(yōu)先權(quán)日:2014年4月1日
【發(fā)明者】張紀(jì)林, 萬健, 劉恩益, 毛潔, 任永堅(jiān), 任祖杰, 殷昱煜, 蔣從鋒, 周麗 申請(qǐng)人:杭州電子科技大學(xué)