本技術(shù)涉及數(shù)據(jù)處理,尤其涉及一種矩陣存儲(chǔ)方法及裝置。
背景技術(shù):
1、稀疏矩陣數(shù)據(jù)格式(sparse?matrix?data?format)為人工智能(artificialintelligence,ai)、高性能計(jì)算(high?performance?computing,hpc)、圖計(jì)算(graph)、圖神經(jīng)網(wǎng)絡(luò)卷積計(jì)算(gnn)等最重要的數(shù)據(jù)類型。目前,稀疏矩陣數(shù)據(jù)格式主要包括:坐標(biāo)格式(coordinate,coo)、壓縮稀疏行格式(compressed?sparse?row,csr)、壓縮稀疏列格式(compressed?sparse?column,csc)、橢圓方程格式(ellpack?format,ell)等。
2、目前,新型態(tài)的矩陣加速器如cpu、gpu、npu、pim等芯片均蓬勃發(fā)展,稀疏計(jì)算的效率與稠密計(jì)算的落差逐漸變大,現(xiàn)有的稀疏壓縮格式可能已經(jīng)無(wú)法滿足gpu、向量與矩陣單元的高并發(fā)的需求,目前亟需一種新的稀疏矩陣的壓縮存儲(chǔ)方式。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)提供一種矩陣的存儲(chǔ)方法及裝置,用于提供一種新的稀疏矩陣的壓縮存儲(chǔ)方式。
2、第一方面,本技術(shù)提供一種矩陣存儲(chǔ)方法,該方法可以由具有數(shù)據(jù)處理功能的設(shè)備(如計(jì)算設(shè)備)執(zhí)行,也可以由該設(shè)備中的部件(如處理器)執(zhí)行,以計(jì)算設(shè)備為例,在該方法中,計(jì)算設(shè)備可獲取原始矩陣對(duì)應(yīng)的多個(gè)子塊(記為第一子塊),獲取方式有多種,比如,計(jì)算設(shè)備接收用戶輸入的多個(gè)第一子塊,或者,計(jì)算設(shè)備獲取自身存儲(chǔ)的多個(gè)第一子塊,獲取計(jì)算設(shè)備首先獲取原始矩陣,再對(duì)原始矩陣進(jìn)行處理以得到該多個(gè)第一子塊。
3、其中,該多個(gè)第一子塊是計(jì)算設(shè)備或其他設(shè)備對(duì)原始矩陣進(jìn)行切塊、壓縮等處理后得到的,比如,對(duì)原始矩陣以規(guī)模為m1×n1的子塊為單位并對(duì)切塊(其中,m1、n1為正整數(shù)),以得到多個(gè)規(guī)模為m1×n1的子矩陣,然后對(duì)每個(gè)子矩陣中的非零元素按照指定方向(如行方向或列方向)進(jìn)行壓縮,從而得到多個(gè)第一子塊。
4、之后,計(jì)算設(shè)備再對(duì)每個(gè)第一子塊以規(guī)模為m2×n2的子塊為單位進(jìn)行切塊,以得到多個(gè)第二子塊,其中,m2為不大于m1的正整數(shù),n2為不大于n1的正整數(shù),m2×n2的子塊規(guī)模小于m1×n1的子塊規(guī)模。以第二子塊為存儲(chǔ)單位,順序存儲(chǔ)多個(gè)第二子塊的數(shù)據(jù)。
5、通過(guò)上述設(shè)計(jì),獲取原始矩陣對(duì)應(yīng)的多個(gè)第一子塊,多個(gè)第一子塊是對(duì)原始矩陣的多個(gè)子矩陣中的非零元素按照指定方向進(jìn)行壓縮后得到的,之后對(duì)每個(gè)第一子塊再進(jìn)行切小塊,可得到一個(gè)第一子塊對(duì)應(yīng)的多個(gè)第二子塊。
6、其中,將原始矩陣切塊為多個(gè)第一子塊,有利于提高壓縮率,將第一子塊切分為多個(gè)第二子塊進(jìn)行存儲(chǔ),可進(jìn)一步提高壓縮率,如此,就能適應(yīng)任意分布的稀疏矩陣,并且在任意的稀疏矩陣下都能維持較高的壓縮率。以第二子塊為存儲(chǔ)單位順序,存儲(chǔ)多個(gè)第二子塊的方式,可方便內(nèi)存訪問(wèn),一次內(nèi)存訪問(wèn)就能夠?qū)⒅辽僖粋€(gè)完整的第二子塊讀取出來(lái),減少稀疏矩陣計(jì)算時(shí)對(duì)內(nèi)存的訪問(wèn)次數(shù),且由于第二子塊的所有行長(zhǎng)度是一致的、所有列的長(zhǎng)度是一致的,它提供給一個(gè)對(duì)于向量處理器或矩陣處理器更友善的數(shù)據(jù)訪問(wèn)方式,對(duì)于行順序或列順序的訪問(wèn)都可能達(dá)到較好的局部性,能夠較高效率的與專用硬件加速器做適配,有利于提高稀疏矩陣計(jì)算的并行度,一方面,一次內(nèi)存訪問(wèn)可讀取多個(gè)完整的第二子塊,該多個(gè)第二子塊可分別由多個(gè)專用硬件加速器來(lái)并行計(jì)算,這可以提高多核并行度。另一方面,由于一個(gè)第二子塊可提供給一個(gè)專用硬件加速器充足的數(shù)據(jù)量,更適合于專用硬件加速器來(lái)加速計(jì)算,有利于提高單個(gè)專用加速器的核內(nèi)并行度,專用硬件加速器的性能可大幅提升。
7、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:
8、計(jì)算設(shè)備獲取每個(gè)第一子塊的下標(biāo)數(shù)據(jù),獲取方式有多種,如計(jì)算設(shè)備接收用戶輸入的每個(gè)第一子塊的下標(biāo)數(shù)據(jù),或者,計(jì)算設(shè)備獲取自身存儲(chǔ)的每個(gè)第一子塊的下標(biāo)數(shù)據(jù),或者,計(jì)算設(shè)備根據(jù)獲取的原始矩陣確定每個(gè)第一子塊的下標(biāo)數(shù)據(jù)。在一些情況中,第一子塊的下標(biāo)數(shù)據(jù)可以與第一子塊一起獲取,具體不做限定。
9、以一個(gè)第一子塊為例,第一子塊的下標(biāo)數(shù)據(jù)用于指示該第一子塊內(nèi)每個(gè)元素在原始矩陣的位置(下標(biāo),即行、列號(hào));該第一子塊的下標(biāo)數(shù)據(jù)包括該第一子塊對(duì)應(yīng)的位移值對(duì)、索引矩陣、索引向量;如下分別進(jìn)行介紹:
10、在一種示例中,當(dāng)指定方向?yàn)樾蟹较驎r(shí):
11、(1)位移值對(duì)包括一對(duì)位移值,記為第一位移值和第二位移值,其中,第一位移值用于指示該第一子塊的首行(即起始行)在原始矩陣中的對(duì)應(yīng)行相對(duì)原始矩陣的起始行(如第0行)的第一偏移量,第二位移值用于指示所述第一子塊的首列(即其實(shí)列)在原始矩陣中的對(duì)應(yīng)列相對(duì)原始矩陣的起始列(如第0列)的第二偏移量;
12、(2)索引矩陣內(nèi)的任一元素(如第一元素)的值等于第一子塊中與第一元素對(duì)應(yīng)的元素在原始矩陣中的列號(hào)與第二偏移量之間的差值。其中,索引矩陣中的多個(gè)元素與第一子塊中的多個(gè)元素一一對(duì)應(yīng)。
13、(3)索引向量中任一元素(如第二元素)的值用于指示第一子塊中與第二元素對(duì)應(yīng)的元素在原始矩陣中的行號(hào)與第一偏移量之間的差值。其中,索引向量中的多個(gè)元素與第一子塊的每一行一一對(duì)應(yīng)。
14、在另一種示例中,當(dāng)指定方向?yàn)榱蟹较驎r(shí):
15、1)位移值對(duì)包括一對(duì)位移值,記為第一位移值和第二位移值,其中,第一位移值用于指示該第一子塊的首行(即起始行)在原始矩陣中的對(duì)應(yīng)行相對(duì)原始矩陣的起始行(如第0行)的第一偏移量,第二位移值用于指示所述第一子塊的首列(即其實(shí)列)在原始矩陣中的對(duì)應(yīng)列相對(duì)原始矩陣的起始列(如第0列)的第二偏移量;
16、2)索引矩陣中的多個(gè)元素與第一子塊中的多個(gè)元素一一對(duì)應(yīng),索引矩陣內(nèi)的任一元素(如第一元素)的值等于第一子塊中與第一元素對(duì)應(yīng)的元素在原始矩陣中的行號(hào)與第一偏移量之間的差值。其中,索引矩陣中的多個(gè)元素與第一子塊中的多個(gè)元素一一對(duì)應(yīng)。
17、3)索引向量中任一元素(如第二元素)的值用于指示第一子塊中與第二元素對(duì)應(yīng)的元素在原始矩陣中的列號(hào)與第二偏移量之間的差值。其中,索引向量中的多個(gè)元素與第一子塊的每一行一一對(duì)應(yīng)。
18、通過(guò)上述設(shè)計(jì),對(duì)原始矩陣進(jìn)行切塊主要能夠優(yōu)化元素的下標(biāo)數(shù)據(jù),將原始矩陣的全局下標(biāo)數(shù)據(jù)拆分為子矩陣的位移值對(duì)、索引數(shù)組和索引向量,本領(lǐng)域技術(shù)人員可知,當(dāng)原始矩陣的規(guī)模較大時(shí),原本全局下標(biāo)數(shù)據(jù)范圍通常為高精度如int64或int32,數(shù)據(jù)量也比較大,通過(guò)本技術(shù)實(shí)施例的方法切塊后的每個(gè)子矩陣的下標(biāo)數(shù)據(jù)范圍會(huì)變小,只需要較低的下標(biāo)精度,如使用int16或int8即可完整的包括下標(biāo)范圍,每個(gè)子矩陣只需要統(tǒng)一存儲(chǔ)一個(gè)位移值對(duì),整個(gè)子矩陣所需要存儲(chǔ)的下標(biāo)數(shù)據(jù)的數(shù)據(jù)量可大幅下降。
19、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:前述的多個(gè)第二子塊包括多個(gè)第三子塊,多個(gè)第三子塊是對(duì)每個(gè)第一子塊對(duì)應(yīng)的索引矩陣以規(guī)模為m2×n2的子塊為單位進(jìn)行切塊后得到的。
20、在一種可能的實(shí)現(xiàn)方式中,計(jì)算設(shè)備存儲(chǔ)第二子塊和第三子塊的映射關(guān)系,在該映射關(guān)系中多個(gè)第二子塊與多個(gè)第三子塊一一對(duì)應(yīng),具體的,以一個(gè)第一子塊為例,該映射關(guān)系中該第一子塊對(duì)應(yīng)的多個(gè)第二子塊與第一子塊對(duì)應(yīng)的索引矩陣對(duì)應(yīng)的多個(gè)第三子塊一一對(duì)應(yīng);
21、存儲(chǔ)第二子塊的方式為:以多個(gè)第一子塊的行順序或列順序選擇第一子塊,然后以第二子塊為存儲(chǔ)模塊,按照行方向從被選擇的第一子塊中順序選擇第二子塊進(jìn)行存儲(chǔ),每個(gè)第二子塊內(nèi)的元素可按照行順序或列順序進(jìn)行存儲(chǔ)。同理,存儲(chǔ)第三子塊的方式可以為:以第三子塊為單元,按照行方向從被選擇第一子塊對(duì)應(yīng)的索引矩陣中順序選擇第三子塊進(jìn)行存儲(chǔ)。或者,對(duì)多個(gè)第一子塊對(duì)應(yīng)的全部第二子塊按照行順序或列順序進(jìn)行排列,再對(duì)排列后的全部第二子塊按行順序或列順序順序選擇第二子塊進(jìn)行存儲(chǔ),同理,對(duì)多個(gè)第一子塊對(duì)應(yīng)的全部第三子塊按照行順序或列順序進(jìn)行排列,再對(duì)排列后的全部第三子塊按行順序或列順序順序選擇第三子塊進(jìn)行存儲(chǔ)。
22、其中,多個(gè)第二子塊和多個(gè)第三子塊可以分開(kāi)存儲(chǔ),也可以間隔存儲(chǔ)。分開(kāi)存儲(chǔ)是指,多個(gè)第二子塊存儲(chǔ)在第一存儲(chǔ)空間,在第一存儲(chǔ)空間內(nèi)該多個(gè)第二子塊順序存儲(chǔ),比如,該第一存儲(chǔ)空間內(nèi)的一種存儲(chǔ)順序?yàn)椋旱诙訅Ka、第二子塊b、第二子塊c,依此類推。類似的,多個(gè)第三子塊存儲(chǔ)在第二存儲(chǔ)空間,在第二存儲(chǔ)空間內(nèi)該多個(gè)第三子塊連續(xù)存儲(chǔ)。比如,該第二存儲(chǔ)空間內(nèi)的一種存儲(chǔ)順序?yàn)椋旱诙訅Ka對(duì)應(yīng)的第三子塊、第二子塊b對(duì)應(yīng)的第三子塊、第二子塊c對(duì)應(yīng)的第三子塊,依此類推。這樣,在順序讀取多個(gè)第二子塊時(shí),也可以順序讀取該多個(gè)第二子塊對(duì)應(yīng)的第三子塊。
23、間隔存儲(chǔ)是指以第二子塊和第三子塊相鄰的方式存儲(chǔ),即以一個(gè)第二子塊和第二子塊對(duì)應(yīng)的第三子塊為一個(gè)存儲(chǔ)模塊,順序存儲(chǔ)每個(gè)第二子塊及該第二子塊對(duì)應(yīng)的第三子塊,比如,一種存儲(chǔ)順序?yàn)椋旱诙訅Ka、第二子塊a對(duì)應(yīng)第三子塊,第二子塊b、第二子塊b對(duì)應(yīng)的第三子塊、第二子塊c,依此類推。這樣,通過(guò)一次內(nèi)存訪問(wèn)可連續(xù)讀取第二子塊和第二子塊對(duì)應(yīng)的第三子塊。
24、可選的,順序存儲(chǔ)的多個(gè)第二子塊和/或多個(gè)第三子塊的地址連續(xù),如此方便數(shù)據(jù)讀取和預(yù)取。
25、通過(guò)上述設(shè)計(jì),基于該存儲(chǔ)方式可以通過(guò)一次數(shù)據(jù)存取完成連續(xù)多個(gè)第二子塊和/或第三子塊的數(shù)據(jù)存取,方便內(nèi)存訪問(wèn),有利于減少稀疏矩陣計(jì)算時(shí)對(duì)內(nèi)存的訪問(wèn)次數(shù),能夠較高效率的與專用硬件加速器做適配,有利于提高稀疏矩陣計(jì)算的并行度。
26、在一種可能的實(shí)現(xiàn)方式中,計(jì)算設(shè)備所存儲(chǔ)的每個(gè)第二子塊包括至少一個(gè)非零元素;在一些情況中,計(jì)算設(shè)備順序存儲(chǔ)每個(gè)第二子塊內(nèi)的元素的值之前,包括:剔除包括全零元素的第二子塊。
27、通過(guò)上述設(shè)計(jì),對(duì)于全零的第二子塊可以被完全刪除,不需要存儲(chǔ),如此,就能適應(yīng)任意分布的稀疏矩陣,并且在任意的稀疏矩陣下都能維持較高的壓縮率。
28、第二方面,本技術(shù)實(shí)施例提供一種矩陣計(jì)算裝置,該裝置具有實(shí)現(xiàn)上述第一方面及第一方面任一種可能的實(shí)現(xiàn)方法實(shí)例中計(jì)算設(shè)備行為的功能,有益效果可以參見(jiàn)第一方面的描述此處不再贅述。功能可以通過(guò)硬件實(shí)現(xiàn),也可以通過(guò)硬件執(zhí)行相應(yīng)的軟件實(shí)現(xiàn)。硬件或軟件包括一個(gè)或多個(gè)與上述功能相對(duì)應(yīng)的模塊。在一個(gè)可能的設(shè)計(jì)中,裝置的結(jié)構(gòu)中包括獲取模塊、處理模塊、存儲(chǔ)模塊,這些模塊可以執(zhí)行上述第一方面及第一方面任一種可能的實(shí)現(xiàn)方法實(shí)例中計(jì)算設(shè)備的行為的功能,具體參見(jiàn)方法示例中的詳細(xì)描述,此處不做贅述。
29、第三方面,本技術(shù)實(shí)施例提供一種計(jì)算設(shè)備,該計(jì)算設(shè)備具有實(shí)現(xiàn)上述第一方面及第一方面任一種可能的實(shí)現(xiàn)方法實(shí)例中計(jì)算設(shè)備行為的功能,有益效果可以參見(jiàn)第一方面的描述此處不再贅述。計(jì)算設(shè)備的結(jié)構(gòu)中包括處理器和存儲(chǔ)器,處理器被配置為支持裝置執(zhí)行上述第一方面的方法示例中計(jì)算設(shè)備的相應(yīng)功能。存儲(chǔ)器與處理器耦合,其保存通信裝置必要的程序指令和數(shù)據(jù)。通信裝置的結(jié)構(gòu)中還包括通信接口,用于與其他設(shè)備進(jìn)行通信。
30、第四方面,本技術(shù)還提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中存儲(chǔ)有指令,當(dāng)其在計(jì)算機(jī)上運(yùn)行時(shí),使得計(jì)算機(jī)執(zhí)行上述第一方面以及第一方面的各個(gè)可能的實(shí)施方式中的方法,或使得計(jì)算機(jī)執(zhí)行上述第一方面以及第一方面的各個(gè)可能的實(shí)施方式中的方法。
31、第五方面,本技術(shù)還提供一種包含指令的計(jì)算機(jī)程序產(chǎn)品,當(dāng)其在計(jì)算機(jī)上運(yùn)行時(shí),使得計(jì)算機(jī)執(zhí)行上述第一方面以及第一方面的各個(gè)可能的實(shí)施方式中的方法,或使得計(jì)算機(jī)執(zhí)行上述第一方面以及第一方面的各個(gè)可能的實(shí)施方式中的方法。
32、第六方面,本技術(shù)還提供一種計(jì)算機(jī)芯片,芯片與存儲(chǔ)器相連,芯片用于讀取并執(zhí)行存儲(chǔ)器中存儲(chǔ)的軟件程序,執(zhí)行上述第一方面以及第一方面的各個(gè)可能的設(shè)計(jì)中的方法,或使得計(jì)算機(jī)執(zhí)行上述第一方面以及第一方面的各個(gè)可能的實(shí)施方式中的方法。