本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種用于執(zhí)行矩陣乘運(yùn)算的裝置和方法。
背景技術(shù):
當(dāng)前計(jì)算機(jī)領(lǐng)域,伴隨著大數(shù)據(jù)、機(jī)器學(xué)習(xí)等新興技術(shù)的成熟,越來(lái)越多的任務(wù)中包含了各種各樣的矩陣乘運(yùn)算,尤其是大矩陣的乘運(yùn)算,這些往往成為算法速度和效果提高的瓶頸。以目前火熱的深度學(xué)習(xí)為例,其中就包含著大量的矩陣乘運(yùn)算。在深度學(xué)習(xí)的人工神經(jīng)網(wǎng)絡(luò)全連接層中,輸出神經(jīng)元的運(yùn)算表達(dá)式為y=f(wx+b),其中w是權(quán)值矩陣,x是輸入向量,b是偏置向量,計(jì)算輸出矩陣y的過(guò)程為矩陣w與向量x相乘,加上向量b,然后對(duì)得到的向量進(jìn)行激活函數(shù)運(yùn)算(即對(duì)矩陣中的每個(gè)元素進(jìn)行激活函數(shù)運(yùn)算)。在這個(gè)過(guò)程中,矩陣乘向量運(yùn)算的復(fù)雜度遠(yuǎn)高于之后的加偏置和做激活的操作,高效的實(shí)現(xiàn)前者對(duì)于整個(gè)運(yùn)算過(guò)程有著最重要的影響。由此可見(jiàn),高效實(shí)現(xiàn)矩陣乘運(yùn)算是提升許多計(jì)算機(jī)算法的有效方法。
在現(xiàn)有技術(shù)中,一種進(jìn)行矩陣運(yùn)算的已知方案是使用通用處理器,該方法通過(guò)通用寄存器堆和通用功能部件來(lái)執(zhí)行通用指令,從而執(zhí)行矩陣乘運(yùn)算。然而,該方法的缺點(diǎn)之一是單個(gè)通用處理器多用于標(biāo)量計(jì)算,在進(jìn)行矩陣運(yùn)算時(shí)運(yùn)算性能較低。而使用多個(gè)通用處理器并行執(zhí)行時(shí),處理器的個(gè)數(shù)較少提升的效果不做夠顯著;處理器個(gè)數(shù)較高時(shí)它們之間的相互通訊又有可能成為性能瓶頸。
在另一種現(xiàn)有技術(shù)中,使用圖形處理器(gpu)來(lái)進(jìn)行一系列矩陣乘計(jì)算,其中,通過(guò)使用通用寄存器堆和通用流處理單元執(zhí)行通用simd指令來(lái)進(jìn)行運(yùn)算。但在上述方案中,gpu片上緩存太小,在進(jìn)行大規(guī)模矩陣運(yùn)算時(shí)需要不斷進(jìn)行片外數(shù)據(jù)搬運(yùn),片外帶寬成為了主要性能瓶頸。
在另一種現(xiàn)有技術(shù)中,使用專門(mén)定制的矩陣運(yùn)算裝置來(lái)進(jìn)行矩陣乘運(yùn)算,其中,使用定制的寄存器堆和定制的處理單元進(jìn)行矩陣運(yùn)算。然而根據(jù)這種方法,目前已有的專用矩陣運(yùn)算裝置受限于寄存器堆的設(shè)計(jì),不能夠靈活地支持不同長(zhǎng)度的矩陣運(yùn)算。
綜上所述,現(xiàn)有的不管是片上多核通用處理器、片間互聯(lián)通用處理器(單核或多核)、還是片間互聯(lián)圖形處理器都無(wú)法進(jìn)行高效的矩陣乘運(yùn)算,并且這些現(xiàn)有技術(shù)在處理矩陣乘運(yùn)算問(wèn)題時(shí)存在著代碼量大,受限于片間通訊,片上緩存不夠,支持的矩陣規(guī)模不夠靈活等問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
基于此,本發(fā)明提供了一種執(zhí)行矩陣乘運(yùn)算的裝置和方法。
根據(jù)本發(fā)明一方面,提供了一種用于執(zhí)行矩陣乘運(yùn)算的裝置,其特征在于,包括:存儲(chǔ)單元,用于存儲(chǔ)矩陣運(yùn)算指令相關(guān)的矩陣數(shù)據(jù);寄存器單元,用于存儲(chǔ)矩陣運(yùn)算指令相關(guān)的標(biāo)量數(shù)據(jù);控制單元,用于對(duì)矩陣運(yùn)算指令進(jìn)行譯碼,并控制矩陣運(yùn)算指令的運(yùn)算過(guò)程;矩陣運(yùn)算單元,用于根據(jù)譯碼后的矩陣運(yùn)算指令,對(duì)輸入矩陣進(jìn)行矩陣乘運(yùn)算操作;其中,所述矩陣運(yùn)算單元為定制的硬件電路。
根據(jù)本發(fā)明另一方面,提供了一種用于執(zhí)行矩陣乘運(yùn)算的裝置,其特征在于,包括:取指模塊,用于從指令序列中取出下一條要執(zhí)行的矩陣運(yùn)算指令,并將該矩陣運(yùn)算指令傳給譯碼模塊;譯碼模塊,用于對(duì)該矩陣運(yùn)算指令進(jìn)行譯碼,并將譯碼后的矩陣運(yùn)算指令傳送給指令隊(duì)列模塊;指令隊(duì)列模塊,用于暫存譯碼后的矩陣運(yùn)算指令,并從矩陣運(yùn)算指令或標(biāo)量寄存器獲得矩陣運(yùn)算指令運(yùn)算相關(guān)的標(biāo)量數(shù)據(jù);獲得所述標(biāo)量數(shù)據(jù)后,將所述矩陣運(yùn)算指令送至依賴關(guān)系處理單元;標(biāo)量寄存器堆,包括多個(gè)標(biāo)量寄存器,用于存儲(chǔ)矩陣運(yùn)算指令相關(guān)的標(biāo)量數(shù)據(jù);依賴關(guān)系處理單元,用于判斷所述矩陣運(yùn)算指令與之前未執(zhí)行完的運(yùn)算指令之間是否存在依賴關(guān)系;如果存在依賴關(guān)系,則將所述矩陣運(yùn)算指令送至存儲(chǔ)隊(duì)列模塊,如果不存在依賴關(guān)系,則將所述矩陣運(yùn)算指令送至矩陣運(yùn)算單元;存儲(chǔ)隊(duì)列模塊,用于存儲(chǔ)與之前運(yùn)算指令存在依賴關(guān)系的矩陣運(yùn)算指令,并且在所述依賴關(guān)系解除后,將所述矩陣運(yùn)算指令送至矩陣運(yùn)算單元;矩陣運(yùn)算單元, 用于根據(jù)接收到矩陣運(yùn)算指令對(duì)輸入矩陣進(jìn)行矩陣乘運(yùn)算操作;高速暫存存儲(chǔ)器,用于存儲(chǔ)輸入矩陣和輸出矩陣;輸入輸出存取模塊,用于直接訪問(wèn)所述高速暫存存儲(chǔ)器,負(fù)責(zé)從所述高速暫存存儲(chǔ)器中讀取輸出矩陣和寫(xiě)入輸入矩陣。
本發(fā)明還提供了執(zhí)行矩陣乘向量和矩陣乘標(biāo)量的方法。
本發(fā)明可以應(yīng)用于以下(包括但不限于)場(chǎng)景中:數(shù)據(jù)處理、機(jī)器人、電腦、打印機(jī)、掃描儀、電話、平板電腦、智能終端、手機(jī)、行車記錄儀、導(dǎo)航儀、傳感器、攝像頭、云端服務(wù)器、相機(jī)、攝像機(jī)、投影儀、手表、耳機(jī)、移動(dòng)存儲(chǔ)、可穿戴設(shè)備等各類電子產(chǎn)品;飛機(jī)、輪船、車輛等各類交通工具;電視、空調(diào)、微波爐、冰箱、電飯煲、加濕器、洗衣機(jī)、電燈、燃?xì)庠?、油煙機(jī)等各類家用電器;以及包括核磁共振儀、b超、心電圖儀等各類醫(yī)療設(shè)備。
附圖說(shuō)明
圖1是根據(jù)本發(fā)明實(shí)施例的執(zhí)行矩陣乘運(yùn)算的裝置的結(jié)構(gòu)示意圖。
圖2是根據(jù)本發(fā)明實(shí)施例的矩陣運(yùn)算單元的操作示意圖。
圖3是根據(jù)本發(fā)明實(shí)施例的指令集的格式示意圖。
圖4是根據(jù)本發(fā)明實(shí)施例的矩陣運(yùn)算裝置的結(jié)構(gòu)示意圖。
圖5是根據(jù)本發(fā)明實(shí)施例的矩陣運(yùn)算裝置執(zhí)行矩陣乘向量指令的流程圖。
圖6是根據(jù)本發(fā)明實(shí)施例的矩陣運(yùn)算裝置執(zhí)行矩陣乘標(biāo)量指令的流程圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,以下結(jié)合具體實(shí)施例,并參照附圖,對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。
本發(fā)明提供了一種矩陣乘運(yùn)算裝置,包括:存儲(chǔ)單元、寄存器單元、控制單元和矩陣運(yùn)算單元;
所述存儲(chǔ)單元存儲(chǔ)矩陣;
所述寄存器單元中存儲(chǔ)有向量地址、向量長(zhǎng)度、矩陣地址、矩陣長(zhǎng)度以及其他計(jì)算過(guò)程中需要的標(biāo)量數(shù)據(jù);
所述控制單元用于對(duì)矩陣運(yùn)算指令執(zhí)行譯碼操作,并根據(jù)矩陣運(yùn)算指令控制各個(gè)模塊,以控制矩陣乘運(yùn)算的執(zhí)行過(guò)程;
矩陣運(yùn)算單元在指令中或寄存器單元中獲取向量地址、向量長(zhǎng)度、矩陣地址、矩陣長(zhǎng)度以及其他計(jì)算需要的標(biāo)量數(shù)據(jù),然后,根據(jù)該輸入矩陣地址在存儲(chǔ)單元中獲取相應(yīng)的矩陣,接著,根據(jù)獲取的矩陣進(jìn)行矩陣乘運(yùn)算,得到運(yùn)算結(jié)果。
本發(fā)明將參與計(jì)算的矩陣數(shù)據(jù)暫存在存儲(chǔ)單元(例如,高速暫存存儲(chǔ)器)上,使得矩陣運(yùn)算過(guò)程中可以更加靈活有效地支持不同寬度的數(shù)據(jù),提升包含大量矩陣乘運(yùn)算任務(wù)的執(zhí)行性能。
本發(fā)明中,所述矩陣乘運(yùn)算單元可以實(shí)現(xiàn)為定制的硬件電路(例如包括但不限于fpga、cgra、專用集成電路asic、模擬電路和憶阻器等)。
圖1是本發(fā)明提供的用于執(zhí)行矩陣乘運(yùn)算的裝置的結(jié)構(gòu)示意圖,如圖1所示,該裝置包括:
存儲(chǔ)單元,用于存儲(chǔ)矩陣。在一種實(shí)施方式中,該存儲(chǔ)單元可以是高速暫存存儲(chǔ)器,能夠支持不同大小的矩陣數(shù)據(jù);本發(fā)明將必要的計(jì)算數(shù)據(jù)暫存在高速暫存存儲(chǔ)器上(scratchpadmemory),使本運(yùn)算裝置在進(jìn)行矩陣運(yùn)算過(guò)程中可以更加靈活有效地支持不同寬度的數(shù)據(jù),存儲(chǔ)單元可以通過(guò)各種不同存儲(chǔ)器件(sram、edram、dram、憶阻器、3d-dram或非易失存儲(chǔ)等)實(shí)現(xiàn)。
寄存器單元,用于存儲(chǔ)矩陣地址,其中,矩陣地址為矩陣在存儲(chǔ)單元中存儲(chǔ)的地址;在一種實(shí)施方式中,寄存器單元可以是標(biāo)量寄存器堆,提供運(yùn)算過(guò)程中所需的標(biāo)量寄存器,標(biāo)量寄存器存儲(chǔ)輸入矩陣地址、輸入矩陣長(zhǎng)度、輸出矩陣地址。當(dāng)涉及到矩陣與標(biāo)量的運(yùn)算時(shí),矩陣運(yùn)算單元不僅要從寄存器單元中獲取矩陣地址,還要從寄存器單元中獲取相應(yīng)的標(biāo)量。
控制單元,用于控制裝置中各個(gè)模塊的行為。在一種實(shí)施方式中,控制單元讀取準(zhǔn)備好的指令,進(jìn)行譯碼生成控制信號(hào),發(fā)送給裝置中的其他模塊,其他模塊根據(jù)得到的控制信號(hào)執(zhí)行相應(yīng)的操作。
矩陣運(yùn)算單元,用于獲取各種矩陣乘運(yùn)算指令,根據(jù)指令在所述寄存器單元中獲取矩陣地址,然后,根據(jù)該矩陣地址在存儲(chǔ)單元中獲取相應(yīng)的矩陣,接著,根據(jù)獲取的矩陣進(jìn)行運(yùn)算,得到矩陣運(yùn)算結(jié)果,并將矩陣運(yùn) 算結(jié)果存儲(chǔ)于存儲(chǔ)單元中。矩陣運(yùn)算單元負(fù)責(zé)裝置的所有矩陣乘運(yùn)算,包括但不限于矩陣乘向量操作、向量乘矩陣操作、矩陣乘法操作和矩陣乘標(biāo)量操作。矩陣乘運(yùn)算指令被送往該運(yùn)算單元執(zhí)行。
圖2示出了根據(jù)本發(fā)明實(shí)施例的矩陣運(yùn)算單元的示意框圖。如圖所示,矩陣乘運(yùn)算單元由一個(gè)主運(yùn)算模塊和多個(gè)從運(yùn)算模塊組成。其中,每個(gè)從運(yùn)算模塊均可以實(shí)現(xiàn)向量點(diǎn)積的運(yùn)算,包括兩向量的對(duì)位相乘以及的對(duì)乘結(jié)果的求和。每個(gè)從運(yùn)算模塊由三個(gè)部分組成,依次是向量對(duì)位乘模塊,加法樹(shù)模塊以及累加模塊。對(duì)位乘模塊完成兩向量的對(duì)位相乘,加法樹(shù)模塊將對(duì)位相乘的結(jié)果向量加成一個(gè)數(shù),累加模塊則是將加法樹(shù)的結(jié)果累加在之前的部分和上。在實(shí)際計(jì)算兩矩陣a和b的乘運(yùn)算過(guò)程中,矩陣b的數(shù)據(jù)按列依次存儲(chǔ)在各從運(yùn)算模塊中,即第一列存儲(chǔ)在從運(yùn)算模塊1中,第二列存儲(chǔ)在從運(yùn)算模塊2中,…,第n+1列存儲(chǔ)在從運(yùn)算模塊1中,依次類推。而矩陣a的數(shù)據(jù)則存儲(chǔ)在主運(yùn)算模塊中。在計(jì)算過(guò)程中,主運(yùn)算模塊每次取出a的一行數(shù)據(jù),并廣播給所有的從運(yùn)算模塊,每個(gè)從運(yùn)算模塊完成a中行數(shù)據(jù)與自己存儲(chǔ)的列數(shù)據(jù)的點(diǎn)積運(yùn)算,并將結(jié)果返回至主運(yùn)算模塊,主運(yùn)算模塊獲得所有從運(yùn)算模塊返回的數(shù)據(jù),最終得到結(jié)果矩陣中的一行。具體到每個(gè)從運(yùn)算模塊的計(jì)算過(guò)程,從運(yùn)算模塊每次取出兩向量的一部分,該寬度等于從運(yùn)算模塊的計(jì)算位寬,也就是從運(yùn)算模塊對(duì)位乘法器可以同時(shí)執(zhí)行的對(duì)位乘的個(gè)數(shù)。經(jīng)過(guò)對(duì)位乘后的結(jié)果通過(guò)加法樹(shù)得到一個(gè)值,該值被暫存在累加模塊中,當(dāng)下一段向量的加法樹(shù)結(jié)果送至累加模塊時(shí),被累加在該值上。通過(guò)這種分段運(yùn)算的方法完成向量?jī)?nèi)積的運(yùn)算。
矩陣乘標(biāo)量的運(yùn)算則在主運(yùn)算模塊中完成,即主運(yùn)算模塊中也有同樣的對(duì)位乘法器,其輸入一來(lái)自于矩陣數(shù)據(jù),另一輸入來(lái)自于標(biāo)量擴(kuò)展成的向量。
上文所述對(duì)位乘法器即多個(gè)并行的標(biāo)量乘單元,這些乘單元同時(shí)讀取向量中不同位置中的數(shù)據(jù)并計(jì)算出相應(yīng)的乘積。
根據(jù)本發(fā)明的一種實(shí)施方式,所述矩陣乘運(yùn)算裝置還包括:指令緩存單元,用于存儲(chǔ)待執(zhí)行的矩陣運(yùn)算指令。指令在執(zhí)行過(guò)程中,同時(shí)也被緩存在指令緩存單元中,當(dāng)一條指令執(zhí)行完之后,該指令將被提交。
根據(jù)本發(fā)明的一種實(shí)施方式,所述裝置中的控制單元還包括:指令隊(duì)列模塊,用于對(duì)譯碼后的矩陣運(yùn)算指令進(jìn)行順序存儲(chǔ),并在獲得矩陣運(yùn)算指令所需的標(biāo)量數(shù)據(jù)后,將矩陣運(yùn)算指令以及標(biāo)量數(shù)據(jù)送至依賴關(guān)系處理模塊。
根據(jù)本發(fā)明的一種實(shí)施方式,所述裝置中的控制單元還包括:依賴關(guān)系處理單元,用于在矩陣運(yùn)算單元獲取指令前,判斷該運(yùn)算指令與之前未完成運(yùn)算指令之間是否存在依賴關(guān)系,如是否訪問(wèn)相同的矩陣存儲(chǔ)地址,若是,將該運(yùn)算指令送至存儲(chǔ)隊(duì)列模塊中,待前一運(yùn)算指令執(zhí)行完畢后,將存儲(chǔ)隊(duì)列中的該運(yùn)算指令提供給所述矩陣運(yùn)算單元;否則,直接將該運(yùn)算指令提供給所述矩陣運(yùn)算單元。具體地,矩陣運(yùn)算指令需要訪問(wèn)高速暫存存儲(chǔ)器時(shí),前后指令可能會(huì)訪問(wèn)同一塊存儲(chǔ)空間,為了保證指令執(zhí)行結(jié)果的正確性,當(dāng)前指令如果被檢測(cè)到與之前的指令的數(shù)據(jù)存在依賴關(guān)系,該指令必須在存儲(chǔ)隊(duì)列內(nèi)等待至依賴關(guān)系被消除。
根據(jù)本發(fā)明的一種實(shí)施方式,所述裝置中的控制單元還包括:存儲(chǔ)隊(duì)列模塊,該模塊包括一個(gè)有序隊(duì)列,與之前指令在數(shù)據(jù)上有依賴關(guān)系的指令被存儲(chǔ)在該有序隊(duì)列內(nèi)直至依賴關(guān)系被消除,在依賴關(guān)系消除后,其將運(yùn)算指令提供給矩陣運(yùn)算單元。
根據(jù)本發(fā)明的一種實(shí)施方式,裝置還包括:輸入輸出單元,用于將矩陣存儲(chǔ)于存儲(chǔ)單元,或者,從存儲(chǔ)單元中獲取運(yùn)算結(jié)果。其中,輸入輸出單元可直接訪問(wèn)存儲(chǔ)單元,負(fù)責(zé)從內(nèi)存向存儲(chǔ)單元讀取矩陣數(shù)據(jù)或從存儲(chǔ)單元向內(nèi)存寫(xiě)入矩陣數(shù)據(jù)。
根據(jù)本發(fā)明的一種實(shí)施方式,用于本發(fā)明裝置的指令集采用load/store(加載/存儲(chǔ))結(jié)構(gòu),矩陣運(yùn)算單元不會(huì)對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。本指令集采用精簡(jiǎn)指令集架構(gòu),指令集只提供最基本的矩陣運(yùn)算操作,復(fù)雜的矩陣運(yùn)算都由這些簡(jiǎn)單指令通過(guò)組合進(jìn)行模擬,使得可以在高時(shí)鐘頻率下單周期執(zhí)行指令。
在本裝置執(zhí)行矩陣運(yùn)算的過(guò)程中,裝置取出指令進(jìn)行譯碼,然后送至指令隊(duì)列存儲(chǔ),根據(jù)譯碼結(jié)果,獲取指令中的各個(gè)參數(shù),這些參數(shù)可以是直接寫(xiě)在指令的操作域中,也可以是根據(jù)指令操作域中的寄存器號(hào)從指定的寄存器中讀取。這種使用寄存器存儲(chǔ)參數(shù)的好處是無(wú)需改變指令本身, 只要用指令改變寄存器中的值,就可以實(shí)現(xiàn)大部分的循環(huán),因此大大節(jié)省了在解決某些實(shí)際問(wèn)題時(shí)所需要的指令條數(shù)。在全部操作數(shù)之后,依賴關(guān)系處理單元會(huì)判斷指令實(shí)際需要使用的數(shù)據(jù)與之前指令中是否存在依賴關(guān)系,這決定了這條指令是否可以被立即發(fā)送至矩陣運(yùn)算單元中執(zhí)行。一旦發(fā)現(xiàn)與之前的數(shù)據(jù)之間存在依賴關(guān)系,則該條指令必須等到它依賴的指令執(zhí)行完畢之后才可以送至矩陣運(yùn)算單元執(zhí)行。在定制的矩陣運(yùn)算單元中,該條指令將快速執(zhí)行完畢,并將結(jié)果,即生成的結(jié)果矩陣寫(xiě)回至指令提供的地址,該條指令執(zhí)行完畢。
圖3是本發(fā)明提供的矩陣乘運(yùn)算指令的格式示意圖,如圖3所示,矩陣乘運(yùn)算指令包括一操作碼和至少一操作域,其中,操作碼用于指示該矩陣運(yùn)算指令的功能,矩陣運(yùn)算單元通過(guò)識(shí)別該操作碼可進(jìn)行不同的矩陣運(yùn)算,操作域用于指示該矩陣運(yùn)算指令的數(shù)據(jù)信息,其中,數(shù)據(jù)信息可以是立即數(shù)或寄存器號(hào),例如,要獲取一個(gè)矩陣時(shí),根據(jù)寄存器號(hào)可以在相應(yīng)的寄存器中獲取矩陣起始地址和矩陣長(zhǎng)度,再根據(jù)矩陣起始地址和矩陣長(zhǎng)度在存儲(chǔ)單元中獲取相應(yīng)地址存放的矩陣。
有下列幾種矩陣乘運(yùn)算指令:
矩陣乘向量指令(mmv),根據(jù)該指令,裝置從高速暫存存儲(chǔ)器的指定地址取出指定大小的矩陣數(shù)據(jù)和向量數(shù)據(jù),在矩陣運(yùn)算單元中進(jìn)行矩陣乘向量的乘法運(yùn)算,并將計(jì)算結(jié)果寫(xiě)回至高速暫存存儲(chǔ)器的指定地址;值得說(shuō)明的是,向量可以作為特殊形式的矩陣(只有一行元素的矩陣)存儲(chǔ)于高速暫存存儲(chǔ)器中。
向量乘矩陣指令(vmm),根據(jù)該指令,裝置從高速暫存存儲(chǔ)器的指定地址取出制定長(zhǎng)度的向量數(shù)據(jù)和矩陣數(shù)據(jù),在矩陣運(yùn)算單元中進(jìn)行向量乘矩陣的乘法運(yùn)算,并將計(jì)算結(jié)果寫(xiě)回至高速暫存存儲(chǔ)器的指定地址;值得說(shuō)明的是,向量可以作為特殊形式的矩陣(只有一行元素的矩陣)存儲(chǔ)于高速暫存存儲(chǔ)器中。
矩陣乘法指令(mm),根據(jù)該指令,裝置從高速暫存存儲(chǔ)器的指定地址取出指定大小的矩陣數(shù)據(jù),在矩陣運(yùn)算單元中進(jìn)行矩陣乘法運(yùn)算,并將計(jì)算結(jié)果寫(xiě)回至高速暫存存儲(chǔ)器的指定地址。
矩陣乘標(biāo)量指令(mms),根據(jù)該指令,裝置從高速暫存存儲(chǔ)器的指 定地址取出指定大小的矩陣數(shù)據(jù),從標(biāo)量寄存器堆的指定地址中取出標(biāo)量數(shù)據(jù),在矩陣運(yùn)算單元中進(jìn)行矩陣乘標(biāo)量的乘法運(yùn)算,并將計(jì)算結(jié)果寫(xiě)回至高速暫存存儲(chǔ)器的指定地址,需要說(shuō)明的是,標(biāo)量寄存器堆不僅存儲(chǔ)有矩陣的地址,還存儲(chǔ)有標(biāo)量數(shù)據(jù)。
圖4是本發(fā)明一實(shí)施例提供的矩陣運(yùn)算裝置的結(jié)構(gòu)示意圖,如圖4所示,裝置包括取指模塊、譯碼模塊、指令隊(duì)列模塊、標(biāo)量寄存器堆、依賴關(guān)系處理單元、存儲(chǔ)隊(duì)列模塊、矩陣運(yùn)算單元、高速暫存器、io內(nèi)存存取模塊;
取指模塊,該模塊負(fù)責(zé)從指令序列中取出下一條將要執(zhí)行的指令,并將該指令傳給譯碼模塊;
譯碼模塊,該模塊負(fù)責(zé)對(duì)指令進(jìn)行譯碼,并將譯碼后指令傳給指令隊(duì)列;
指令隊(duì)列,用于暫存譯碼后的矩陣運(yùn)算指令,并從矩陣運(yùn)算指令或標(biāo)量寄存器獲得矩陣運(yùn)算指令運(yùn)算相關(guān)的標(biāo)量數(shù)據(jù);獲得所述標(biāo)量數(shù)據(jù)后,將所述矩陣運(yùn)算指令送至依賴關(guān)系處理單元;
標(biāo)量寄存器堆,提供裝置在運(yùn)算過(guò)程中所需的標(biāo)量寄存器;標(biāo)量寄存器堆包括多個(gè)標(biāo)量寄存器,用于存儲(chǔ)矩陣運(yùn)算指令相關(guān)的標(biāo)量數(shù)據(jù);
依賴關(guān)系處理單元,該模塊處理處理指令與前一條指令可能存在的存儲(chǔ)依賴關(guān)系。矩陣運(yùn)算指令會(huì)訪問(wèn)高速暫存存儲(chǔ)器,前后指令可能會(huì)訪問(wèn)同一塊存儲(chǔ)空間。即該單元會(huì)檢測(cè)當(dāng)前指令的輸入數(shù)據(jù)的存儲(chǔ)范圍和之前尚未執(zhí)行完成的指令的輸出數(shù)據(jù)的存儲(chǔ)范圍是否有重疊,有則說(shuō)明該條指令在邏輯上需要使用前面指令的計(jì)算結(jié)果,因此它必須等到在它之前的所依賴的指令執(zhí)行完畢后才能夠開(kāi)始執(zhí)行。在這個(gè)過(guò)程中,指令實(shí)際被暫存在下面的存儲(chǔ)隊(duì)列中。為了保證指令執(zhí)行結(jié)果的正確性,當(dāng)前指令如果被檢測(cè)到與之前的指令的數(shù)據(jù)存在依賴關(guān)系,該指令必須在存儲(chǔ)隊(duì)列內(nèi)等待至依賴關(guān)系被消除。
存儲(chǔ)隊(duì)列模塊,該模塊是一個(gè)有序隊(duì)列,與之前指令在數(shù)據(jù)上有依賴關(guān)系的指令被存儲(chǔ)在該隊(duì)列內(nèi)直至存儲(chǔ)關(guān)系被消除;
矩陣運(yùn)算單元,該模塊負(fù)責(zé)執(zhí)行矩陣的乘運(yùn)算;
高速暫存存儲(chǔ)器,該模塊是矩陣數(shù)據(jù)專用的暫存存儲(chǔ)裝置,能夠支持 不同大小的矩陣數(shù)據(jù);主要用于存儲(chǔ)輸入矩陣數(shù)據(jù)和輸出矩陣數(shù)據(jù);
io內(nèi)存存取模塊,該模塊用于直接訪問(wèn)高速暫存存儲(chǔ)器,負(fù)責(zé)從高速暫存存儲(chǔ)器中讀取數(shù)據(jù)或?qū)懭霐?shù)據(jù)。
本發(fā)明提供的矩陣運(yùn)算裝置,將參與計(jì)算的矩陣數(shù)據(jù)暫存在存儲(chǔ)單元(例如,高速暫存存儲(chǔ)器(scratchpadmemory))上,使得矩陣運(yùn)算過(guò)程中可以更加靈活有效地支持不同寬度的數(shù)據(jù),同時(shí)定制的矩陣運(yùn)算模塊能夠更加高效地實(shí)現(xiàn)各種矩陣乘運(yùn)算,提升包含大量矩陣計(jì)算任務(wù)的執(zhí)行性能,本發(fā)明采用的指令具有精簡(jiǎn)的格式,使得指令集使用方便、支持的矩陣長(zhǎng)度靈活。
圖5是本發(fā)明實(shí)施例提供的運(yùn)算裝置執(zhí)行矩陣乘向量指令的流程圖,如圖5所示,執(zhí)行矩陣乘向量指令的過(guò)程包括:
s1,取指模塊取出該條矩陣乘向量指令,并將該指令送往譯碼模塊。
s2,譯碼模塊對(duì)指令譯碼,并將指令送往指令隊(duì)列。
s3,在指令隊(duì)列中,該矩陣乘向量指令需要從標(biāo)量寄存器堆中獲取指令中五個(gè)操作域所對(duì)應(yīng)的標(biāo)量寄存器里的數(shù)據(jù),包括輸入向量地址、輸入向量長(zhǎng)度、輸入矩陣地址、輸出向量地址、輸出向量長(zhǎng)度。
s4,在取得需要的標(biāo)量數(shù)據(jù)后,該指令被送往依賴關(guān)系處理單元。依賴關(guān)系處理單元分析該指令與前面的尚未執(zhí)行結(jié)束的指令在數(shù)據(jù)上是否存在依賴關(guān)系。該條指令需要在存儲(chǔ)隊(duì)列中等待至其與前面的未執(zhí)行結(jié)束的指令在數(shù)據(jù)上不再存在依賴關(guān)系為止。
s5,依賴關(guān)系不存在后,該條矩陣乘向量指令被送往矩陣運(yùn)算單元。
s6,矩陣運(yùn)算單元根據(jù)所需數(shù)據(jù)的地址和長(zhǎng)度從高速暫存器中取出需要的矩陣和向量數(shù)據(jù),然后在矩陣運(yùn)算單元中完成矩陣乘向量的運(yùn)算。
s7,運(yùn)算完成后,將結(jié)果寫(xiě)回至高速暫存存儲(chǔ)器的指定地址。
圖6是本發(fā)明實(shí)施例提供的運(yùn)算裝置執(zhí)行矩陣乘標(biāo)量指令的流程圖,如圖6所示,執(zhí)行矩陣乘標(biāo)量指令的過(guò)程包括:
s1’,取指模塊取出該條矩陣乘標(biāo)量指令,并將該指令送往譯碼模塊。
s2’,譯碼模塊對(duì)指令譯碼,并將指令送往指令隊(duì)列。
s3’,在指令隊(duì)列中,該矩陣乘標(biāo)量指令需要從標(biāo)量寄存器堆中獲取指令中四個(gè)操作域所對(duì)應(yīng)的標(biāo)量寄存器里的數(shù)據(jù),包括輸入矩陣地址、輸 入矩陣大小、輸入標(biāo)量、輸出矩陣地址。
s4’,在取得需要的標(biāo)量數(shù)據(jù)后,該指令被送往依賴關(guān)系處理單元。依賴關(guān)系處理單元分析該指令與前面的尚未執(zhí)行結(jié)束的指令在數(shù)據(jù)上是否存在依賴關(guān)系。該條指令需要在存儲(chǔ)隊(duì)列中等待至其與前面的未執(zhí)行結(jié)束的指令在數(shù)據(jù)上不再存在依賴關(guān)系為止。
s5’,依賴關(guān)系不存在后,該條矩陣乘標(biāo)量指令被送往矩陣運(yùn)算單元。
s6’,矩陣運(yùn)算單元根據(jù)所需數(shù)據(jù)的地址和長(zhǎng)度從高速暫存器中取出需要的矩陣數(shù)據(jù),然后在矩陣運(yùn)算單元中完成矩陣乘標(biāo)量的運(yùn)算。
s7’,運(yùn)算完成后,將結(jié)果矩陣寫(xiě)回至高速暫存存儲(chǔ)器的指定地址。
綜上所述,本發(fā)明提供矩陣運(yùn)算裝置,并配合相應(yīng)的指令,能夠很好地解決當(dāng)前計(jì)算機(jī)領(lǐng)域越來(lái)越多的算法包含大量矩陣乘運(yùn)算的問(wèn)題,相比于已有的傳統(tǒng)解決方案,本發(fā)明可以具有指令精簡(jiǎn)、使用方便、支持的矩陣規(guī)模靈活、片上緩存充足等優(yōu)點(diǎn)。本發(fā)明可以用于多種包含大量矩陣乘運(yùn)算的計(jì)算任務(wù),包括目前表現(xiàn)十分出色的人工神經(jīng)網(wǎng)絡(luò)算法的反向訓(xùn)練和正向預(yù)測(cè),以及傳統(tǒng)的如求解不可規(guī)約矩陣最大特征值的冪乘法的數(shù)值計(jì)算方法。
以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。