專利名稱:使用simd寄存器的小矩陣有效乘法的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及矩陣運(yùn)算。更具體地說,本發(fā)明提供一種使用SIMD寄存器的矩陣的有效乘法的例子。
背景技術(shù):
傳統(tǒng)m×n矩陣的運(yùn)算處理是一種公用數(shù)據(jù)處理任務(wù)。m×n矩陣由m行和n列組成。被乘數(shù)矩陣c的維數(shù)是n×m,而乘數(shù)矩陣a是m×p。b的合成維數(shù)是n×p。b中的數(shù)值是使用關(guān)系式bij=Σkmcik*akj,]]>根據(jù)c的列中的數(shù)值和a的列中的數(shù)值的乘積和計(jì)算的;其中第一下標(biāo)指的是行而第二下標(biāo)指的是列。因此,根據(jù)c的行i和a的列的內(nèi)積計(jì)算行i和列j中的b的元素的數(shù)值。乘積的總數(shù)為m*n*p并且加法的總數(shù)為(m-1)*n*p。
對(duì)于最佳結(jié)果而言,矩陣乘法設(shè)備已用于利用最少量的指令來執(zhí)行乘法、加法和數(shù)據(jù)排序步驟。因?yàn)閏是系數(shù)矩陣而a是數(shù)據(jù)矩陣,所以已研發(fā)出利用預(yù)存儲(chǔ)c的元素的能力的各種技術(shù),其適于有效實(shí)施矩陣乘法。但是,這種存儲(chǔ)元素的靈活性對(duì)于矩陣a中的數(shù)據(jù)無效。a中的數(shù)據(jù)一般是以不為任何數(shù)據(jù)處理算法所知的邏輯順序來存儲(chǔ)的。
矩陣乘法用于像坐標(biāo)和色彩轉(zhuǎn)換、成像算法選擇這樣的應(yīng)用和眾多科學(xué)計(jì)算任務(wù)。矩陣乘法是一種計(jì)算集中操作,其可以借助于微處理器的單指令、多數(shù)據(jù)(SIMD)寄存器來執(zhí)行,該微處理器支持進(jìn)行SIMD矩陣乘法,其通過使用SIMD指令安排數(shù)據(jù)并根據(jù)由矩陣乘法等式指示的計(jì)算順序來執(zhí)行矩陣乘法bij=Σkmcik*akj]]>其中b(x)=c(x)*a(x)相應(yīng)于
結(jié)果矩陣b的元素是根據(jù)被乘數(shù)矩陣c的行和乘數(shù)矩陣a的列的內(nèi)積(點(diǎn)積)計(jì)算出來的。b的第一元素是b00=(c00*a00)+(c01*a10)+(c02*a20)+(c03*a30)其是c的第一行和a的第一列的乘積和。
接著是b01=(c00*a01)+(c01*a11)+(c02*a21)+(c03*a31)其是c的第一行和a的第二列的乘積和。繼續(xù)進(jìn)行計(jì)算直到全部得出第一行的結(jié)果。使用c的下一行計(jì)算b的下一行,以下式開始b10=(c10*a00)+(c11*a10)+(c12*a20)+(c13*a30)對(duì)于適當(dāng)?shù)淖兓?XOR而不是加法)而言,可將相同的模式用于模乘法和常規(guī)乘法。
使用SIMD指令的矩陣乘法的常規(guī)實(shí)施將乘法矩陣a的元素按它們存儲(chǔ)在存儲(chǔ)器中的順序存儲(chǔ)在SIMD寄存器中,并且將被乘數(shù)矩陣c的元素按行序存儲(chǔ)在SIMD寄存器中,重復(fù)行直到c中列的數(shù)目。a的元素是按它們存儲(chǔ)在存儲(chǔ)器中的順序存儲(chǔ)在寄存器中的。例如,在c中的第一行的4列矩陣元素中被重復(fù)4次,這是因?yàn)閏有4列。如果c的規(guī)模小于SIMD寄存器的規(guī)模,那么也可以將c的其他行的元素存儲(chǔ)在SIMD寄存器中。如果c的規(guī)模大于SIMD寄存器的規(guī)模,則將需要附加的寄存器來存儲(chǔ)其他行的數(shù)據(jù)。
使用存儲(chǔ)在SIMD寄存器的數(shù)據(jù)的矩陣乘法的結(jié)果以c00*a00,c01*a10,...c03*a33開始將c中的元素和a中的元素相乘。接著,必須計(jì)算出在相同寄存器中彼此相鄰的每行的這些乘積的和。如果使用了乘法累加(MAC)指令,則在乘法計(jì)算時(shí)計(jì)算乘積的某些和。一般而言,先計(jì)算b00,然后計(jì)算b01。之后,將矩陣c的下一行載入具有c的數(shù)值的寄存器,以便計(jì)算矩陣b的下一行的元素。
雖然準(zhǔn)確,但是在操作中可以要求對(duì)模乘積進(jìn)行有效的數(shù)據(jù)排序,以致它們可以計(jì)算b的單元(例如,通過在伽羅瓦域算術(shù)運(yùn)算中提供加法運(yùn)算的XOR)。此外,如果結(jié)果不適合在一個(gè)寄存器中,則可以在存儲(chǔ)它們之前,必須在這些寄存器之間交換結(jié)果。上述兩個(gè)問題導(dǎo)致了嚴(yán)重的計(jì)算開銷,影響了矩陣乘法處理的速度。
根據(jù)以下給出的詳細(xì)說明和本發(fā)明實(shí)施方式附圖,將更充分地理解本發(fā)明,但是這僅用于說明和理解,而不應(yīng)將此看作是對(duì)本發(fā)明的限制。
圖1示意地說明支持SIMD寄存器的計(jì)算系統(tǒng);圖2是一種為有效矩陣乘法重排序數(shù)據(jù)的步驟;圖3說明一般4×4模矩陣乘法;圖4說明基于乘法的寄存器的數(shù)據(jù)重排序;圖5說明根據(jù)圖4重排序之后的寄存器;圖6說明根據(jù)圖4和圖5重排序之后的矩陣乘法;圖7說明其中被乘數(shù)矩陣c的對(duì)角線上的元素的數(shù)量不等于乘法矩陣的列中的元素?cái)?shù)量的模矩陣乘法;圖8說明基于寄存器的數(shù)據(jù)重排序的乘法;圖9說明根據(jù)圖7和圖8重排序之后的矩陣乘法;圖10說明其中被乘數(shù)矩陣c對(duì)角線小于使用2×3列c和3×4矩陣的乘數(shù)矩陣a的模矩陣乘法。
圖11說明基于寄存器的數(shù)據(jù)重排序的乘法;圖12說明根據(jù)圖10和圖11的重排序之后的矩陣乘法;圖13說明規(guī)則矩陣的模矩陣乘法;圖14說明基于寄存器的數(shù)據(jù)重排序的乘法;以及圖15說明根據(jù)圖13和圖14的重排序之后的矩陣乘法。
具體實(shí)施例方式
圖1大致地說明計(jì)算系統(tǒng)10,其具有處理器12和存儲(chǔ)系統(tǒng)13(可以為任意的可訪問存儲(chǔ)器,包括外部高速緩沖存儲(chǔ)器、外部RAM,和/或部分位于處理器內(nèi)部的存儲(chǔ)器),用于執(zhí)行可以作為計(jì)算機(jī)程序產(chǎn)品以軟件形式外部提供的、并存儲(chǔ)在數(shù)據(jù)存儲(chǔ)單元18內(nèi)的指令。
計(jì)算系統(tǒng)10的處理器12還支持內(nèi)存儲(chǔ)寄存器14,包括單指令多數(shù)據(jù)(SIMD)寄存器16。寄存器14并不限于特定類型的存儲(chǔ)器電路。更確切地說,本實(shí)施方式的寄存器需要存儲(chǔ)并提供數(shù)據(jù),以及執(zhí)行在此所述功能的能力。在一個(gè)實(shí)施方式中,寄存器14包括多媒體寄存器,例如用于存儲(chǔ)多媒體信息的SIMD寄存器。而在一個(gè)實(shí)施方式中,多媒體寄存器每一個(gè)都存儲(chǔ)高達(dá)128位的壓縮數(shù)據(jù)(packeddata)。多媒體寄存器可專門用于多媒體寄存器或用于存儲(chǔ)多媒體信息及其他信息的寄存器。在一個(gè)實(shí)施方式中,多媒體寄存器在執(zhí)行多媒體操作時(shí)存儲(chǔ)多媒體數(shù)據(jù),當(dāng)執(zhí)行浮點(diǎn)操作時(shí)存儲(chǔ)浮點(diǎn)數(shù)據(jù)。
本發(fā)明的計(jì)算機(jī)系統(tǒng)10可以包括一個(gè)或多個(gè)I/O(輸入/輸出)裝置15,包括像監(jiān)視器這樣的顯示裝置。I/O裝置還可以包括輸入裝置,諸如鍵盤和像鼠標(biāo)、軌跡球或軌跡板這樣的光標(biāo)控制器。此外,I/O裝置還可以包括網(wǎng)絡(luò)連接器使得計(jì)算機(jī)系統(tǒng)10成為局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)的一部分,I/O裝置15,即用于聲音記錄和/或回放的裝置,諸如與用于語音識(shí)別的錄制話音輸入的麥克風(fēng)耦合的音頻數(shù)字化器。I/O裝置15還可以包括可用于捕獲視頻圖像的視頻數(shù)字化裝置、像打印機(jī)這樣的硬拷貝裝置和CD-ROM裝置。
在一個(gè)實(shí)施方式中,可由數(shù)據(jù)存儲(chǔ)單元18讀取的計(jì)算機(jī)程序產(chǎn)品可以包括機(jī)器或計(jì)算機(jī)可讀介質(zhì),在該介質(zhì)上已存儲(chǔ)了可用于編程(即定義其操作)計(jì)算機(jī)(或其他電子設(shè)備)的指令,以便根據(jù)本發(fā)明執(zhí)行處理。數(shù)據(jù)存儲(chǔ)單元18的計(jì)算機(jī)可讀介質(zhì)可以包括(但不限于)軟盤、光盤、CD、只讀存儲(chǔ)器(CD-ROM)和磁光盤、只讀存儲(chǔ)器(ROM)、隨機(jī)存取存儲(chǔ)器(RAM)、可擦除可編程只讀存儲(chǔ)器(EPROM)、電可擦除可編程只讀存儲(chǔ)器(EEPROM)、磁或光卡、快閃存儲(chǔ)器,等等。
因此,計(jì)算機(jī)可讀介質(zhì)包括適于存儲(chǔ)電子指令的任一類型的介質(zhì)/機(jī)器可讀介質(zhì)。此外,還可以將本發(fā)明作為計(jì)算機(jī)程序產(chǎn)品下載。就這點(diǎn)而論,還可以將該程序從遠(yuǎn)程計(jì)算機(jī)(例如,服務(wù)器)傳送到請(qǐng)求計(jì)算機(jī)(例如,客戶端)。可以通過通信鏈路(例如,調(diào)制解調(diào)器、網(wǎng)絡(luò)連接等等)將該程序作為包含在載波或其他傳播介質(zhì)中的數(shù)據(jù)信號(hào)傳送。
計(jì)算系統(tǒng)10可以是具有適當(dāng)寄存器結(jié)構(gòu)的處理器的通用計(jì)算機(jī),或可以被配置用于特定目的或嵌入式應(yīng)用。在實(shí)施方式中,本發(fā)明的方法可包含在目的在于控制計(jì)算機(jī)系統(tǒng)的操作(尤其是處理器和寄存器的操作)的機(jī)器可執(zhí)行指令中。這些指令可用于使被用指令編程的通用或?qū)S锰幚砥鲌?zhí)行本發(fā)明的步驟?;蛘撸捎砂瑘?zhí)行步驟的硬連線邏輯的特定硬件元件執(zhí)行本發(fā)明的步驟,或者由已編程計(jì)算機(jī)元件和常規(guī)的硬件元件的組合來執(zhí)行本發(fā)明的步驟。
本領(lǐng)域中知識(shí)豐富的人應(yīng)理解用于描述通信、協(xié)議、應(yīng)用、實(shí)施、機(jī)制等的各項(xiàng)術(shù)語和技術(shù)。一種這樣的技術(shù)是實(shí)現(xiàn)關(guān)于算法或數(shù)學(xué)表達(dá)式的技術(shù)的描述。也就是說,當(dāng)該技術(shù)例如可以計(jì)算機(jī)上的執(zhí)行代碼來實(shí)施的時(shí)候,以公式、算法或數(shù)學(xué)表達(dá)式可更適當(dāng)和簡(jiǎn)潔地表達(dá)和傳達(dá)技術(shù)的表示。
因此,本領(lǐng)域熟練的技術(shù)人員將把指示A+B=C的塊看作加性函數(shù),以硬件和/或軟件形式實(shí)施的加性函數(shù)將采用兩個(gè)輸入端(A和B)并產(chǎn)生總和輸出(C)。因此,通過利用公式、算法或數(shù)學(xué)表達(dá)式來說明,應(yīng)被理解為在至少硬件和/或軟件中具有物理實(shí)施方式(諸如本發(fā)明的技術(shù)中的計(jì)算機(jī)系統(tǒng)可以作為實(shí)施方式實(shí)踐和實(shí)施)。
圖2顯示根據(jù)本發(fā)明的諸如圖3中示出的矩陣乘法的過程的一個(gè)實(shí)施方式。如圖2所示,首先,通過重排序并載入用于有效矩陣乘法的存儲(chǔ)器(在這個(gè)例子中,標(biāo)為框21的寄存器)來組織數(shù)據(jù)。被乘數(shù)矩陣c的每個(gè)對(duì)角線被載入不同的寄存器中。通過使用位于鄰近右列的矩陣的拷貝,具有非底行的最右列中的元素的這些對(duì)角線延伸至下一行中的元素。對(duì)角線的下一元素位于下一行。在寄存器中復(fù)制對(duì)角線,復(fù)制的次數(shù)等于乘數(shù)矩陣a中列的數(shù)目。對(duì)角線中元素的數(shù)目等于c中列的數(shù)目。以列順序?qū)⒊藬?shù)矩陣a的數(shù)據(jù)載入寄存器中,將順序數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中。在每個(gè)乘法和加法之間,將寄存器中的每個(gè)列中的元素移動(dòng)一個(gè)元素(框22)。一列中最后的元素被移動(dòng)或旋轉(zhuǎn)至該列的前面。被乘數(shù)c矩陣的對(duì)角線乘以乘數(shù)a矩陣的列(在長(zhǎng)度上可能已被調(diào)整)(框23),并且它們的乘積與結(jié)果矩陣b的列的乘積之和相加(框24)。
如果一列中元素的數(shù)目不同于c的列的數(shù)目,那么將SIMD寄存器中a的列中元素的數(shù)目調(diào)整為與c的列中的元素的數(shù)目相等。一種確定要選擇乘數(shù)矩陣a的哪一個(gè)元素的方式是首先將乘數(shù)矩陣a的拷貝堆疊在彼此之上,以致列對(duì)齊并且拷貝的首行低于底行和其他拷貝。這有效地?cái)U(kuò)展了每個(gè)列。由于從擴(kuò)展的列取出的元素?cái)?shù)目等于被乘數(shù)矩陣c的對(duì)角線中元素的數(shù)目。在每一乘法和加法操作之后,通過下移擴(kuò)展列元素,為下一乘法和加法操作選擇元素。如果被乘數(shù)對(duì)角線的長(zhǎng)度大于乘數(shù)列的長(zhǎng)度,則將從列中選擇相等的值,而如果被乘數(shù)對(duì)角線短于乘數(shù)列的長(zhǎng)度,則不將從列中選擇任何值。
雖然上述例子利用了處理器內(nèi)部寄存器,但是應(yīng)理解,并不總是需要載入處理器內(nèi)部寄存器來執(zhí)行SIMD操作??梢詫⒂糜诔朔ɑ蚱渌牟僮鲾?shù)存儲(chǔ)在存儲(chǔ)器中,而不是首先將它們載入寄存器中。像RISC體系結(jié)構(gòu)這樣的某些結(jié)構(gòu)首先載入寄存器,但是英特爾結(jié)構(gòu)可以在存儲(chǔ)器中具有操作數(shù)。使用寄存器和存儲(chǔ)器操作數(shù)的比較為pmaddwd xmm0,xmm1和pmaddwd xmm0,[eax]如果存儲(chǔ)在寄存器的地址eax中的存儲(chǔ)數(shù)據(jù)與xmm1中的數(shù)據(jù)相同,那么它們?cè)趚mm0內(nèi)產(chǎn)生相同的結(jié)果。如果代碼在寄存器之外運(yùn)行并且存儲(chǔ)器訪問較快,那么期望使用存儲(chǔ)器操作數(shù)。
圖3示出根據(jù)圖2大致描述的過程的模乘法30。在這個(gè)例子中,模乘法是伽羅瓦域算法,其中XOR用于在沒有進(jìn)位(例如,沒有進(jìn)位的二進(jìn)制加法,如1+1=0,0+0=0,0+1=1和1+0=1,并且具有通常通過XOR所計(jì)算的結(jié)果)的情況下相加數(shù)值。如圖3所示,確定常規(guī)方矩陣的乘法30b(x)=c(x)a(x)。圖4說明用于圖3所示的矩陣乘法的寄存器數(shù)據(jù)載入模式40的確定。如圖4的寄存器排序示意圖40所示,用于下一步驟的寄存器中的數(shù)據(jù)為黑體。實(shí)線表示矩陣被復(fù)制的邊界。在第一步驟中,a的列與c的對(duì)角線相乘。在第二步驟中,a的列被移動(dòng),并且與c的下一對(duì)角線相乘,如箭頭所示。
圖5說明由圖4所示的移動(dòng)所導(dǎo)致的寄存器中數(shù)據(jù)的順序50。如圖5中的時(shí)間步驟(A)所示,寄存器容納c的主對(duì)角線,并且以其存儲(chǔ)在存儲(chǔ)器中的順序保持a矩陣的數(shù)據(jù)。在圖5的時(shí)間步驟(B)中,寄存器容納移動(dòng)后的a的對(duì)角線和列。列的移動(dòng)是使用字節(jié)混洗(shuffle)操作來旋轉(zhuǎn)元素而實(shí)施的。請(qǐng)注意,a的列可以上移,并且c中的選擇對(duì)角線可以向左選擇,而不是向右。
圖6進(jìn)一步說明用于相乘4×4矩陣a和c的操作60。如有關(guān)圖4和圖5所述的那樣排序每個(gè)時(shí)間步驟的數(shù)據(jù)。在每個(gè)時(shí)間步驟C、D、E和F,計(jì)算a和c的模積。使用XOR將乘積加到其他步驟的乘積上。
以下偽代碼片斷提供矩陣乘法的示例實(shí)施(1)LOAD R3,MEMORY;c矩陣對(duì)角線1(2)LOAD R4,MEMORY;c矩陣對(duì)角線2(3)LOAD R5,MEMORY;c矩陣對(duì)角線3(4)LOAD R6,MEMORY;c矩陣對(duì)角線4(5)LOAD R7,MEMORY;數(shù)據(jù)混洗模式(6)LOAD R0,MEMORY;從存儲(chǔ)器載入a數(shù)據(jù)(第一模式)(7)MOVE R1,R0;復(fù)制第一數(shù)據(jù)模式(8)MODMUL R0,R3 ;a數(shù)據(jù)乘以對(duì)角線1(主對(duì)角線)(9)SHUFFLE R1,R7 ;產(chǎn)生旋轉(zhuǎn)列的第二a數(shù)據(jù)模式(10)MOVE R2,R1 ;復(fù)制第二a數(shù)據(jù)模式(11)MODMUL R1,R4 ;第二a數(shù)據(jù)模式乘以對(duì)角線2(12)XOR R0,R1;第一模式和第二模式相加(13)SHUFFLE R2,R7;產(chǎn)生旋轉(zhuǎn)列的第三a數(shù)據(jù)模式(14)MOVE R1,R2 ;復(fù)制第三數(shù)據(jù)模式(15)MODMUL R2,R5 ;第三a數(shù)據(jù)模式乘以對(duì)角線3(16)XOR R0,R2;相加第三模式(17)SHUFFLE R1,R7;產(chǎn)生旋轉(zhuǎn)列的第四a數(shù)據(jù)模式(18)MODMUL R1,R6 ;第四數(shù)據(jù)模式乘以對(duì)角線4(19)XOR R0,R1;相加第四模式(20)STORE MEMORY,R0 ;存儲(chǔ)輸出矩陣指令9-12表示這個(gè)方法的基本操作。在指令9中旋轉(zhuǎn)乘數(shù)a矩陣的列。由于結(jié)果被指令11的乘法覆蓋,因此在指令10中復(fù)制該結(jié)果,并且乘積加上指令12中的乘積的和。
非規(guī)則矩陣也可以實(shí)施本發(fā)明的處理過程的實(shí)施方式。例如,考慮圖7的矩陣乘法70,其中被乘數(shù)矩陣c的對(duì)角線中元素的數(shù)目不等于乘數(shù)矩陣a的列的數(shù)目,并且被乘數(shù)矩陣c的對(duì)角線要大于乘數(shù)矩陣a的列。在這個(gè)例子中,模乘法為3×2的c矩陣和2×4的矩陣a。對(duì)于這個(gè)例子,用于在SIMD寄存器中選擇和排序數(shù)據(jù)的方法在圖8中說明。c的第一對(duì)角線是c00,c11,c20。這個(gè)對(duì)角線和a的已擴(kuò)展列的前3個(gè)值相乘。由于a的列長(zhǎng)度僅是2,因此如圖8所示的順序80那樣,矩陣彼此互相堆疊以便有效地?cái)U(kuò)展列的長(zhǎng)度。另一種方法是一旦檢查到了列的末尾,繞回或旋轉(zhuǎn)回第一個(gè)值。圖9示出c的第一對(duì)角線和a的擴(kuò)展列的值的數(shù)據(jù)排列90。請(qǐng)注意,右邊a的前3個(gè)值是a00,a10,a00,因此重復(fù)a00。c的下一對(duì)角線是c01,c10,c21,而a的下一列是a10,a00,a10,這是通過下移如圖8所示的每個(gè)擴(kuò)展列中的一個(gè)元素而選擇的。圖9進(jìn)一步說明了矩陣a和c相乘的操作。每個(gè)時(shí)間步驟的數(shù)據(jù)順序90如對(duì)圖7和8有關(guān)的描述。在每個(gè)時(shí)間步驟,計(jì)算a和c的模乘積。使用XOR將乘積加至其他步驟的乘積上。
圖10示出使用2×3列的c和3×4矩陣a,被乘數(shù)矩陣c對(duì)角線少于乘數(shù)矩陣a的模乘法100。如圖11所示,順序選擇110設(shè)置c的第一對(duì)角線為c00和c11。這個(gè)對(duì)角線乘以a的擴(kuò)展列的最初的2個(gè)值a00和a10。a的列長(zhǎng)度為3,但只選擇了a列的2個(gè)值。圖12示出寄存器中的值的數(shù)據(jù)排列120。由于矩陣c具有三個(gè)對(duì)角線,因此有三對(duì)寄存器,其具有相乘在一起的矩陣a和c的值。只有第一列a00和a10的最初的2個(gè)值存儲(chǔ)在第一寄存器中。在下一對(duì)寄存器中,c的對(duì)角線是c01和c12,a的下一個(gè)值是通過向下移動(dòng)來選擇。例如,從第一列中的值是a10和a20。三對(duì)寄存器容納第三對(duì)角線和下移a的列的下一值。在這種情況下,第一列的值為a20和a00。
應(yīng)理解,上述圖3-12描述了不需要乘法/累加(MAC)指令的算術(shù)操作。作為替代,描述了使用模乘法的伽羅瓦域算法和用于加法的XOR。如果一行被乘數(shù)和一列乘數(shù)的元素的乘積和由相同于原矩陣元素的數(shù)據(jù)類型表示,那么常規(guī)算法和伽羅瓦域算法之間的差異僅存在于用于加法和乘法的方法。所有模式保持相同。如果結(jié)果所需的數(shù)據(jù)類型在大小上大于原始數(shù)據(jù),那么在進(jìn)行矩陣乘法之前增大矩陣元素的數(shù)據(jù)類型-大小通常加倍。在這種情況下,將不變的被乘數(shù)矩陣存為較大的數(shù)據(jù)類型。例如字節(jié)長(zhǎng)度的因數(shù)被存為16位整數(shù)。在圖3-12所示的計(jì)算之前,改變乘數(shù)矩陣的數(shù)據(jù)類型。SIMD拆開操作通常用于改變數(shù)據(jù)類型。這將增加所需寄存器的數(shù)量,但是相對(duì)于伽羅瓦域或傳統(tǒng)算法而言,圖3-圖12所描述的操作是不變的。
如果MAC指令有效,那么可以如以下圖12-15所述的那樣處理矩陣乘法。當(dāng)MAC指令可用于任何形式的算法時(shí)(包括伽羅瓦域算法),在傳統(tǒng)固定點(diǎn)算法的情況下,MAC計(jì)算2個(gè)乘積,并相加這些乘積,而且一般將結(jié)果寫為原始被乘數(shù)和乘數(shù)的長(zhǎng)度的2倍(典型的是16位字的字節(jié)和雙32位字的16位字)。在伽羅瓦域算法的情況下,MAC使用模乘法計(jì)算2個(gè)乘積,并使用XOR操作相加這些乘積,而且寫相同數(shù)據(jù)類型的結(jié)果。在伽羅瓦域算法中,表示和或乘積所需要的位的數(shù)目與表示原始數(shù)據(jù)所需的位的數(shù)目相同。在所有SIMD指令集(即Inter結(jié)構(gòu)指令集中的madd)中會(huì)發(fā)現(xiàn)常規(guī)算法的MAC。因此,圖13示出具有規(guī)則矩陣并使用了適當(dāng)?shù)腗AC指令的乘法130。如圖14所示,排序140以黑體字表示寄存器中的用于連續(xù)步驟的數(shù)據(jù)。實(shí)線表示復(fù)制矩陣的邊界。請(qǐng)注意,規(guī)則矩陣乘法元素是兩個(gè)值并且每次移動(dòng)也是兩個(gè)值。在規(guī)則乘法的情況下,c矩陣對(duì)角線中的值的數(shù)目是圖18所示的矩陣列(在這個(gè)例子中排序了8個(gè)值)的2倍。如圖15a和15b的寄存器排序150所示的那樣,復(fù)制每個(gè)a矩陣列。因此,a矩陣的最初的兩個(gè)列保持在一個(gè)寄存器中,而隨后的兩個(gè)保持在另一個(gè)寄存器中。除了在規(guī)則情況下,元素為兩個(gè)值之外,對(duì)規(guī)則矩陣乘法的數(shù)據(jù)排序的方法與模乘法中的數(shù)據(jù)排序相同。下一步驟的數(shù)據(jù)順序的移動(dòng)為兩個(gè)值,并且復(fù)制乘數(shù)列。將相乘-相加操作應(yīng)用于a和c中相鄰的值上。這個(gè)操作相乘a和c中的值,并且相加相鄰的結(jié)果。將相乘-相加結(jié)果存儲(chǔ)在兩倍于初始數(shù)據(jù)的長(zhǎng)度的空間內(nèi)。例如,在步驟(1)中,madd操作計(jì)算a00和c00以及a10和c01的乘積,并且將這兩個(gè)乘積相加。類似地,在步驟(2)中,madd操作計(jì)算a20和c02以及a30和c03的乘積,并將這個(gè)兩個(gè)乘積相加。將madd操作的結(jié)果相加,以便給處矩陣方法的結(jié)果b00。
使用16位字和128位寄存器的規(guī)則矩陣乘法的偽代碼如下所示(1)LOAD R5,MEMEORY ;系數(shù)對(duì)角線1(2)LOAD R6,MEMEORY ;系數(shù)對(duì)角線2(3)LOAD R7,MEMEORY ;數(shù)據(jù)混洗模式(4)LOAD R0,MEMEORY ;從存儲(chǔ)器中載入數(shù)據(jù)(第一模式)(5)MOVE R2,R0 ;復(fù)制第一數(shù)據(jù)模式(6)UNPACKLDQ R0,R0 ;復(fù)制數(shù)據(jù)列1和2(7)MOVE R1,R2 ;復(fù)制列1和2
(8)MADD R0,R5 ;乘法累加1和2(9)SHUFFLE R1,R7 ;產(chǎn)生第二數(shù)據(jù)模式(10)MADD R1,R6 ;乘法累加模式2列1和2(11)ADDW R0,R1 ;結(jié)果列1和2(12)STORE MEMORY,R0;存儲(chǔ)結(jié)果列1和2(13)UNPACKHDQ R2,R2;復(fù)制列3和4(14)MOVE R3,R2 ;拷貝列3和4(15)MADD R2,R5 ;乘法累加列3和4(16)SHUFFLE R3,R7 ;產(chǎn)生第二數(shù)據(jù)模式(17)MADD R3,R6 ;乘法累加模式2列3和4(18)ADDW R2,R3 ;結(jié)果列3和4(19)STORE MEMORY,R2;存儲(chǔ)結(jié)果列3和4每個(gè)結(jié)果都通過兩次相乘-相加操作,一次變換和一次相乘-相加結(jié)果的相加產(chǎn)生的。結(jié)果是16位的,因此16個(gè)結(jié)果需要兩個(gè)128位的寄存器。
雖然本發(fā)明尤其適用于使用SIMD指令實(shí)施的字節(jié)數(shù)據(jù)的矩陣的乘法,本發(fā)明并不限于這種乘法??梢允褂幂^大的數(shù)據(jù)類型,只要求減少可存儲(chǔ)在寄存器中的元素的數(shù)目,并且較大的矩陣具有更多的必須要存儲(chǔ)的元素。如果被乘數(shù)矩陣c的對(duì)角線,或者乘數(shù)矩陣的列不適合SIMD寄存器SIMD寄存器,則可將它們延伸至附加的寄存器。在使用較大寄存器的一些情況下,列中數(shù)據(jù)的旋轉(zhuǎn)需要寄存器之間的交換元素。
應(yīng)理解,在本說明書中所提到的“具體實(shí)實(shí)例”,“一個(gè)實(shí)施方式”,“某些實(shí)施方式”或者“其它實(shí)施方式”,意指與這些實(shí)施方式有關(guān)地描述的特定特征、結(jié)構(gòu)或特性包括在本發(fā)明的至少一些實(shí)施方式中,但未必包括在所有實(shí)施方式中。各種外觀“實(shí)施方式”,“一個(gè)實(shí)施方式”,“某些實(shí)施方式”沒必要全指相同的實(shí)施方式。
如果說明書聲明了部件、特征、結(jié)構(gòu)或特性,包括“可以”,“可能”,或“能夠”,則不要求包括特定部件、特征、結(jié)構(gòu)或特性。如果說明書或權(quán)利要求書提到“a”或“an”,其并不意味著僅有一個(gè)元件。如果說明書或權(quán)利要求書提供“附加”元件,其不排除存在一個(gè)以上的附加元件。
已受益于這個(gè)公開內(nèi)容的本領(lǐng)域熟練的技術(shù)人員將理解在本發(fā)明的范圍內(nèi)可以根據(jù)上述說明和附圖做出各種變化。因此,下列權(quán)利要求,包括對(duì)它的任何修正,定義本發(fā)明的范圍。
權(quán)利要求
1.一種矩陣乘法方法,包括將被乘數(shù)矩陣c的每個(gè)對(duì)角線載入處理器可訪問存儲(chǔ)器,將乘數(shù)矩陣a按列的順序載入處理器可訪問存儲(chǔ)器,通過移動(dòng)一個(gè)元素來移動(dòng)寄存器中乘數(shù)矩陣a的每列中的元素,一列的最后一個(gè)元素移動(dòng)至該列的開頭,并將被乘數(shù)c矩陣的對(duì)角線與乘數(shù)a矩陣的列相乘,它們的乘積與結(jié)果矩陣的列的乘積之和相加。
2.根據(jù)權(quán)利要求1所述的方法,其中處理器可訪問寄存器是SIMD寄存器。
3.根據(jù)權(quán)利要求2所述的方法,還包括將對(duì)角線載入處理器的多個(gè)SIMD寄存器。
4.根據(jù)權(quán)利要求1所述的方法,其中通過將乘數(shù)矩陣a的拷貝堆疊在彼此之上,在與被乘數(shù)c矩陣的對(duì)角線相乘之前,調(diào)整乘數(shù)a矩陣的長(zhǎng)度,以致使得列對(duì)齊并且拷貝的首行低于底行以及其他任何拷貝以延伸每個(gè)列。
5.根據(jù)權(quán)利要求1所述的方法,其中被乘數(shù)矩陣c對(duì)角線短于乘數(shù)矩陣a的列。
6.根據(jù)權(quán)利要求1所述的方法,其中被乘數(shù)矩陣c對(duì)角線長(zhǎng)于乘數(shù)矩陣a的列。
7.根據(jù)權(quán)利要求1所述的方法,其中移動(dòng)元素還包括將a的列與c的對(duì)角線相乘;以及以預(yù)定的順序移動(dòng)并相乘a的列和c的下一對(duì)角線。
8.根據(jù)權(quán)利要求1所述的方法,其中移動(dòng)元素還包括使用字節(jié)混洗操作來旋轉(zhuǎn)元素。
9.根據(jù)權(quán)利要求1所述的方法,其中每個(gè)元素是字節(jié)。
10.根據(jù)權(quán)利要求1所述的方法,其中乘以對(duì)角線還包括應(yīng)用MAC操作。
11.一種產(chǎn)品,包括存儲(chǔ)介質(zhì),在其上存儲(chǔ)有指令,當(dāng)機(jī)器執(zhí)行指令時(shí)導(dǎo)致將被乘數(shù)矩陣c的每個(gè)對(duì)角線載入處理器可訪問存儲(chǔ)器,將乘數(shù)矩陣a按列的順序載入處理器可訪問存儲(chǔ)器,通過移動(dòng)一個(gè)元素來移動(dòng)寄存器中乘數(shù)矩陣a的每列中的元素,一列的最后一個(gè)元素移動(dòng)至該列的開頭,以及將被乘數(shù)c矩陣的對(duì)角線與乘數(shù)a矩陣的列相乘,它們的乘積與結(jié)果矩陣的列的乘積之和相加。
12.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中處理器可訪問存儲(chǔ)器是SIMD寄存器。
13.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中將對(duì)角線載入處理器的多個(gè)SIMD寄存器。
14.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中通過將乘數(shù)矩陣a的拷貝堆疊在彼此之上,在與被乘數(shù)c矩陣的對(duì)角線相乘之前,調(diào)整乘數(shù)a矩陣的長(zhǎng)度,以致使列對(duì)齊并且拷貝的首行低于底行以及其他任何拷貝以延伸每個(gè)列,。
15.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中被乘數(shù)矩陣c對(duì)角線短于乘數(shù)矩陣a的列。
16.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中被乘數(shù)矩陣c對(duì)角線長(zhǎng)于乘數(shù)矩陣a的列。
17.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中移動(dòng)乘法和加法元素還包括將a的列與c的對(duì)角線相乘;以及按預(yù)定順序移動(dòng)并將a的列與c的下一對(duì)角線相乘。
18.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中移動(dòng)乘法和加法元素還包括使用字節(jié)混洗操作旋轉(zhuǎn)元素。
19.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中乘以對(duì)角線還包括應(yīng)用MAC操作。
20.權(quán)利要求11的包括其上存儲(chǔ)有指令的存儲(chǔ)介質(zhì)的產(chǎn)品,其中每個(gè)元素是字節(jié)。
21.一種系統(tǒng),包括處理器,具有寄存器,該寄存器將被乘數(shù)矩陣c的每個(gè)對(duì)角線載入處理器可訪問存儲(chǔ)器,并按列的順序?qū)⒊藬?shù)矩陣a載入處理器可訪問存儲(chǔ)器,以及控制邏輯,通過移動(dòng)一個(gè)元素來移動(dòng)寄存器中乘數(shù)矩陣a的每列中的乘法和加法元素,一列的最后一個(gè)元素移動(dòng)至該列的開頭,并將被乘數(shù)c矩陣的對(duì)角線與乘數(shù)a矩陣的列相乘,它們的乘積與結(jié)果矩陣的列的乘積之和相加。
22.根據(jù)權(quán)利要求21所述的系統(tǒng),其中處理器可訪問存儲(chǔ)器是SIMD寄存器。
23.根據(jù)權(quán)利要求22所述的系統(tǒng),還包括將對(duì)角線載入處理器的多個(gè)SIMD寄存器中。
24.根據(jù)權(quán)利要求21所述的系統(tǒng),其中通過將乘數(shù)矩陣a的拷貝堆疊在彼此之上,在與被乘數(shù)c矩陣的對(duì)角線相乘之前,調(diào)整乘數(shù)a矩陣的長(zhǎng)度,以致使得列對(duì)齊并且拷貝的首行低于底行以及其他任何拷貝以延伸每個(gè)列。
25.根據(jù)權(quán)利要求21所述的系統(tǒng),其中被乘數(shù)矩陣c對(duì)角線短于乘數(shù)矩陣a的列。
26.根據(jù)權(quán)利要求21所述的系統(tǒng),其中被乘數(shù)矩陣c對(duì)角線長(zhǎng)于乘數(shù)矩陣a的列。
27.根據(jù)權(quán)利要求21所述的系統(tǒng),其中移動(dòng)乘法和加法元素的控制邏輯還包括將a的列與c的對(duì)角線相乘;以及按預(yù)定的順序移動(dòng)并將a的列與c的下一對(duì)角線相乘。
28.根據(jù)權(quán)利要求21所述的系統(tǒng),其中移動(dòng)乘法和加法元素的控制邏輯還包括使用字節(jié)混洗操作旋轉(zhuǎn)元素。
29.根據(jù)權(quán)利要求21所述的系統(tǒng),其中每個(gè)元素是字節(jié)。
30.根據(jù)權(quán)利要求21所述的系統(tǒng),其中乘以對(duì)角線還包括應(yīng)用MAC操作。
全文摘要
公開了一種減少在SIMD處理器上的計(jì)算時(shí)間的矩陣乘法方法的例子。矩陣乘法需要將被乘數(shù)矩陣c的對(duì)角線載入處理器的不同寄存器中,并且需要將乘數(shù)矩陣a載入至少一個(gè)在縱向按序排列的寄存器中。通過移動(dòng)一個(gè)元素,有選擇地將寄存器中的乘數(shù)矩陣a的每列中的乘法和加法元素同已移動(dòng)的一列中的上個(gè)元素一起移動(dòng)至該列的前端。被乘數(shù)c矩陣的對(duì)角線乘以乘數(shù)a矩陣的列,它們的結(jié)果被加到結(jié)果矩陣的列的結(jié)果和上。
文檔編號(hào)G06F7/32GK1774709SQ200380107095
公開日2006年5月17日 申請(qǐng)日期2003年11月21日 優(yōu)先權(quán)日2002年12月20日
發(fā)明者W·小梅西 申請(qǐng)人:英特爾公司