TW202418114A - 用於矩陣運算加速器之指令的裝置,方法和系統 - Google Patents

用於矩陣運算加速器之指令的裝置,方法和系統 Download PDF

Info

Publication number
TW202418114A
TW202418114A TW112150704A TW112150704A TW202418114A TW 202418114 A TW202418114 A TW 202418114A TW 112150704 A TW112150704 A TW 112150704A TW 112150704 A TW112150704 A TW 112150704A TW 202418114 A TW202418114 A TW 202418114A
Authority
TW
Taiwan
Prior art keywords
matrix
circuit
instruction
brick
input
Prior art date
Application number
TW112150704A
Other languages
English (en)
Inventor
亞米特 葛雷斯坦
西蒙 路邦諾維奇
薩吉 米勒
賽義德 哈魯夫
加夫里 柏傑
澤夫 史博柏
約瑟 雅洛茲
羅恩 史奈德
Original Assignee
美商英特爾股份有限公司
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 美商英特爾股份有限公司 filed Critical 美商英特爾股份有限公司
Publication of TW202418114A publication Critical patent/TW202418114A/zh

Links

Images

Abstract

描述了關於矩陣運算加速器的系統、方法及裝置。在一個實施例中,處理器包括矩陣運算加速器電路,其包括融合乘積累加電路的二維柵格,可切換到排程模式以執行已解碼的單一指令,其中該矩陣運算加速器電路從代表第一輸入二維矩陣的第一複數個暫存器加載該融合乘積累加電路之二維柵格的第一緩衝器,檢查該融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與來自代表第二輸入二維矩陣的第二複數個暫存器的該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣,以及當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時:在執行該先前指令與該已解碼的單一指令之間防止回收該第二緩衝器,對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該緊接在前的輸入二維矩陣執行運算以產生結果,以及將該結果儲存在結果儲存中,以及當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時:將該第二輸入二維矩陣加載到該融合乘積累加電路之二維柵格的該第二緩衝器中,對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該第二輸入二維矩陣執行該運算以產生結果,並將該結果儲存在該結果儲存中。

Description

用於矩陣運算加速器之指令的裝置,方法和系統
本公開係一般地關於電腦處理器架構,並且更具體地,係關於執行指令以使用矩陣運算加速器電路執行矩陣運算的裝置、系統及方法。
處理器,或一組處理器,執行來自指令集,例如,指令集架構(ISA),的指令。指令集是與編程相關的電腦架構的一部分,並且通常包括原生資料類型、指令、暫存器架構、定址模式、記憶體架構、中斷及異常處置及外部輸入及輸出(I/O)。應注意的是,本文中指令一詞可指稱巨集指令,例如,提供給處理器執行的指令,或者可指稱微指令,例如,由處理器的解碼器解碼巨集指令產生的指令。
在下面的描述中,闡述了許多具體細節。然而,應理解的是,可以在沒有這些具體細節的情況下實踐實施例。在其他情況下,未詳細示出公知的電路、架構和技術,以免混淆對本說明書的理解。
說明書中對“一個實施例”、“一實施例”、“一示例性實施例”等的引用表示所描述的實施例可包括特定的特徵、架構或特性,但每個實施例不一定都包括該特定的特徵、架構或特性。而且,這樣的用詞不一定指相同的實施例。此外,當結合一實施例描述特定的特徵、架構或特性時,無論是否明確地描述,可以認為結合其他實施例影響此種特徵、架構或特性是落在本領域之技術人員的知識範圍內的。
在許多計算任務中,諸如機器學習及其他批量資料處理,矩陣可能越來越重要。深度學習是機器學習演算法的一類。深度學習架構,諸如深度神經網路,可被應用於包括計算機視覺、語音辨識、自然語言處理、音頻辨識、社交網路過濾、機器翻譯、生物資訊學及藥物設計的領域。
推理和訓練,這兩個用於深度學習的工具,可利用低精度運算。最大化深度學習演算法的通量和計算可以幫助滿足例如在資料中心執行深度學習的那些深度學習處理器的需求。
矩陣-矩陣乘法(又稱GEMM或通用矩陣乘法)在某些處理器上是計算繁重的運算。矩陣乘法(例如,GEMM)專用的硬體是用於改善某些應用,諸如深度學習,的峰值計算(及能效)的好選擇。這些應用,包括深度學習,中的一些應用,可以對具有相對較少的位元的輸入資料元件進行運算而不失準確性,只要輸出元件具有足夠的位元(例如,比輸入多)即可。
在某些處理器中,處理矩陣是一項困難及/或指令密集的任務。例如,可將矩陣的列(row)放入複數個緊縮資料(例如,SIMD或向量)暫存器,然後分別進行運算。例如,依據資料大小,兩個8x2(例如,列數×行數)矩陣相加可能需要加載或集合到四個緊縮資料暫存器。然後,執行與每個矩陣的第一列相對應的緊縮資料暫存器的第一加法,並且執行與每個矩陣的第二列相對應的緊縮資料暫存器的第二加法。然後,將緊縮資料暫存器的結果分散回記憶體。雖然對於小型矩陣,這種情況是可以接受的,但對於大型矩陣,通常是不能接受的。 討論
本文描述的是用以支持電腦硬體,諸如中央處理單元(CPU)、圖形處理單元(GPU)及加速器,中的矩陣運算的機制。矩陣運算利用2維(2-D)資料結構,其表示諸如暫存器之記憶體的一或多個緊縮區域。在整個說明書中,這些2-D資料結構被稱為磚片(tile)。應注意的是,矩陣可以小於磚片(使用少於一磚片的全部)或利用複數個磚片(矩陣大於任意一個磚片的大小)。在整個說明書中,使用矩陣(磚片)語言來指示使用影響矩陣之磚片執行的運算;矩陣是否大於任意一個磚片通常無關緊要。
每個磚片可以透過不同運算來執行,諸如本文中所詳述的那些運算,包括但不限於:矩陣(磚片)乘法、磚片加法、磚片減法、磚片對角線、磚片零、磚片轉換、磚片點積、磚片廣播、磚片列廣播、磚片行廣播、磚片乘法、磚片乘積累加、磚片移動等等。另外,未來可能會在這些運算中使用支持運算子,諸如使用比例尺及/或偏差,或支持非數字應用,例如,OpenCL“本地記憶體”、資料壓縮/解壓縮等。本文中還描述了指令,用於執行矩陣運算(例如,TILEPARTIALDOTPRODUCT)指令。
儲存部分(諸如記憶體(非揮發性或揮發性)、暫存器、快取等等)被排列成具有不同水平及垂直尺寸的磚片。例如,磚片可具有水平尺寸為4(例如,矩陣的4列)及垂直尺寸為8(例如,矩陣的8行)。通常,水平尺寸與元件大小(例如,2-、4-、8-、16-、32-、64-、128-位元等等)相關。可以支援多種資料類型(單精度浮點數、雙精度浮點數、整數等)。 已配置磚片的示例性用法
在一些實施例中,可以配置磚片參數。例如,可將給定的磚片配置成提供磚片選項。示例性磚片選項包括但不限於:磚片的列數、磚片的行數、磚片是否為有效的(VALID)、以及磚片是否由同等大小的磚片成對(PAIR)組成。
圖1A示出已配置磚片的實施例。如所示,4 kB的應用記憶體102在其上儲存有4個1kB的磚片:磚片t0 104、磚片t1 106、磚片t2 108及磚片t3 110。在此範例中,4個磚片不包含成對(pairs),並且每個磚片都具有以列及行排列的元件。磚片t0 104及磚片t1 106具有K列及N行的4位元組元件(例如,單精度資料),其中K等於8及N=32。磚片t2 108及磚片t3 110具有K列及N/2行的8位元組元件(例如,雙精度資料)。由於雙精度運算元是單精度寬度的兩倍,因此此配置與用以提供磚片選項的調色板(palette)一致,該調色板提供至少4個名稱,總儲存量至少4 kB。在運算中,可使用加載及儲存運算從記憶體載入磚片及將磚片儲存到記憶體。根據所使用的指令編碼方案,應用記憶體的可用數量以及可用的磚片大小、數量及配置會有所不同。
圖1B示出已配置磚片的實施例。如所示,4 kB的應用記憶體122在其上儲存有2對1kB磚片組:第一對是磚片t4L 124及磚片t4R 126,以及第二對是磚片t5L 128及磚片t5R 130。如圖所示,成對的磚片被分成左磚片及右磚片。在其他實施例中,該對磚片被分成偶數磚片及奇數磚片。在此範例中,4個磚片各具有以列及行排列的元件。磚片t4L 124及磚片t4R 126具有K列及N行的4位元組元件(例如,單精度浮點資料),其中K等於8及N等於32。磚片t5L 128及磚片t5R 130具有K列及N/2行的8位元組元件(例如,雙精度浮點資料)。由於雙精度運算元是單精度寬度的兩倍,因此此配置與用以提供磚片選項的調色板一致,該調色板提供至少2個名稱,總儲存量至少4 kB。圖1A的四個磚片使用4個名稱,每個命名1 kB的磚片,而圖1B中的2對磚片可以使用2個名稱來指定成對的磚片。在一些實施例中,磚片指令接受成對的磚片的名稱作為運算元。在運算中,可使用加載及儲存運算從記憶體載入磚片及將磚片儲存到記憶體。根據所使用的指令編碼方案,應用記憶體的可用數量以及可用的磚片大小、數量及配置會有所不同。
在一些實施例中,磚片參數是可定義的。例如,“調色板”被用來提供磚片選項。示例性選項包括但不限於:磚片名稱的數量、儲存列中的位元組數量、磚片中的列數及行數等等。例如,磚片的最大“高度”(列數)可被定義成:
磚片最大列數(Tile Max Rows)=架構化的儲存(Architected Storage) / (調色板名稱數*每列的位元組數)。
如此,可以編寫應用,使得名稱的固定用法將能夠在各種實現方案中利用不同的儲存大小。
使用磚片配置(“TILECONFIG”)指令來完成磚片的配置,其中在所選的調色板中定義特定的磚片用法。此聲明包括要使用的磚片名稱數量、每個名稱(磚片)要求的列數及行數、以及在一些實施例中,每個磚片要求的資料類型。在一些實施例中,在執行TILECONFIG指令的期間執行一致性檢查,以確定其匹配調色板項目的限制。 示例性磚片儲存類型
圖2示出矩陣儲存器的多個範例。在(A)中,磚片儲存在記憶體中。如所示,每「列」由四個緊縮資料元件組成。為了到達下一「列」,使用跨步(stride)值。應注意的是,列可以連續地儲存在記憶體中。當磚片儲存未映射基本記憶體陣列列寬時,跨步式記憶體存取允許存取一列然後存取下一列。
磚片從記憶體載入及儲存到記憶體通常是從應用記憶體到緊縮的資料列的跨步式存取。在一些實施例中,示例性TILELOAD及TILESTORE指令、或其他作為加載運算(load-op)指令中的TILE運算元參照應用記憶體的指令,可重新啟動以處理(多達)2*列的頁面錯誤,未屏蔽的浮點數異常、及/或每條指令的中斷。
在(B)中,矩陣儲存在包含複數個暫存器的磚片中,該複數個暫存器諸如緊縮資料暫存器(單指令、多資料(SIMD)或向量暫存器)。在此範例中,磚片覆蓋在三個物理暫存器上。通常,使用連續的暫存器,然而,這不是必須的情況。
在(C)中,矩陣儲存在非暫存器儲存中的磚片中,該非暫存器儲存可存取磚片運算中使用的融合乘積累加(FMA)電路。此儲存可以在FMA內,或與其相鄰。此外,在一些實施例中,如下所述,儲存可用於資料元件,而不是整列或磚片。
TMMA架構支持的參數係透過CPUID報告。在一些實施例中,資訊列表包括最大高度及最大SIMD尺寸。配置TMMA架構需要指定每個磚片的尺寸、每個磚片的元件大小及調色板識別符。此配置係透過執行TILECONFIG指令完成。
成功執行TILECONFIG指令能啟用後續的TILE運算元。TILERELEASEALL指令清除磚片配置並禁用TILE運算(直到下一個TILECONFIG指令執行)。在一些實施例中,XSAVE、XSTORE等用於使用磚片的上下文切換。在一些實施例中,XSAVE中使用2個XCR0位元,其 中一個位元用於TILECONFIG元資料,另一個位元對應於實際磚片負載資料。
TILECONFIG不僅配置磚片使用,還設置狀態變數,其指示程式位於已配置了磚片的程式碼區域中。一實施方案可列舉對其他可以與磚片區域一起使用的指令的限制,例如不使用現有的暫存器集等。
退出磚片區域通常是使用TILERELEASEALL指令完成的。其不帶任何參數,並迅速地使所有磚片失效(指示資料不再需要任何保存或復原),並清除與位於磚片區域中相對應的內部狀態。
在一些實施例中,磚片運算會將超出磚片配置指定之尺寸的任何列及任何行清零。例如,當寫入每一列時,磚片運算會將超出配置行數(考量元件大小)的資料清零。例如,具有64位元組的列以及配置有10列及12行的磚片,寫入FP32元件的運算將輸出/結果資料寫入具有12*4位元組的前10列中的每一列,並且將每一列中剩下的4*4位元組清零。磚片運算還將前10個已配置的列之後的每一列完全清零。當使用具有64位元組的列的1K磚片時,將有16列,因此在此範例中,最後6列也會被清零。
在一些實施例中,上下文復原指令(例如,XRSTOR)在加載資料時,會強制將超出磚片已配置的列的資料保持為零。若沒有有效的配置,則將所有列清零。磚片資料的XRSTOR可以在已配置的行之外的行中加載廢料(garbage)。XRSTOR應該不可能清除超出已配置的行數,因為沒有與磚片配置相關聯的元件寬度。
上下文保存(例如,XSAVE)在將其寫入記憶體時會暴露整個TILE儲存區域。若XRSTOR將廢料資料加載到磚片的最右側,則該資料將由XSAVE保存。XSAVE將為超出各磚片指定數目的列寫入零。
在一些實施例中,磚片指令是可重新啟動的。存取記憶體的操作允許在尋頁錯失之後重新啟動。處理浮點運算的計算指令還允許未屏蔽的浮點異常,並由控制及/或狀態暫存器控制對異常的屏蔽。
為了支持在這些事件之後的重新啟動指令,指令將資訊儲存在下面詳述的啟動暫存器中。 矩陣(磚片)運算系統 示例性硬體支持
圖3示出利用矩陣(磚片)運算加速器之系統的實施例。在此圖中,主處理器/處理系統301將命令311(例如,諸如算術或矩陣處理運算的矩陣調處(manipulation)操作、或載入及儲存操作)傳遞給矩陣運算加速器307。然而,這僅是出於討論的目的來顯示此種方式。如稍後將詳述的,此加速器307可以是處理核心的一部分。通常,作為磚片調處運算子指令的命令311,將磚片稱為暫存器-暫存器(“reg-reg”)或暫存器-記憶體(“reg-mem”)格式。其他諸如TILESTORE、TILELOAD、TILECONFIG等的命令不在磚片上執行資料運算。命令可以是加速器307要處理的已解碼的指令(例如,微運算)或巨集指令。
在此範例中,連貫記憶體(coherent memory)介面303耦接到主處理器/處理系統301以及陣列運算加速器307,使得它們可以共享記憶體。圖4及5示出了如何使用矩陣運算加速器共享記憶體的不同實施例。如圖4中所示,主處理器401及矩陣運算加速器電路405共享相同的記憶體403。圖5示出一實施例,其中主處理器501及矩陣運算加速器505不共享記憶體,但可以存取彼此的記憶體。例如,處理器501可以存取磚片記憶體507並按常規使用其之主記憶體503。類似的,矩陣運算加速器505可以存取主記憶體503,但更通常地使用其自身的記憶體507。請注意,這些記憶體可以是不同類型。
在一些實施例中,使用物理暫存器上的覆蓋(overlay)來支持磚片。例如,依據實現方案,磚片可利用16個1,024位元的暫存器、32個512位元的暫存器等等。在一些實施例中,矩陣運算利用2維(2-D)資料結構來表示記憶體的一或多個緊縮區域,諸如暫存器。在整個說明書中,這些2-D資料結構被稱為磚片或磚片暫存器。
在一些實施例中,矩陣運算加速器307包括耦合到資料緩衝器305的複數個FMA 309(在一些實施方式中,將這些緩衝器305中的一或多個儲存在如圖所示之柵格的FMA中)。資料緩衝器305對從記憶體載入的磚片及/或要儲存到記憶體的磚片進行緩衝(例如,使用磚片加載或磚片儲存指令)。資料緩衝器可以是,例如,複數個暫存器。通常,這些FMA被佈置成能夠讀取及寫入磚片的鍊接FMA 309的柵格。在此範例中,矩陣運算加速器307係用以使用磚片T0、T1及T2來執行矩陣乘法運算。磚片中的至少一個磚片被安置在FMA柵格309中。在一些實施例中,運算中的所有磚片被儲存在FMA柵格309中。在其他實施例中,僅子集合被儲存在FMA柵格309中。如所示,安置T1,但不安置T0及T2。應注意的是,A、B及C是指這些磚片的矩陣,其可能或可能不會佔用磚片的整個空間。
圖6示出使用磚片之矩陣乘積累加運算(“TMMA”)的實施例。
在某些實施例中,陣列中的列數(磚片A 601)與包括計算延遲的串列(鍊接)FMA的數量匹配。一實施方案可以在具有較小高度的柵格上重複循環,但計算保持不變。
來源/目的地向量來自具有N列的磚片(磚片C 605),且FMA 611的柵格執行N個向量-矩陣運算,從而得到執行磚片之矩陣乘法的完整指令。磚片B 603是另一個向量來源,並且在每個階段中向FMA提供“廣播”項。
在一些實施例中,在運算中,矩陣B的元件(儲存在磚片B 603中)分佈在FMA的矩形柵格。矩陣B(儲存在磚片A 601中)使其一列之元件轉換為與FMA的矩形柵格的列尺寸匹配。在柵格中的每個FMA處,將A及B的元件相乘,並加到傳入的被加數(來自圖式的上方),將傳出的總和傳遞到FMA的下一列(或最終輸出)。
單步驟的延遲與K(矩陣B的列高)成正比,並且相依的TMMA通常具有足夠的來源-目的地列(在單一磚片中或者跨磚片)以隱藏該延遲。一實施方案還可跨時間步長分裂SIMD(緊縮資料元件)維度M(矩陣A的列高),但這只是改變了K乘以的常數。當程式指定比TMMA列舉的最大值小的K時,實施方案可以利用“屏蔽”或“提前輸出”來實現此。
整個TMMA的延遲與N*K成正比。重複率與N成正比。每一TMMA指令的MAC數為N*K*M。
圖7示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。特別是,這說明了目的地之一個緊縮資料元件位置的迭代的執行電路。在此實施例中,連鎖的融合乘積累加對帶正負號的來源進行運算,其中累加器是輸入資料大小的2倍。
第一帶正負號的來源(來源1 701)及第二帶正負號的來源(來源2 703)各具有四個緊縮資料元件。這些緊縮資料元件之各者都儲存有正負號的資料,諸如浮點數資料。第三帶正負號的來源(來源3 709)具有兩個緊縮資料元件,其各者皆儲存有帶正負號的資料。第一及第二帶正負號的來源701及703的大小是第三帶正負號的來源(初始值或先前結果)709的大小的一半。例如,第一及第二帶正負號的來源701及703可具有32位元的緊縮資料元件(例如,單精度浮點數),而第三帶正負號的來源709可具有64位元的緊縮資料元件(例如,雙精度浮點數)。
在此圖中,僅示出了兩個第一及第二帶正負號的來源701及703的兩個最高有效緊縮資料元件位置以及第三帶正負號的來源709的最高有效緊縮資料元件位置。當然,也會處理其他緊縮資料元件位置。
如所示,成對地處理緊縮資料元件。例如,使用乘法器電路705將第一及第二帶正負號的來源701及703的最高有效緊縮資料元件位置的資料相乘,以及使用乘法器電路707將第一及第二帶正負號的來源701及703的第二最高有效緊縮資料元件位置的資料相乘。在一些實施例中,這些乘法器電路705及707被重複用於其他緊縮資料元件位置。在其他實施例中,使用額外的乘法器電路,以便平行處理緊縮資料元件。在一些上下文中,使用具有帶正負號的第三來源709的大小的通道來完成平行執行。使用加法電路711將每個乘法的結果相加。
將乘法的結果相加的結果加到從帶正負號的來源3 709的最高有效緊縮資料元件位置的資料(使用不同的加法器713或相同的加法器711)。
最終,第二加法的結果被儲存到帶正負號的目的地715之對應於來自帶正負號的第三來源709所使用的緊縮資料元件位置的緊縮資料元件位置中、或者被傳遞給下一個迭代(如果有的話)。在一些實施例中,將寫入遮罩應用到此儲存,使得若對應的寫入遮罩(位元)被設置,則發生儲存,若未被設置,則不發生儲存。
圖8示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。特別是,這說明了目的地之一個緊縮資料元件位置的迭代的執行電路。在此實施例中,連鎖的融合乘積累加對帶正負號的來源進行運算,其中累加器是輸入資料大小的2倍。
第一帶正負號的來源(來源1 801)及第二帶正負號的來源(來源2 803)各具有四個緊縮資料元件。這些緊縮資料元件之各者都儲存有正負號的資料,諸如整數資料。第三帶正負號的來源(來源3 809)具有兩個緊縮資料元件,其各者皆儲存有帶正負號的資料。第一及第二帶正負號的來源801及803的大小是第三帶正負號的來源809的大小的一半。例如,第一及第二帶正負號的來源801及803可具有32位元的緊縮資料元件(例如,單精度浮點數),第三帶正負號的來源809可具有64位元的緊縮資料元件(例如,雙精度浮點數)。
在此圖中,僅示出了第一及第二帶正負號的來源801及803的兩個最高有效緊縮資料元件位置以及第三帶正負號的來源809的最高有效緊縮資料元件位置。當然,也會處理其他緊縮資料元件位置。
如所示,緊縮資料元件是成對被處理的。例如,使用乘法器電路805將第一及第二帶正負號的來源801及803的最高有效緊縮資料元件位置的資料相乘,以及使用乘法器電路807將來自第一及第二帶正負號的來源801及803的第二最高有效緊縮資料元件位置的資料相乘。在一些實施例中,這些乘法器電路805及807被重複用於其他緊縮資料元件位置。在其他實施例中,使用額外的乘法器電路,以便平行處理緊縮資料元件。在一些上下文中,使用具有帶正負號的第三來源(初始值或先前迭代結果)809的大小的通道來完成平行執行。使用加法/飽和電路813將每個乘法的結果加到帶正負號的第三來源809。
當加法結果導致值太大時,加法/飽和(累加器)電路813會保留運算元的正負號。特別是,飽和評估發生在介於多路加法(multi-way-add)及寫入至目的地或下一次迭代之間的無限精度結果。當累加器813是浮點數且輸入項是整數時,乘積及浮點累加器輸入值之和被轉換為無線精度值(數百位元的定點數),執行乘法結果與第三輸入的相加,以及執行單捨入至實際的累加器類型。
無正負號的飽和表示將輸出值限制為該元件寬度的最大無正負號數(全為1)。帶正負號的飽和表示將值限制為該元件寬度的最小負數與最大正數之間的範圍(例如,針對位元組,範圍為從-128(=-2^7)至127(=2^7-1))。
加法及飽和檢查的結果被儲存到帶正負號的結果815之對應於來自帶正負號的第三來源809所使用的緊縮資料元件位置的緊縮資料元件位置中、或者被傳遞給下一個迭代(如果有的話)。在一些實施例中,將寫入遮罩應用於此儲存,以便若對應的寫入遮罩(位元)被設置,則發生儲存,若未被設置,則不發生儲存。
圖9示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。特別是,這說明了目的地之一個緊縮資料元件位置的迭代的執行電路。在此實施例中,連鎖的融合乘積累加對帶正負號的來源以及無正負號的來源進行運算,其中累加器是輸入資料大小的4倍。
第一帶正負號的來源(來源1 901)及第二無正負號的來源(來源2 903)各具有四個緊縮資料元件。這些緊縮資料元件之各者有諸如浮點數或整數資料的資料。第三帶正負號的來源(初始值或結果915)具有儲存有帶正負號資料的緊縮資料元件。第一及第二來源901及903的大小是第三帶正負號的來源915的大小的四分之一。例如,第一及第二來源901及903可具有16位元的緊縮資料元件(例如,字組),及第三帶正負號的來源915可具有64位元的緊縮資料元件(例如,雙精度浮點數或64位元整數)。
在此圖中,示出了第一及第二來源901及903的四個最高有效緊縮資料元件位置以及第三帶正負號的來源915的最高有效緊縮資料元件位置。當然,也會處理其他緊縮資料元件位置,如果有的話。
如所示,以四個一組處理緊縮資料元件。例如,使用乘法器電路905將第一及第二來源901及903的最高有效緊縮資料元件位置的資料相乘,使用乘法器電路907將來自第一及第二來源901及903的第二最高有效緊縮資料元件位置的資料相乘,使用乘法器電路909將來自第一及第二來源901及903的第三最高有效緊縮資料元件位置的資料相乘,以及使用乘法器電路911將來自第一及第二來源901及903的最低有效緊縮資料元件位置的資料相乘。在一些實施例中,在乘法之前,將第一來源901的帶正負號的緊縮資料元件進行正負號擴展,及將第二來源903的無正負號的緊縮資料元件進行零擴展。
在一些實施例中,這些乘法器電路905-911被重複用於其他緊縮資料元件位置。在其他實施例中,使用額外的乘法器電路,以便平行處理緊縮資料元件。在一些上下文中,使用具有帶正負號的第三來源915的大小的通道來完成平行執行。使用加法電路913將每個乘法的結果相加。
將乘法的結果相加的結果加到來自帶正負號的來源3 915的最高有效緊縮資料元件位置的資料(使用不同的加法器917或相同的加法器913)。
最終,第二加法的結果919被儲存到帶正負號的目的地之對應於來自帶正負號的第三來源915所使用的緊縮資料元件位置的緊縮資料元件位置中、或者被傳遞給下一個迭代。在一些實施例中,將寫入遮罩應用於此儲存,以便若對應的寫入遮罩(位元)被設置,則發生儲存,若未被設置,則不發生儲存。
圖10示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。特別是,這說明了目的地之一個緊縮資料元件位置的迭代的執行電路。在此實施例中,連鎖的融合乘積累加對帶正負號的來源以及無正負號的來源進行運算,其中累加器是輸入資料大小的4倍。
第一帶正負號的來源1001及第二無正負號的來源1003各具有四個緊縮資料元件。這些緊縮資料元件之各者都儲存有諸如浮點數或整數資料的資料。第三帶正負號的來源1015(初始或先前結果)具有儲存有帶正負號資料的緊縮資料元件。第一及第二來源的大小是第三帶正負號的來源1015(初始或先前結果)的大小的四分之一。例如,第一及第二來源可具有16位元的緊縮資料元件(例如,字組),及第三帶正負號的來源1015(初始或先前結果)可具有64位元的緊縮資料元件(例如,雙精度浮點數或64位元整數)。
在此圖中,示出了第一帶正負號的來源1001及第二無正負號的來源1003的四個最高有效緊縮資料元件位置與第三帶正負號的來源1015的最高有效緊縮資料元件位置。當然,也會處理其他緊縮資料元件位置,如果有的話。
如所示,以四個一組處理緊縮資料元件。例如,使用乘法器電路1005將第一帶正負號的來源1001與第二無正負號的來源1003的最高有效緊縮資料元件位置的資料相乘,使用乘法器電路1007將來自第一帶正負號的來源1001與第二無正負號的來源1003的第二最高有效緊縮資料元件位置的資料相乘,使用乘法器電路1009將來自第一帶正負號的來源1001與第二無正負號的來源1003的第三最高有效緊縮資料元件位置的資料相乘,以及使用乘法器電路1011將來自第一帶正負號的來源1001與第二無正負號的來源1003的最低有效緊縮資料元件位置的資料相乘。在一些實施例中,在乘法之前,將第一帶正負號的來源1001的帶正負號的緊縮資料元件進行正負號擴展,及將第二無正負號的來源1003的無正負號的緊縮資料元件進行零擴展。
在一些實施例中,這些乘法器電路1005-1011被重複用於其他緊縮資料元件位置。在其他實施例中,使用額外的乘法器電路,以便平行處理緊縮資料元件。在一些上下文中,使用具有第三帶正負號的來源1015(初始或先前結果)的大小的通道來完成平行執行。使用加法/飽和1013電路將乘法的結果相加的結果加到來自第三帶正負號的來源1015(初始或先前結果)的最高有效緊縮資料元件位置的資料。
當加法得出的值對於帶正負號的飽和度來說太大或太小時,加法/飽和(累加器)電路1013會保留運算元的正負號。特別是,飽和評估發生在介於多路加法及寫入至目的地之間的無限精度結果。當累加器1013是浮點數且輸入項是整數時,乘積及浮點累加器輸入值之和被轉換為無線精度值(數百位元的定點數),執行乘法結果與第三輸入的相加,以及執行單捨入至實際的累加器類型。
加法及飽和檢查的結果1019被儲存到帶正負號的目的地之對應於來自第三帶正負號的來源1015(初始或先前結果)所使用的緊縮資料元件位置的緊縮資料元件位置中、或者被傳遞給下一個迭代。在一些實施例中,將寫入遮罩應用到此儲存,使得若對應的寫入遮罩(位元)被設置,則發生儲存,若未被設置,則不發生儲存。
圖11示出依據實施例的二次冪大小的SIMD實現,其中累加器使用的輸入大小大於乘法器的輸入大小。應注意的是,來源(至乘法器)及累加器值可以是帶正負號的或無正負號的值。針對具有2倍輸入大小的累加器(換言之,累加器輸入值的大小是來源的緊縮資料元件大小的兩倍),表1101示出了不同的配置。針對位元組大小的來源,累加器使用大小為16位元的字組或半精度浮點(HPFP)值。針對字組大小的來源,累加器使用大小為32位元的32位元整數或單精度浮點(SPFP)值。針對SPFP或32位元整數大小的來源,累加器使用64位元的64位元整數或雙精度浮點(DPFP)值。
針對具有4倍輸入大小的累加器(換言之,累加器輸入值的大小是來源的緊縮資料元件大小的四倍),表1103示出了不同的配置。針對位元組大小的來源,累加器使用大小為32位元的32位元整數或單精度浮點(SPFP)值。在一些實施例中,針對字組大小的來源,累加器使用大小為64位元的64位元整數或雙精度浮點(DPFP)值。
針對具有8倍輸入大小的累加器(換言之,累加器輸入值的大小是來源的緊縮資料元件大小的八倍),表1105示出了配置。針對位元組大小的來源,累加器使用64位元整數。
如先前所暗示的,矩陣運算電路可被包含在核心中,或者作為外部的加速器。圖12示出使用矩陣運算電路之系統的實施例。在此圖中,多個實體與環形互連1245耦合。
複數個核心,核心0 1201、核心1 1203、核心2 1205、及核心N 1207提供基於非磚片的指令支持。在一些實施例中,矩陣運算電路1251被設置於核心1203中,以及在其他實施例中,矩陣運算電路1211及1213在環形互連1245上是可存取的。
此外,一或多個記憶體控制器1223-1225被設置以代表核心及/或矩陣運算電路與記憶體1233及1231通訊。
圖13示出支持使用磚片之矩陣運算的處理器核心管線的實施例。分支預測及解碼電路1303從儲存在指令儲存1301中的指令執行指令的分支預測、指令的解碼、及/或兩者。例如,本文詳述的指令可被儲存在指令儲存中。在一些實施方式中,將獨立電路用於分支預測,並且在一些實施例中,使用微碼1305將至少一些指令解碼為一或多個微運算、微碼入口點、微指令、其他指令、或其他控制信號。可使用各種不同機制來實現分支預測及解碼電路1303。合適機制的範例可包括,但不限於,查找表、硬體實現、可編程邏輯陣列(PLA)、微碼唯讀記憶體(ROM)等等。
分支預測及解碼電路1303耦合到分配/重命名1307電路,其在一些實施例中耦合到排程器電路1309。在一些實施例中,這些電路透過執行下面一或多項操作來提供暫存器重命名、暫存器分配、及/或排程功能:1)將邏輯運算元值重命名為物理運算元值(例如,在一些實施例中為暫存器別名表),2)將狀態位元及旗標分配給已解碼指令,以及3)將出自指令池的已解碼指令進行排程以在執行電路上執行(例如,在一些實施例中使用保留站)。
排程器電路1309代表任何數量的不同排程器,包括保留站、中心指令窗口等。排程器電路1309耦合到,或包括,物理暫存器檔案1315。每個物理暫存器檔案1315代表一或多個物理暫存器檔案,不同的物理暫存器檔案儲存一或多種不同資料類型,諸如純量整數、純量浮點數、緊縮整數、緊縮浮點數、向量整數、向量浮點數、狀態(例如,指令指標,其為要執行的下一個指令的位址)、磚片等等。在一個實施例中,物理暫存器檔案1315包括向量暫存器電路、寫入遮罩暫存器電路、及純量暫存器電路。這些暫存器電路可提供架構向量暫存器、向量遮罩暫存器、及通用暫存器。物理暫存器檔案1315被引退電路1317重疊,以示出可實現暫存器重命名及亂序執行的各種方式(例如,使用重新排序緩衝器及引退暫存器檔案;使用未來檔案、歷史緩衝器、及引退暫存器檔案;使用暫存器映射及暫存器池;等等)。引退電路1317及物理暫存器檔案1315被耦合到執行電路1311。
儘管在亂序執行的上下文中描述了暫存器重命名,但應理解的是,暫存器重命名可以在有序架構中使用。雖然示出的處理器的實施例還可包括單獨的指令和資料快取單元以及共享的L2快取單元,但替代的實施例可具有用於指令和資料二者的單一內部快取,諸如,舉例來說,第1階(L1)內部快取或多階的內部快取。在一些實施例中,系統可包括內部快取與核心及/或處理器外部的外部快取的組合。替代地,所有快取可以在核心及/或處理器的外部。
執行電路1311是一或多個執行電路的集合,包括純量電路1321、向量/SIMD電路1323、及矩陣運算電路1327,以及用以存取快取1313的記憶體存取電路1325。執行電路執行各種運算(例如,移位、加法、減法、乘法)以及對各種類型的資料(例如,純量浮點數、緊縮整數、緊縮浮點數、向量整數、向量浮點數)進行處理。儘管一些實施例可包括專用於特定功能或功能集的多個執行單元,但其他實施例可包括僅一個執行單元或全部執行所有功能的多個執行單元。純量電路1321執行純量運算,向量/SIMD電路1323執行向量/SIMD運算,並且矩陣運算電路1327執行本文詳述的矩陣(磚片)運算。
透過示例的方式,示例性暫存器重命名、亂序發出/執行核心架構可以如下實現管線:1)指令提取電路執行提取及長度解碼階段;2)分支及解碼電路1303執行執行解碼階段;3)分配/重命名1307電路執行分配階段和重命名階段;4)排程器電路1309執行排程階段;5)物理暫存器檔案(耦合到、或被包括在排程器電路1309及分配/重命名1307電路),以及記憶體單元執行暫存器讀取/記憶體讀取階段;執行電路1311執行執行階段;6)記憶體單元和物理暫存器檔案單元執行寫回/記憶體寫入階段;7)各種單元可涉及異常處理階段;以及8)引退單元和物理暫存器檔案單元執行提交階段。
核心可支持一或多個指令集(例如,x86指令集(帶有在較新版本中添加的一些擴展);美國加州Sunnyvale的MIPS技術公司的MIPS指令集;美國加州Sunnyvale的ARM控股公司的ARM指令集(具有諸如NEON的可選附加擴充)),其包括本文所述的指令。在一個實施例中,核心1390包括用以支援緊縮資料指令集擴充(例如,AVX1、AVX2)的邏輯,藉此允許使用緊縮資料執行由許多多媒體應用所使用的運算。
應理解的是,核心可支持多線程(執行兩個或多個平行的運算或線程集),並且可透過多種方式來做到這一點,包括時間切片的多線程、同時多線程(其中單一物理核心為每個線程提供邏輯核心,物理核心是同時多線程的)、或其之組合(例如,時間切片的提取和解碼以及其後的同時多線程,諸如Intel®超線程技術中)。
圖14示出支持使用磚片之矩陣運算的處理器核心管線的實施例。分支預測及解碼電路1403從儲存在指令儲存1401中的指令執行指令的分支預測、指令的解碼、及/或兩者。例如,本文詳述的指令可被儲存在指令儲存中。在一些實施方式中,將獨立電路用於分支預測,並且在一些實施例中,使用微碼1405將至少一些指令解碼為一或多個微運算、微碼入口點、微指令、其他指令、或其他控制信號。可使用各種不同機制來實現分支預測及解碼電路1403。合適機制的範例可包括,但不限於,查找表、硬體實現、可編程邏輯陣列(PLA)、微碼唯讀記憶體(ROM)等等。
分支預測及解碼電路1403耦合到分配/重命名1407電路,其在一些實施例中耦合到排程器電路1409。在一些實施例中,這些電路透過執行下面一或多項操作來提供暫存器重命名、暫存器分配、及/或排程功能:1)將邏輯運算元值重命名為物理運算元值(例如,在一些實施例中為暫存器別名表),2)將狀態位元及旗標分配給已解碼指令,以及3)將出自指令池的已解碼指令進行排程以在執行電路上執行(例如,在一些實施例中使用保留站)。
排程器電路1409代表任何數量的不同排程器,包括保留站、中心指令窗口等。排程器單元排程器電路1409耦合到,或包括,物理暫存器檔案1415。每個物理暫存器檔案1415代表一或多個物理暫存器檔案,不同的物理暫存器檔案儲存一或多種不同資料類型,諸如純量整數、純量浮點數、緊縮整數、緊縮浮點數、向量整數、向量浮點數、狀態(例如,指令指標,其為要執行的下一個指令的位址)、磚片等等。在一個實施例中,物理暫存器檔案1415包括向量暫存器電路、寫入遮罩暫存器電路、及純量暫存器電路。這些暫存器電路可提供架構向量暫存器、向量遮罩暫存器、及通用暫存器。物理暫存器檔案1415被引退電路1417重疊,以示出可實現暫存器重命名及亂序執行的各種方式(例如,使用重新排序緩衝器及引退暫存器檔案;使用未來檔案、歷史緩衝器、及引退暫存器檔案;使用暫存器映射及暫存器池;等等)。引退電路1417及物理暫存器檔案1415被耦合到執行電路1411。
儘管在亂序執行的上下文中描述了暫存器重命名,但應理解的是,暫存器重命名可以在有序架構中使用。雖然示出的處理器的實施例還可包括單獨的指令和資料快取單元以及共享的L2快取單元,但替代的實施例可具有用於指令和資料二者的單一內部快取,諸如,舉例來說,第1階(L1)內部快取或多階的內部快取。在一些實施例中,系統可包括內部快取與核心及/或處理器外部的外部快取的組合。替代地,所有快取可以在核心及/或處理器的外部。
執行電路1411是一或多個執行電路1427的集合以及用以存取快取1413的一或多個記憶體存取電路1425的集合。執行電路1427執行本文詳述的矩陣(磚片)運算。
透過示例的方式,示例性暫存器重命名、亂序發出/執行核心架構可以如下實現管線:1)指令提取電路執行提取及長度解碼階段;2)分支及解碼電路1403執行執行解碼階段;3)分配/重命名1407電路執行分配階段和重命名階段;4)排程器電路1409執行排程階段;5)物理暫存器檔案(耦合到、或被包括在排程器電路1409及分配/重命名1407電路),以及記憶體單元執行暫存器讀取/記憶體讀取階段;執行電路1411執行執行階段;6)記憶體單元和物理暫存器檔案單元執行寫回/記憶體寫入階段;7)各種單元可涉及異常處理階段;以及8)引退單元和物理暫存器檔案單元執行提交階段。
核心可支持一或多個指令集(例如,x86指令集(帶有在較新版本中添加的一些擴展);美國加州Sunnyvale的MIPS技術公司的MIPS指令集;美國加州Sunnyvale的ARM控股公司的ARM指令集(具有諸如NEON的可選附加擴充)),其包括本文所述的指令。在一個實施例中,核心1490包括用以支援緊縮資料指令集擴充(例如,AVX1、AVX2)的邏輯,藉此允許使用緊縮資料執行由許多多媒體應用所使用的運算。
應理解的是,核心可支持多線程(執行兩個或多個平行的運算或線程集),並且可透過多種方式來做到這一點,包括時間切片的多線程、同時多線程(其中單一物理核心為每個線程提供邏輯核心,物理核心是同時多線程的)、或其之組合(例如,時間切片的提取和解碼以及其後的同時多線程,諸如Intel®超線程技術中)。 布局
在整份說明書中,使用以列為主(row major)的資料布局來表示資料。以行為主(column major)的使用者應根據其方向來翻譯此術語。圖15示出以列為主之格式以及以行為主之格式表示的矩陣的範例。如所示,矩陣A是2x3矩陣。當以列為主的格式儲存此矩陣時,列的資料元件是連續的。當以行為主的格式儲存此矩陣時,行的資料元件是連續的。 A T* B T =( BA) T 是矩陣的一個公知的屬性,其中上標T表示轉換。讀取以行為主的資料作為以列為主的資料導致矩陣看起來像轉換矩陣。
在一些實施例中,硬體中利用以列為主的語意,以行為主的資料將交換運算元順序,結果為矩陣轉換,但對於後續來自記憶體的以行為主的資料,其則是正確、未轉換的矩陣。
例如,若有兩個以行為主的矩陣要相乘:
輸入矩陣將以如下方式儲存到線性記憶體(以行為主)中:
讀取那些矩陣作為具有2x3及3x2尺寸的以列為主的矩陣,它們將顯示為:
交換順序及矩陣相乘:
輸出轉換矩陣,然後可以以列為主的順序儲存:
以及用於後續的以行為主的計算,其為正確的未轉換的矩陣: 示例性用法
圖16示出使用矩陣(磚片)的範例。在此範例中,矩陣C 1601包括兩個磚片,矩陣A 1603包括一個磚片,以及矩陣B 1605包括兩個磚片。此圖示出用於計算矩陣乘法之演算法的內部迴圈的範例。在此範例中,來自矩陣C 1601的兩個結果磚片tmm0及tmm1被用來累加中間結果。來自矩陣A 1603的一個磚片(tmm2)與來自矩陣B 1605的兩個磚片相乘,因此其被重複使用了兩次。從箭頭指示的方向加載新的A矩陣(磚片)及兩個新的B矩陣(磚片)的指標。外部迴圈(未示出)調整用於C磚片的指標。
所示的示例性程式碼包括磚片配置指令的用法,並被執行以配置磚片用法、加載磚片、處理磚片的迴圈、儲存磚片至記憶體、及釋出磚片使用。
圖17示出使用矩陣(磚片)的實施例。在1701,配置磚片用法。例如,執行TILECONFIG指令以配置磚片用法,包括設置每磚片的列數及行數。通常,在1703,從記憶體加載至少一個矩陣(磚片)。使用矩陣(磚片)在1705執行至少一個矩陣(磚片)運算。在1707,至少一個矩陣(磚片)被儲存到記憶體,以及在1709可發生上下文切換。 示例性配置 磚片配置硬體支持
如上所述,磚片用法通常需要在使用之前被配置。例如,可能不需要完全使用所有的列及行。在一些實施例中,不僅不配置這些列及行可以節省功耗,而且該配置可被用來確定運算是否會產生錯誤。例如,(N x M) * (L x N)形式的矩陣乘法通常在M和L不相同的時候無法運作。
在一些實施例中,在使用使用磚片的矩陣之前,將會配置磚片支援。例如,將配置每磚片有多少列及行、要使用的磚片等等。TILECONFIG指令是對電腦本身的改進,因為其提供了支援以配置電腦使用矩陣加速器(或是作為處理器核心的一部分、或作為外部裝置)。特別是,TILECONFIG指令的執行使得配置被從記憶體擷取,並被應用於矩陣加速器內的矩陣(磚片)設置。 磚片使用配置
圖18示出依據實施例的支持磚片使用的配置。記憶體1801包含要支持的矩陣(磚片)的磚片描述1803。
處理器/核心1805的指令執行資源1811將磚片描述1803的態樣儲存到磚片配置1817中。磚片配置1817包括調色板表1813,以詳細說明調色板的哪些磚片被配置(每磚片中的列數及行數)以及正在使用矩陣支援的標記。特別是,指令執行資源1811被配置成使用如由磚片配置1817所指定的磚片。指令執行資源1811還可包括機器專用暫存器或配置暫存器,以指示磚片用法。還設置了其他值,例如使用中的值及起始值。磚片配置1817利用暫存器1819來儲存磚片用法及配置資訊。
圖19示出對要支持的矩陣(磚片)之描述的實施例。這是在執行STTILECFG指令時要儲存的描述。在此範例中,每個欄位是一位元組。在位元組[0]中,調色板ID 1901被儲存。調色板ID被用來為調色板表1813編索引,該調色板表1813針對每個調色板ID儲存磚片中的位元組數,以及磚片每列中與此ID相關聯的位元組,如配置所定義的。
位元組1儲存了要被儲存在“startRow”暫存器1903中的值,以及位元組2儲存了要被儲存在暫存器startP 1905中的值。為了支援在這些事件之後重啟指令,指令將資訊儲存在這些暫存器中。為了支援在如上所詳述的那些中斷事件之後重啟指令,指令將資訊儲存在這些暫存器中。startRow值指示應被用於重啟的列。startP值指示當使用成對時,在列中用於儲存運算的位置,以及在一些實施例中,指示列的下半部分(在一對的較低磚片中)或列的上半部分(在一對的較高磚片中)。通常,不需要列(行)中的位置。
除了TILECONFIG及STTILECFG以外,成功執行矩陣(磚片)指令會將startRow及startP都設置為零。
每當中斷的矩陣(磚片)指令不被重啟時,軟體有責任將startRow及startP值清零。例如,無遮罩的浮點異常處置器可能會決定在軟體中終結運算,並將程式計數器值更改為另一指令,通常是下一個指令。在這種情況下,在繼續該程式之前,軟體異常處置器必須將操作系統提供給它的異常中的startRow及startP值清零。操作系統隨後將使用恢復指令重新加載那些值。
位元組3儲存磚片1907之成對(每磚片1b)的指示。
位元組16-17儲存用於磚片0的列數1913及行數1915,位元組18-19儲存用於磚片1的列數及行數,等等。換言之,每個2位元組群組指定用於磚片的列數及行數。若2位元組的群組未被用於指定磚片參數,則它們的值應為零。為超出實現限制或調色板限制的磚片指定磚片參數會導致錯誤。未配置的磚片被設置為具有0列、0行的初始狀態。
最後,記憶體中的配置通常以結束描繪(ending delineation)結束,例如幾個連續位元組的全零。 示例性磚片及磚片配置儲存
圖20(A)-(D)示出一或多個暫存器1819的範例。圖20(A)示出複數個暫存器1819。如所示,每個磚片(TMM0 2001 ... TMMN 2003)都具有單獨暫存器,每個暫存器儲存用於該特定磚片的列及行的大小。將StartP 2011及StartRow 2013儲存在單獨的暫存器中。一或多個狀態暫存器2015被設置(例如,TILES_CONFIGURED=1)以指示磚片被配置為可使用。
圖20(B)示出複數個暫存器1819。如所示,每個磚片的列及行都具有單獨暫存器。例如,TMM0列配置2021、TMM0行配置2023、StartP 2011及StartRow 2013被儲存在單獨暫存器中。一或多個狀態暫存器2015被設置(例如,TILES_CONFIGURED=1)以指示磚片已配置為可使用。
圖20(C)示出單一暫存器1819。如所示,此暫存器儲存磚片配置(每磚片的列數及行數)2031,StartP 2011及StartRow 2013被儲存在單一暫存器中作為緊縮資料暫存器。一或多個狀態暫存器2015被設置(例如,TILES_CONFIGURED=1)以指示磚片已配置為可使用。
圖20(D)示出複數個暫存器1819。如所示,單一暫存器儲存磚片配置(每磚片的列數及行數)2031。StartP及StartRow被儲存在單獨暫存器2011及2013中。一或多個狀態暫存器2015被設置(例如,TILES_CONFIGURED=1)以指示磚片已配置為可使用。
可以考慮其他組合,例如將多個起始暫存器組合進單一暫存器中,在該單一暫存器中分別顯示該多個起始暫存器等等。 為脈動陣列(Systolic Array)排程
如上所述,用於通用矩陣乘法(也稱為GEMM)的硬體是用於改善某些應用程式,諸如深度學習,之峰值計算(及能效)的好選擇。基於深度神經網路(DNN)的應用程式對計算的巨大需求可能會導致使用採用大量(例如,數百)個處理元件的硬體(例如,加速器),例如,融合乘加(FMA)電路。然而,可針對密集矩陣乘法的非常規則的資料流型樣,對(例如,DNN)加速器進行最佳化。在某些實施例中,加速器使用脈動陣列實現以最大化效能及面積/功率效率。脈動陣列可以包括針對非常規則的資料流而最佳化的密集二維陣列。
在某些硬體中,指令的解碼及執行使可配置的脈動陣列硬體(例如,矩陣運算加速器電路)計算C=A * B+C,其中A、B、及C均為二維矩陣,並且針對C的每個元件,硬體計算輸入矩陣A之一列與矩陣B之一行的點積。
在某些實施例中,矩陣運算加速器電路將矩陣𝐴(具有尺寸𝑀 × 𝐾,其中M和K為整數)、矩陣B(具有尺寸 K × N,其中M和K為整數)、及矩陣C(具有尺寸𝑀 × N,其中M和N為整數)作為輸入,然後對個別元件執行運算(例如,融合乘加),以產生結果,該結果被儲存在矩陣中(例如,返回具有尺寸𝑀 × N的矩陣C,其中M和N為整數)。在一個實施例中,M、K和N小於或等於16。在某些實施例中,矩陣運算加速器電路執行下面的運算(例如,對浮點數):
圖21示出依據本公開之實施例的使用矩陣(磚片)運算加速器2107之系統的實施例。在某些實施例中,主處理器/處理系統2101(例如,硬體處理器核心,例如,圖33B中的處理器核心3390)將命令(例如,諸如算術或矩陣處理運算的矩陣調處操作、載入、及/或儲存操作)傳遞給矩陣運算加速器2107。然而,這僅是出於討論的目的來顯示此種方式。如本文中所詳述的,加速器2107可以是處理核心的一部分。作為磚片調處運算子指令的命令將磚片稱為暫存器-暫存器(“reg-reg”)或暫存器-記憶體(“reg-mem”)格式。在某些實施例中,其他諸如TILESTORE、TILELOAD、TILECONFIG等的命令不在磚片上執行資料運算。命令可以是加速器2107要處理的已解碼的指令(例如,微運算)或巨集指令。在一個實施例中,硬體處理器核心回應於該硬體處理器核心正在執行的矩陣運算指令,將微運算發送到矩陣(磚片)運算加速器2107。
在一個實施例中,保留站(RS)電路2111將命令(例如,微運算)發送給矩陣運算加速器2107。在某些實施例中,矩陣運算加速器2107是磚片矩陣單元(TMU)。在某些實施例中,矩陣運算加速器2107包括矩陣加速器控制器電路2113。在一個實施例中,矩陣加速器控制器(例如,電路2113)係用以控制矩陣運算加速器2107之輸入、輸出、及/或內部的運算及資料流。矩陣運算加速器2107(例如,矩陣加速器控制器電路2113)可包括調度電路2115,例如,用以控制從主處理器/處理系統2101接收到的請求(例如,命令)至矩陣運算加速器2107之一或多個元件的調度。下面參考圖23討論調度電路的範例。
描繪的矩陣運算加速器2107包括資料緩衝器(例如,暫存器)2105。在某些實施例中,資料緩衝器(例如,暫存器)2105被配置成將個別的矩陣儲存到例如第一複數個暫存器(例如,磚片)中,其代表第一二維矩陣(例如,標記為T0的磚片,儲存矩陣A於儲存2105中)、第二二維矩陣(例如,標記為T1的磚片,儲存矩陣B於儲存2105中)、第三二維矩陣(例如,標記為T3的磚片,儲存矩陣C於儲存2105中)等等。系統(例如,主處理器/處理系統2101)可包括(例如,連貫)記憶體介面2103(例如,資料快取單元),用以在主處理器/處理系統2101(例如,作為亂序(Out of Order (OoO))核心)與矩陣運算加速器2107之間發送及接收資料(例如,相對於命令)。
在某些實施例中,矩陣運算加速器2107利用處理元件2109的柵格(例如,融合乘加(FMA)電路)來執行運算。在一個實施例中,調度電路2115控制資料(例如,來自磚片的一或多個值)從資料緩衝器2105(例如,形成磚片的暫存器)至處理元件2109的柵格(例如,FMA電路的柵格)的發送。在某些實施例中,處理元件2109的柵格是處理元件的二維柵格,例如,圖22中的處理元件電路2200的二維柵格。
圖22示出矩陣運算加速器電路2200的實施例,該矩陣運算加速器電路包括處理元件電路2206-1至2206-4的二維柵格。在某些實施例中,資料儲存2205(例如,暫存器檔案)包括複數個暫存器,例如,具有個別的暫存器(例如,磚片)集合,其代表第一輸入二維矩陣(A)、第二輸入二維矩陣(B)、及第三輸入二維矩陣(C)、及結果儲存。在一個實施例中,輸出二維矩陣結式被儲存在形成第三輸入二維陣列(C)的暫存器中,例如,在矩陣運算加速器電路2200已使用了輸入二維矩陣(C)的值之後,覆蓋該些值。所示的矩陣運算加速器電路2200包括複數個路由/緩衝器電路2402-1至2402-4,用以依據要執行的運算,將輸入值(例如,來自矩陣A及矩陣B)路由並儲存到處理元件。
應注意,本文圖式可能未示出所有的資料通訊耦合(例如,連接)。本領域之普通技術人士將理解到,這是為了不使圖式中的某些細節模糊。應注意的是,圖式中的雙向箭頭可能不需要雙向通訊,例如,其可指示單向通訊(例如,至或自該元件或裝置)。在本文某些實施例中,可以利用通訊路徑之任何或所有組合。單一線路中可能包括多條路徑,例如,多個通道。例如,線路2210可包括多條路徑(例如,“X”,其中X是任意正整數),例如,一條路徑用於來自矩陣A的值,以及一條路徑用於來自矩陣B的值。
在某些實施例中,根據請求執行運算(例如,透過解碼及執行指令來引起該運算),矩陣運算加速器電路2200會將來自矩陣A及矩陣B的值發送給個別的路由電路。例如,該運算可以是將矩陣A乘以矩陣B,然後將個別的結果加到來自矩陣C的相應的值。在一個實施例中,第一路由電路2204-1係用以從矩陣A[列][行]接收第一值A[0][0](來自列索引0及行索引0的值),並將該值廣播給該列中的每個處理元件2206-1至每個處理元件2206-1的第一輸入,及來自矩陣B之第一列的一組值,並將那些值發送給每個處理元件2206-1之個別的第二輸入(例如,致使處理元件2212接收來自B[0][0]的值,處理元件2214接收來自B[0][1]的值,等等)。在一個實施例中,處理元件2212在其之輸出2216上提供A[0][0]* B[0][0]的相乘結果,以及處理元件2214在其輸出2218上提供A[0][0]* B[0][1]的相乘結果。將輸出(例如,輸出2216及2218)發送到路由/緩衝器電路2 2204-2。
在一個實施例中,第二路由/緩衝器電路2204-2係用以從矩陣A[列][行]接收第二值A[0][1](來自列索引0及行索引1的值),並將該值廣播給該列中的每個處理元件2206-2至每個處理元件2206-2的第一輸入、來自矩陣B之第二列的一組值,並將那些值發送給每個處理元件2206-1之個別的第二輸入(例如,致使處理元件2222從B[1][0]接收值,處理元件2224從B[1][1]接收值,等等),以及來自上一列處理元件2206-1之輸出的個別輸出。在一個實施例中,處理元件2222在其輸出2226上提供將A[0][1]* B[1][0]的相乘結果加到輸出2216(A[0][0]* B[0][0])的結果,以及處理元件2224在其輸出2228上提供將A[0][1]* B[1][1]的相乘結果加到輸出2218(A[0][0]* B[0][1])的結果。在某些實施例中,此融合乘加運算透過處理元件2206-3至2206-4的每一列繼續,以從處理元件2206-4產生輸出2230及輸出2232。應注意的是,4是處理元件的示例性列數(例如,以及矩陣A、B及C之各者的列及行),但可以是任意複數個列。當到達矩陣運算加速器電路2200之處理元件的列的末端時,偏移加法電路2208用於將來自輸入2234(例如,一組平行輸入埠)之矩陣C的個別元件(例如,矩陣C之第一列的個別元件)相加,並且透過輸出2236(例如,一組平行輸出埠)將結果儲存在矩陣C的個別元件中(例如,矩陣C之第一列的個別元件位置中)。例如,將矩陣C之第一列的第一元件加到來自輸出2230的結果,並且將該結果回存到矩陣C之第一列的該第一元件位置中,以及將矩陣C之第一列的第二元件加到來自輸出2232的結果,並且將該結果回存到矩陣C之第一列的該第二元件位置中。可以對矩陣A的每一列重複此操作,以產生矩陣A * 矩陣B的整個乘法(例如,以及將來自矩陣C的偏移加到個別元件中)。
因此,電路的某些實施例使用,例如,具有一些輸入及輸出緩衝器和本地控制邏輯電路的處理元件(PE)(例如,FMA單元)的二維(2D)陣列。在一個實施例中,每個PE從資料儲存中獲取其輸入的一部分,諸如暫存器檔案,並從其他PE獲取其他輸入,並且PE的最終列將其輸出傳回該資料儲存。因此,在這些實施例中,PE形成管道。使用者通常可能打算對大量的資料元件(例如,比PE多的資料元件)執行一連串運算。因此,可將元件輸入到陣列的頂端以啟動管線,並讓資料向下滴流,通過管道(在適當的時候在管線的各個階段提供額外的輸入)。
在一個實施例中,每個處理元件的實例都是融合乘積累加(FMA)電路,其包括乘法器電路(例如,其採用第一輸入a、第二輸入b、並產生結果輸入)及加法器電路(例如,其將來自乘法器電路的結果輸出作為第一輸入、與第三輸入c相加,以產生結果)。可透過調度電路執行將運算及/或資料調度至處理元件電路的二維柵格(例如,FMA電路)的控制。
圖23示出依據本公開之實施例的矩陣運算加速器電路的調度電路2300。在一個實施例中,調度電路2300是圖21中的調度電路2115的一部分。在某些實施例中,調度電路2300係用以使用多工器2302選擇多個待處理運算(例如,微運算(micro-op))中的一個,並且將所選的運算在輸出2304上發送到運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)。在圖23中,在輸入2306上將待處理運算接收進佇列2308。輸入2306可以來自保留站(例如,圖21中的RS電路2111)。
在一個實施例中,調度電路從程式亂序(Out-of-(program)Order)保留站電路接收運算請求(例如,用於個指令的一個運算請求,或用於單指令的一組微運算),並且例如,在假設兩個連續的運算(例如,指令)可在矩陣運算加速器電路(例如,之管線)中一個接著一個被執行而無相依限制的情況下,依序執行運算,例如,其中,亂序電路負責處理具有A及B磚片之矩陣運算的相依性,而相繼的矩陣運算之間的相依性是由調度佇列處理。在一個實施例中,RS電路在解決相依性之後,將下一個運算(例如,微運算(µop))調度到矩陣運算加速器電路。如所示的佇列2308包括八個槽,然而應理解可以使用單一或任意複數個槽。
在某些實施例中,佇列2308中的項目儲存用於識別資料緩衝器(例如,資料緩衝器2105或資料緩衝器2205)中所利用的輸入磚片及/或輸出磚片的資訊及/或要由柵格(例如,圖21中的FMA柵格2109)執行的運算。在一個實施例中,佇列2308中的每個項目儲存有效位元(v)的值(或該值的指示符)、運算(例如,µop)運算碼、磚片尺寸(例如,M、K、N)、控制(例如,零點控制)、磚片ID值(例如,資料緩衝器中A磚片、B磚片、及C磚片位置之各者的值)。主標頭可以是指向被調度給矩陣運算加速器電路之當前運算的起始(例如,單指令之複數個微運算中的第一微運算)的指標。主尾端可以是指向被調度給矩陣運算加速器電路之當前運算的結束(例如,該單指令之複數個微運算的最後微運算)的指標。有效位元(v)可被用來將運算(例如,微運算)標記為完成,例如,當該運算的請求運算由矩陣運算加速器電路完成的時候。
在某些實施例中,包括排程電路2310,用以選擇運算(例如,複數個微運算的標頭)以發送給運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路),例如,用以開始該所選運算的運算。
圖24示出依據本公開之實施例的矩陣運算加速器電路之調度電路的排程電路2400。如上所述,運算(例如,微運算)可以是 。排程電路最多可以等待:M(例如,第一陣列(例如,第一列(例如,圖22中的PE 2212、2214、...2206-1的第一列)或第一行)的緩衝器(例如,圖21中的緩衝器2105或圖22中的緩衝器2205)被佔用(例如,以及匯流排被用來將A磚片轉移到矩陣運算加速器電路)的週期數)、K(例如,將B磚片加載到矩陣運算加速器電路的資源(例如,匯流排)被佔用的週期數)、以及調度之間的預先選擇的最小(例如,4個週期)間隔。在圖24中,輸出2402被斷言(asserted)(例如,值為1而不是0),以導致將(例如,微運算)調度到矩陣運算加速器電路。在某些實施例中,排程電路2400包括K計數器2404,用以在向下計數將B磚片加載到矩陣運算加速器電路的資源(例如,匯流排)被佔用的週期數時,斷言K的值為1,然後當完成時為0(例如,計數器K的預定值)、M計數器2406,用以在向下計數將A磚片加載到矩陣運算加速器電路的資源(例如,匯流排)被佔用的週期數時,斷言M的值為1,然後當完成時為0(例如,計數器M的預定值)、以及最小週期(例如,作為範例是四個週期,但可選擇任意單一或複數個週期)計數器2408,用以向下計數在輸出2402上的運算(例如,微運算)調度(例如,在輸出2402上斷言為1的調度)之間的最小週期,以在向下計數最小週期數時斷言值為1,然後當完成時為0。在一個實施例中,OR邏輯閘2412在其任何輸入為1時斷言1,以及NOT邏輯閘2414將OR邏輯閘2412的輸出反相。作為一個範例,一旦每個計數器向下計數到其觸發閾值(例如,0)時,將會導致在其至OR邏輯閘2412的個別線路上斷言0(例如,直到2402的調度發生),因此當所有的計數器2404、2406及2408都斷言0時,NOT邏輯閘2414將輸出1。在每次調度後,可將計數器重置為其原始(例如,非零)值。
可選的,可利用置換(override)調度控制2410,例如,用以在不置換運算調度的模式中斷言0,以及在置換運算調度的模式中斷言1(並因此導致從輸出2402輸出0)。
在一個實施例中,用於選擇要由矩陣運算加速器電路(例如,運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路))執行的下一個運算(例如,微運算)的觸發是由MAX{4,M,K}給定的,其中M是A矩陣列數以及K是A矩陣行(或B矩陣列)數,以及4是(例如,微運算)執行之週期數的下限。應注意的是,在某些實施例中,排程電路等待至少K個週期(例如,當只有單一匯流排用於要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)的B磚片時),(例如,每週期僅能提取單一B列)。在某些這類的實施例中,K設置累加數,其為B矩陣列數,因此B匯流排將在接下來的K個週期中被佔用,並且在這段時間內無法調度新的微運算。在某些這類的實施例中,M設置A矩陣列使用A匯流排的週期數,例如,使得只有在M計數器以及K計數器二者都被清零之後,才能調度下一個微運算。此外,在連續的調度之間可能需要最少(例如,4)個週期數,例如,其中C矩陣應在週期1中被讀取、在週期2中與乘法結果(例如,A x B)累加、並且在週期3中被再次寫回資料緩衝器,然後在其可被再次讀取前還需再一個週期於週期4中。這假定以上步驟是在一個週期內。在其他實施例中,每個步驟可能需要一個以上的週期。
在某些實施例中,排程電路2400係用以當運算(例如,微運算)被選擇及/或調度至運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)用於執行及/或更新其在相應佇列(例如,圖23中的佇列2308)中的標頭指標(例如,使下一個運算可用於選擇決定)時,清除相應佇列(例如,佇列2308)中的有效位元。
圖25示出依據本公開之實施例的矩陣運算加速器電路之調度電路的排程電路2500,其可從基線排程模式切換到重複使用輸入矩陣的排程模式。在這些實施例中輸入矩陣是指輸入“B”矩陣(例如,磚片),但這僅是示例性的,其他矩陣(例如,磚片)也可進行類似地排程。
排程電路2500包括輸入2502,用以接收一值,該值識別要在矩陣運算加速器電路上執行的下一個運算(例如,微運算),特別是,被選擇及/或調度給運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)執行的下一個運算。在一個實施例中,輸入2502接收來自圖23的輸出2304。
在某些實施例中,輸入2502識別要由排程電路2500調度的下一個運算(例如,和相應的輸入/輸出磚片)。在某些這類的實施例中,輸入2502包括識別(ID)值,其代表磚片(例如,在圖21中的資料緩衝器(例如,暫存器)2105中形成磚片的一組暫存器)。排程電路2500包括儲存2504,其識別矩陣運算加速器電路正在處理的當前磚片,特別是,該儲存可識別已將磚片資料加載至(或正在將磚片資料加載至/從)運算電路中(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)的當前磚片。在一個實施例中,排程電路2500包括有效磚片(例如,磚片B)儲存2506,以指示儲存2504中的識別值是有效值還是無效值(例如,硬體正在加載另一個磚片,因此另一為另一識別值)。
排程電路2500包括比較電路2508,用以將(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的當前磚片(例如,磚片B)與(ii)要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的下一個磚片(例如,下一個磚片B),進行比較。在一個實施例中,此比較是透過比較排程電路為每個磚片提供的識別值來完成的,例如,在磚片進入矩陣運算加速器之資料緩衝器(例如,圖21中的資料緩衝器2105)的入口上提供的識別值,例如,其中,在磚片的值被輸入到運算電路(例如,圖21中的FMA柵格或圖22中的緩衝器電路)之前,將識別值提供給每個磚片。
在某些實施例中,比較電路2508係用以,將(i)來自輸入2502之用於下一個運算的輸入磚片(例如,在圖21中的資料緩衝器2105中的其之ID值)(例如,“新磚片B”)與(ii)當前被加載到運算電路中(例如,當前被加載到圖21中的FMA柵格2109或圖22中的緩衝器電路中)的當前磚片(例如,磚片B),例如,當前被加載到圖21中的FMA柵格2109中的磚片的圖21中的資料緩衝器2105的ID值,進行比較。在一個實施例中,比較電路2508係用以,將正在使用的當前磚片的ID值與要在運算電路中使用的下一個磚片的ID值進行比較,如果相等,則斷言它們相等的值(例如,1)。在一個實施例中,比較電路2508係用以,將來自儲存2504的正在使用的當前磚片的ID值與要在運算電路中使用的下一個磚片的ID值進行比較,如果相等,則斷言它們相等的值(例如,1),此時儲存2506亦指示儲存2504中的識別值為有效值,例如反之,則斷言不同的值(例如,0)。
在某些實施例中,當(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的當前磚片(例如,磚片B)等於(ii)要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的下一個磚片(例如,下一個磚片B)時,斷言相同的磚片(例如,相同的磚片B)值(例如,1),以導致(例如,透過輸出2510)切換到重複使用輸入矩陣的排程模式,例如重複使用已儲存在運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)內的磚片B,例如,無需從與運算電路分離的資料緩衝器(例如,圖21中的資料緩衝器2105)重新加載它。
在某些實施例中,比較電路2508係用以,當(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的當前磚片(例如,磚片B)等於(ii)要被加載到運算電路的下一個磚片(例如,下一個磚片B)時,在輸出2510上輸出第一值(例如,1)。然後可將輸出2510輸入到NOT邏輯閘2512,並且該輸出與從K計數器2516輸出到AND邏輯閘2514的輸出(例如,僅當所有的輸入均為1時才具有輸出1)及輸入到OR邏輯閘2522。
在某些實施例中,排程電路2500包括K計數器2516,用以在向下計數將B磚片加載到矩陣運算加速器電路的資源(例如,匯流排)被佔用的週期數時,斷言K的值為1,然後當完成時為0(例如,計數器K的預定值)、M計數器2518,用以在向下計數將A磚片加載到矩陣運算加速器電路的資源(例如,匯流排)被佔用的週期數時,斷言M的值為1,然後當完成時為0(例如,計數器M的預定值)、以及最小週期(例如,作為範例是四個週期,但可選擇任意單一或複數個週期)計數器2520,用以向下計數在輸出2526上的運算(例如,微運算)調度(例如,在輸出2526上斷言為1的調度)之間的最小週期,以在向下計數最小週期數時斷言值為1,然後當完成時為0。在一個實施例中,OR邏輯閘2522在其任何輸入為1時斷言1,以及NOT邏輯閘2524將OR邏輯閘2522的輸出反相。作為一個範例,一旦每個計數器向下計數到其觸發閾值(例如,0)並(因此當K計數器2516斷言0時,AND邏輯閘2514輸出0)時,將會導致在其至OR邏輯閘2522的個別線路上斷言0(例如,直到2526發生調度),因此(i)當所有的計數器2516、2518及2520都斷言0時,或(ii)若輸出2510為1,用於與斷言0的計數器2518及2520匹配,則NOT邏輯閘2524將輸出1。在每次調度後,可將計數器重置為其原始(例如,非零)值(例如,如由A及B磚片的尺寸所設置的)。在一個實施例中,當K計數器2516、M計數器2518及最小週期計數器2520在它們至OR邏輯閘2528的個別線路上斷言0時,其輸出0到NOT邏輯閘2530,其接著輸出1(而不是0)作為重置值,以使有效磚片(例如,磚片B)儲存2506指示儲存2504中的識別值是無效值(例如,硬體正在將另一磚片加載到運算電路)。
可選的,可利用置換調度控制2532,例如,用以在不置換運算調度的模式中斷言0,以及在置換運算調度的模式中斷言1(並因此導致從輸出2526輸出0)。
如上所述,排程電路可在(i)重複使用輸入矩陣,例如,重複使用已儲存在運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)內的磚片,例如,無需從與運算電路分離的資料緩衝器(例如,圖21中的資料緩衝器2105)重新加載其的第一(例如,輸送量高效)排程模式與(ii)不重複使用已儲存在運算電路內的磚片的第二排程模式之間選擇。
在一個實施例中,用於選擇要由矩陣運算加速器電路(例如,運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路))執行的下一個運算(例如,微運算)的觸發,在(i)第一(例如,輸送量高效)排程模式中是由MAX{4,M}給定的,以及在(ii)第二排程模式中是由MAX{4,M,K}給定的,其中M是A矩陣列數以及K是A矩陣行數,以及4是(例如,微運算)執行之週期數的下限。應注意的是,在某些實施例中,排程電路等待至少K個週期(例如,當只有單一匯流排用於要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)的B磚片時),(例如,每週期僅能提取單一B列)。在某些這類的實施例中,K設置累加數,其為B矩陣列數,因此B匯流排將在接下來的K個週期中被佔用,並且在這段時間內無法調度新的微運算。在某些這類的實施例中,M設置A矩陣列使用A匯流排的週期數,例如,使得只有在M計數器以及K計數器二者都被清零之後,才能調度下一個微運算。此外,在連續的調度之間可能需要最少(例如,4)個週期數,例如,其中C矩陣應在週期1中被讀取、在週期2中與乘法結果(例如,A x B)累加、並且在週期3中被再次寫回資料緩衝器,然後在其可被再次讀取前還需再一個週期於週期4中。這假定以上步驟是在一個週期內。在其他實施例中,每個步驟可能需要一個以上的週期。在某些實施例中,磚片B是 中的B矩陣。例如,排程依據:若( ,則等待(M或最小週期)的最大值,否則等待(M、K或最小週期)的最大值。
在某些實施例中,在對 執行矩陣運算時,B矩陣的傳送為K(例如,多達16)個週期(例如,B傳送週期),並且在B傳送週期期間,使用相同B矩陣的下一個運算(例如, 可以開始執行,此時其A緩衝器是空閒的。例如,當 的B傳送週期結束時,運算回到正常,並且B矩陣將被讀取並從資料緩衝器(例如,圖21中的資料緩衝器2105)(例如,磚片矩陣緩衝器(TMB))傳送到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)(例如,磚片矩陣乘法器(TMM))。在一個實施例中,在用法連續的情況下,電路(例如,排程電路)(例如,帶有來自OoO RS電路的運算)將防止回收和重新分配緩衝器(例如,B緩衝器),例如,以及不需要快取。因此,透過不僅具有更早調度運算的能力,還因消除了從資料緩衝器(例如,圖21中的資料緩衝器2105)中讀取資料(例如,透過B匯流排)而降低了功耗,從而改善了利用第一(例如,輸送量高效)排程模式的電腦。
在某些實施例中,當將來自資料緩衝器(例如,圖21中的資料緩衝器2105)的資料儲存到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中時,資料緩衝器可被回收,例如,從使用中解除分配,然後重新分配以儲存用於不同運算(例如,不同的指令)的矩陣(例如,新磚片B)。在某些實施例中,當處於重複使用輸入矩陣的第一(例如,輸送量高效)排程模式中時,例如,重複使用已儲存在運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)內的磚片時,防止回收緩衝器。
在一個實施例中,當處於重複使用輸入矩陣的第一(例如,輸送量高效)排程模式中時,排程電路在執行前一個運算(例如,單指令)與下一個運算(例如,單指令)之間防止回收緩衝器(例如,運算電路中矩陣B的緩衝器),及/或當處於不重複使用輸入矩陣的第二排程模式中時,排程電路在執行前一個運算(例如,單指令)與下一個運算(例如,單指令)之間允許回收緩衝器(例如,運算電路中矩陣B的緩衝器)。在一個實施例中,當處於不重複使用輸入矩陣的第二排程模式中時,排程電路在執行前一個運算(例如,指令)與下一個運算(例如,指令)之間開始回收緩衝器(例如,運算電路中矩陣B的緩衝器)。矩陣運算加速器電路(例如,控制器電路)可以為代表輸入二維矩陣的複數個暫存器之各者分配識別值,並且融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣的檢查,可比較來自前一個運算(例如,指令)和下一個運算(例如,指令)之相應的輸入二維矩陣的個別的識別值。矩陣運算加速器電路(例如,控制器電路)可以為具有相同值的矩陣分配相同的ID值。矩陣運算加速器電路(例如,控制器電路)可以為具有不同值的矩陣分配不同的ID值。例如,第一運算(例如,指令)可以具有分配給輸入二維矩陣的第一值,第二運算(例如,指令)可在其為與第一運算中的輸入二維矩陣相同的輸入二維矩陣時,被分配有相同的值,而在其為與第一運算中的輸入二維矩陣不同的輸入二維矩陣時,被分配有不同的值。
在某些實施例中,排程電路2500係用以當運算(例如,微運算)被選擇及/或調度至運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)用於執行及/或更新其在相應佇列(例如,圖23中的佇列2308)中的標頭指標(例如,使下一個運算可用於選擇決定)時,清除相應佇列(例如,佇列2308)中的有效位元。在一個實施例中,僅當將B值加載到B緩衝器的運算仍在運行時,才允許重複使用B緩衝器資料,當“可能重複使用”時,第二運算到達,然後檢查該第二運算與第一運算的連續性,以使第二運算僅在發現到與第一運算的連續性時才使用回收的值,例如,若使用待重複使用的B值的第一運算未完成,則其B緩衝器無法被回收,因此可被第二運算使用(例如,只要有連續性)。
在某些實施例中,重複使用輸入矩陣的第一(例如,輸送量高效)排程模式被用來加速(例如,浮點)FP矩陣運算加速器電路的性能。應理解的是,本文所公開的排程不限於矩陣運算加速器電路設計,而是可以擴展到具有繼承限制其他各種延遲微架構。此外,其可被擴展到FMA電路假設1個週期延遲的情況。
在某些實施例中,矩陣的尺寸可能大於可用硬體(例如,運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路))的尺寸。本文中的某些實施例利用複數個(例如,三個)計數器來進行排程(例如,調度運算(例如,微運算)),即K even、K odd及M c處理單元限制以及用於檢查重複使用B K×N矩陣的機制。此外,本文中的某些實施例例如在尺寸(例如,K)大於可用硬體(例如,K>8)的情況下,實現用於處理運算(例如,微運算)的次要佇列,其中這些運算(例如,微運算)在運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)中以高優先權進行第二輪調度。
在一個實施例中,排程電路在M個週期期間保持第一列B 0∈ B K× N,並且在不同週期內廣播矩陣A M× K之第一行的M個元件之各者。在某些實施例中,在一個週期或數個週期(例如,2個週期)之後,在計算第二部分FMA運算的M個週期期間,佔用FMA柵格的下一個FMA陣列(例如,列或行)。在某些實施例中,執行此循序管線模式,直到通過K個FMA陣列算出K個部分FMA運算為止。在一個實施例中,FMA柵格利用受限於三個主要的限制,即(1)目的地中的列數、(2)B匯流排頻寬(例如,每週期512個位元)、及(3)FMA陣列(例如,列或行)的數目。作為(1)的一個範例,在M<給定值(例如,16)的情況下,由於第一FMA0陣列在M個週期之後是可用且空閒的,因此能夠在M個週期之後發送下一個運算(例如,微運算)以執行。例如,在M=12的情況下,在前12個週期期間使用第一FMA0。然而,目的地WB的第一結果由16個週期計算。這意味著,在此範例中,下一個運算(例如,微運算)可以在第一運算(例如,微運算)已完成之前被調度。作為(2)的一個範例,FMA柵格受限於在一個週期內接收單一B K×N矩陣列。在一個實施例中,FMA電路的加法器具有給定數量的(例如,兩個)週期延遲,這意味著,需要每兩個週期發送一次B匯流排的閾值(例如,512位元)。因此,某些實施例同時執行兩個運算(例如,微運算),並使B匯流排在每個週期保持忙碌。此外,某些實施例將B K×N矩陣列保持在緩衝器中,用於通過連續的指令重複使用。作為(3)的一個範例,FMA柵格架構支援多達給定數量(例如,16)的部分乘積加法(例如,K≤ 16),而FMA柵格包含少於給定數量(例如,8)的FMA陣列(例如,列或行)。在K≤ 8的情況中,結果會在16個週期之後就緒,而在K> 8的情況中,則需要替代的解決方案。
圖26示出依據本公開之實施例的用於多次通過的矩陣運算加速器電路的調度電路2600。調度電路2600包括兩個佇列,即主要佇列2610及第二通過佇列2612。在一個實施例中,主要佇列2610維護用於在運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)中執行運算的重要資訊。
在一個實施例中,第二通過佇列2612保留在運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)中有資格第二次通過的運算(例如,微運算),(例如,其K> 8),處理上述(3)的情況。在一個實施例中,被插入到第二通過佇列2612中的每個運算(例如,微運算)在被再次調度用於第二次通過之前,都將暫停16個週期。在運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)被限制為較少數量的(例如,8個)FMA電路的實施例中,需要第二次通過。第二次通過可以在至少16個週期之後被重新啟動(例如,16個週期=8FMA單元*2個週期的ADD延遲)。應注意的是,由於以下原因,此拆分是可能的,其亦描述了在第一及第二路徑中計算的項:
在一個實施例中,從主要佇列2610調度運算(例如,微運算)時(例如,作為調度電路2300的實例),會觀察到其累積量(例如,檢查是否K>8)。在某些實施例中,若(K <=閾值(例如,8)),則將運算(例如,微運算)直接發送給運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路),例如,而不將其複製到第二通過佇列2612及/或若(K > 閾值(例如,8)),則運算(例如,微運算)會繼續將其發送到運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路),例如,同時將其複製到第二通過佇列2612。在一個實施例中,在第二通過佇列2612中,K被更新為要執行的累加的餘數(例如,K-8)。在一個實施例中,每個被插入到第二通過佇列2612的運算(例如,微運算)觸發(例如,16)週期計數器。在一個實施例中,一旦計數器完成其計數(例如,16個週期),其相應的運算(例如,微運算)有資格被發送到運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)用於第二執行部分。在一個實施例中,由於第二通過佇列2612中的運算(例如,微運算)較老,因此在它們就緒的情況下將優先權配置給它們。以下可用於佇列選擇:Select_queue=(Valid second-pass-uop) AND(16-cycles)?second-PASS-QUEUE: MAIN-QUEUE。在一個實施例中,調度電路2600的排程電路2602利用多工器2604從第二通過佇列2612選擇一項目。例如,使用多工器2606從主要佇列2610或第二佇列2612中選擇,以提供要透過輸出2608發送給FMA柵格的運算。
圖27示出依據本公開之實施例的用於多次通過的矩陣運算加速器電路的調度電路的排程電路2700。在這些實施例中的輸入矩陣是指輸入“B”矩陣(例如,磚片),但這僅是示例性的,其他矩陣(例如,磚片)也可進行類似地排程。
排程電路2700包括輸入2702,用以接收一值,該值識別要在矩陣運算加速器電路上執行的下一個運算(例如,微運算),特別是,被選擇及/或調度給運算電路(例如,圖21中的FMA柵格2109或圖22中的PE電路)執行的下一個運算。在一個實施例中,輸入2702接收來自圖23的輸出2304。
在某些實施例中,輸入2702識別要由排程電路2700調度的下一個運算(例如,和相應的輸入/輸出磚片)。在某些這類的實施例中,輸入2702包括識別(ID)值,其代表磚片(例如,在圖21中的資料緩衝器(例如,暫存器)2105中形成磚片的一組暫存器)。排程電路2700包括儲存2704,其識別矩陣運算加速器電路正在處理的當前磚片,特別是,其可識別已將磚片資料加載至(或正在將磚片資料加載至/從)運算電路中(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)的當前磚片。在一個實施例中,排程電路2700包括有效磚片(例如,磚片B)儲存2706,以指示儲存2704中的識別值是有效值還是無效值(例如,硬體正在加載另一個磚片,因此為另一識別值)。
排程電路2700包括比較電路2708,用以將(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的當前磚片(例如,磚片B)與(ii)要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的下一個磚片(例如,下一個磚片B),進行比較。在一個實施例中,此比較是透過比較排程電路為每個磚片提供的識別值來完成的,例如,在磚片進入資料緩衝器(例如,圖21中的資料緩衝器2105)的入口上提供的識別值,例如,其中,在磚片的值被輸入到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)之前,將識別值提供給每個磚片。
在某些實施例中,比較電路2708係用以,將(i)來自輸入2702之用於下一個運算的輸入磚片(例如,在圖21中的資料緩衝器2105中的其之ID值)(例如,“新磚片B”)與(ii)當前被加載到運算電路中(例如,當前載入到圖21中的FMA柵格2109或圖22中的緩衝器電路中)的當前磚片(例如,磚片B),例如,當前被加載到圖21中的FMA柵格2109中的磚片的圖21中的資料緩衝器2105的ID值,進行比較。在一個實施例中,比較電路2708係用以,將正在使用的當前磚片的ID值與要在運算電路中使用的下一個磚片的ID值進行比較,如果相等,則斷言它們相等的值(例如,1)。在一個實施例中,比較電路27088係用以,將來自儲存2704的正在使用的當前磚片的ID值與要在運算電路中使用的下一個磚片的ID值進行比較,如果相等,則斷言它們相等的值(例如,1),此時儲存2706亦指示儲存2704中的識別值為有效值,例如反之,則斷言不同的值(例如,0)。
在某些實施例中,當(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的當前磚片(例如,磚片B)等於(ii)要被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的下一個磚片(例如,下一個磚片B)時,斷言相同的磚片(例如,相同的磚片B)值(例如,斷言為1),以致使(例如,透過輸出2710)切換到重複利用輸入矩陣的排程模式,例如重複利用已經儲存在運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)中的磚片B,例如,無需從與運算電路分離的資料緩衝器(例如,圖21中的資料緩衝器2105)重新加載它。
在某些實施例中,比較電路2708係用以,當(i)被加載到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)的當前磚片(例如,磚片B)等於(ii)要被加載到運算電路的下一個磚片(例如,下一個磚片B)時,在輸出2710上輸出第一值(例如,1)。然後可將輸出2710與來自NOT邏輯閘2724的輸入一起輸入到OR邏輯閘2726。來自OR邏輯閘2726的輸出被發送到AND邏輯閘2730的第一輸入。AND邏輯閘2730的其他輸入耦合到NOT邏輯閘2728,其被耦合到M計數器2718。在某些實施例中,AND邏輯閘2730的輸出2732將引起下一個運算(例如,微運算)的調度。相較於圖25,圖27包括用於偶數K的計數器2716A及用於奇數K的計數器2716B,並且此兩個計數器耦合於AND邏輯閘2720的個別輸入。在一個實施例中,K偶數計數器2716A在向下計數將B磚片加載到矩陣運算加速器電路中的資源(例如,匯流排)被佔用的週期數時,斷言偶數K的值為1,然後當完成時為0(例如,計數器K偶數的預定值),K奇數計數器2716B在向下計數將B磚片加載到矩陣運算加速器電路中的資源(例如,匯流排)被佔用的週期數時,斷言奇數K的值為1,然後當完成時為0(例如,計數器K奇數的預定值),以及M計數器2718在向下計數將A磚片加載到矩陣運算加速器電路中的資源(例如,匯流排)被佔用的週期數時,斷言奇數M的值為1,然後當完成時為0(例如,計數器M的預定值)。在每次調度後,可將計數器重置為其原始(例如,非零)值。
在一個實施例中,圖27指定要被發送到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)的下一個運算的觸發,如下所示:偶數週期由K偶數計數器2716A追蹤,及奇數週期由K奇數計數器2716B追蹤,被調度的任何運算(例如,微運算)會更新其相應的K偶數或K奇數計數器,以及被調度的任何運算(例如,微運算)也會更新M計數器,例如,並且檢查B K×N矩陣重複使用。
在一個實施例中,若(((K-偶數==0)或(K-奇數==0)或(相同的-B==1))及(M<=1))則調度下一個運算(例如,微運算)。
在一個實施例中,調度狀態表示下面情況:B匯流排週期(例如,偶數週期、或奇數週期)之一是可用的(例如,其之相應的計數器為0),以及第一FMA0是可用的(例如,M計數器為0或1),並且將主要佇列2610或者第二通過佇列2612中的下一個運算(例如,微運算)發送到運算電路(例如,圖21中的FMA柵格2109或圖22中的緩衝器電路)執行。
在某些實施例中,若當M計數器==0時發生觸發,則A及B應在同一週期被發送到TMM及/或若M計數器==1,則B匯流排應在A匯流排之前的一個週期被發送到TMM。應注意的是,某些實施例假設針對FMA電路(例如,PE)執行的多個(例如,2個)週期延遲,針對FMA電路(例如,PE)具有單個週期延遲的情況進行排程是可能的,例如,包括磚片重複使用。
以下是用於指定調度的範例。在一個實施例中,磚片(例如,磚片B)重複使用的機制與以下內容一起使用。
範例1.1 給定三個數a、b及c。吾人定義融合乘加(FMA)運算為c與a和b的乘積之和,即,ĉ=c+a∙b。
範例1.2 給定三個矩陣 。吾人定義矩陣乘法MM(M, K, N)為產生新矩陣 的運算,其中各元件 +
本文的某些實施例強加架構限制,其中M,N,K≤閾值(例如,16)。
範例1.3矩陣佇列MQ是矩陣乘法運算的有序集合,即,MQ={M M 1, M M 2, …}。此集合表示RS處的矩陣乘法運算處於就緒狀態。
範例1.4大矩陣佇列BMQ是矩陣乘法運算的有序集合,即,BMQ={M M 1, M M 2, …}。此佇列被用於K> 8 的矩陣乘法運算,其依據限制3,在矩陣乘法單元中需要額外進行一輪運算。此佇列中的每個元件具有內部計數器,並且在其插入之後的16週期準備就緒。此架構實現了兩個額外方法,更新及準備就緒用於更新及檢查佇列MM的頂端是否就緒。
在一個實施例中,每個矩陣乘法(MM)運算參數M、K、N和運算元A、B、C被定義為MM元件屬性,例如,MM.K。給定矩陣乘法MM和其運算元A、B、C,排程器可透過函數Dispatch_A、Dispatch_B、Dispatch_C來同步這些運算元的初始週期運算,該些函數接收初始週期作為輸入參數。然後,定義運算的起始週期,排程器可依據運算模式使剩下的MM運算繼續執行。具體來說,在第一(例如,FMA_0)陣列中,起始自Dispatch_A的輸入週期,在每個週期廣播元件a_(i,0),其中i=0...M,然後在週期+2,在第二(例如,FMA_1)陣列中,繼續廣播元件a_(i,1),其中i=0...M,依此類推。在一個實施例中,在透過Dispatch_C插入A之後的兩個週期,將MM.C運算元插入到FMA_0陣列,因為這是完成FMA乘法運算的時間。在一個實施例中,Dispatch_B每兩個週期分別將整個B_i列插入到FMA_i,其中i=0...K。應注意的是,根據一些實施例,每週期加載單個矩陣列是系統限制。實際上,基於此限制,排程器可將時間線分割成偶數和奇數週期,將MM運算插入這些分類好的週期中。然後,當這些週期的其中一個週期有空閒時,透過每週期更新的計數器M、K_偶數、K_奇數插入框架。在某些實施例中,若MM.K>8,則將MM(M,K,N)運算分割成兩個運算,即MM(M,8,N)和MM(M,K-8,N)。在一個實施例中,MM(M,8,N)運算包括MM(M,K,N)的前8個FMA運算,並在插入時直接發送給執行,其中MM(M,K-8,N)進入佇列(例如,在圖26中的主要佇列2610),並且等待至少一閾值數(例如,16)個運算週期(直到MM(M,8,N)完成以計算其第一行結果),然後將此MM(M,8,N)結果插入作為當執行矩陣MM(M,K-8,N)時的C輸入。
圖28示出依據本公開之實施例的矩陣運算電路的虛擬碼2800。
圖29示出依據本公開之實施例的處理矩陣運算指令的方法2900。處理器(例如,或處理器核心)可執行方法2900,例如,回應於從軟體接收到執行指令的請求。處理器(例如,或處理器核心)可以將某些運算卸載到矩陣運算加速器電路。所示的方法2900包括處理矩陣運算(例如,FMA)指令,透過:提取指令,該指令具有識別第一輸入二維矩陣的第一欄位,識別第二輸入二維矩陣的第二欄位,及識別結果儲存的欄位2902,使用硬體處理器核心的解碼器將該指令解碼成已解碼的指令,其中該硬體處理器核心耦合到包含融合乘積累加電路之二維柵格的矩陣運算加速器電路,該矩陣運算加速器電路耦合到代表第一輸入二維矩陣的第一複數個暫存器及代表第二輸入二維矩陣的第二複數個暫存器2904,擷取與第一欄位(例如,磚片A)、第二欄位(例如,磚片B)(以及可選的,第三欄位(例如,磚片C))相關聯的資料2906,(可選的)將該已解碼的指令進行排程用於執行2908,執行該已解碼的指令,以從第一複數個暫存器向融合乘積累加電路之二維柵格的第一緩衝器加載第一輸入二維矩陣,檢查融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與第二輸入二維矩陣相同的緊接在前的輸入二維矩陣,當融合乘積累加電路之二維柵格的第二緩衝器儲存了來自執行先前指令的、與第二輸入二維矩陣相同的緊接在前的輸入二維矩陣時:防止在執行該先前指令與該已解碼的單一指令之間回收第二緩衝器,對來自第一緩衝器的第一輸入二維矩陣及來自第二緩衝器的緊接在前的輸入二維矩陣執行運算以產生結果,並將該結果儲存在結果儲存中,以及當融合乘積累加電路之二維柵格的第二緩衝器未儲存來自執行先前指令的、與第二輸入二維矩陣相同的緊接在前的輸入二維矩陣時:將第二輸入二維矩陣加載到融合乘積累加電路之二維柵格的第二緩衝器中,對來自第一緩衝器的第一輸入二維矩陣及來自第二緩衝器的第二輸入二維矩陣執行該運算以產生結果,並將該結果儲存在結果儲存中2910,以及提交已執行指令的結果2912。
下面將詳細描述上面可以使用的示例性架構、系統等。
可以參考下面的範例來說明本公開技術的至少一些實施例: 範例1. 一種裝置,包括: 矩陣運算加速器電路,包括融合乘積累加電路的二維柵格; 第一複數個暫存器,代表耦合到該矩陣運算加速器電路的第一輸入二維矩陣; 第二複數個暫存器,代表耦合到該矩陣運算加速器電路的第二輸入二維矩陣; 耦合到該矩陣運算加速器電路之硬體處理器核心的解碼器,用以將單一指令解碼成已解碼的單一指令,該單一指令包括識別結果儲存的欄位;以及 該硬體處理器核心的執行電路,用以執行該已解碼的單一指令以: 從該第一複數個暫存器向該融合乘積累加電路之二維柵格的第一緩衝器加載該第一輸入二維矩陣, 檢查該融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣, 當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 防止在執行該先前指令與該已解碼的單一指令之間回收該第二緩衝器, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該緊接在前的輸入二維矩陣執行運算以產生結果,以及 將該結果儲存在該結果儲存中,以及 當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 將該第二輸入二維矩陣加載到該融合乘積累加電路之二維柵格的該第二緩衝器中, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該第二輸入二維矩陣執行該運算以產生結果,以及 將該結果儲存在該結果儲存中。 範例2. 如範例1之裝置,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,該矩陣運算加速器電路係用以在執行該先前指令與該已解碼的單一指令之間開始回收該第二緩衝器。 範例3. 如範例1之裝置,其中,該矩陣運算加速器電路為代表輸入二維矩陣的複數個暫存器之各者分配一識別值,以及所述檢查該融合乘積累加電路之二維柵格的該第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣包括比較來自該先前指令與該單一指令之相應的輸入二維矩陣的個別識別值。 範例4. 如範例3之裝置,其中,該矩陣運算加速器電路係用以將不同的識別值分配給該第二複數個暫存器以儲存下一個指令的輸入二維矩陣。 範例5. 如範例1之裝置,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,該矩陣運算加速器電路在執行該已解碼的單一指令期間不加載該融合乘積累加電路之二維柵格的該第二緩衝器。 範例6. 如範例1之裝置,其中,該結果儲存是第三複數個暫存器,其代表透過執行該已解碼的單一指令所形成的至少一個輸出二維矩陣。 範例7. 如範例1之裝置,其中,該運算包括將該二維柵格之融合乘積累加電路的第一適當子集之各者的個別輸出向下游傳輸到該二維柵格之融合乘積累加電路的第二適當子集之各者的個別輸入以形成該結果。 範例8. 如範例7之裝置,其中,該融合乘積累加電路的第一適當子集是該融合乘積累加電路之二維柵格的列或行之其中一者,以及該融合乘積累加電路的第二適當子集是該融合乘積累加電路之二維柵格的該列或該行之其中另一者。 範例9. 一種方法,包括: 使用硬體處理器核心的解碼器將單一指令解碼成已解碼的單一指令,其中該硬體處理器核心耦合到包含融合乘積累加電路之二維柵格的矩陣運算加速器電路,該矩陣運算加速器電路耦合到代表第一輸入二維矩陣的第一複數個暫存器以及代表第二輸入二維矩陣的第二複數個暫存器,以及該單一指令包括識別結果儲存的欄位;以及 使用該硬體處理器核心的執行電路執行該已解碼的單一指令以: 從該第一複數個暫存器向該融合乘積累加電路之二維柵格的第一緩衝器加載該第一輸入二維矩陣, 檢查該融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣, 當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 防止在執行該先前指令與該已解碼的單一指令之間回收該第二緩衝器, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該緊接在前的輸入二維矩陣執行運算以產生結果,以及 將該結果儲存在該結果儲存中,以及 當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 將該第二輸入二維矩陣加載到該融合乘積累加電路之二維柵格的該第二緩衝器中, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該第二輸入二維矩陣執行該運算以產生結果,以及 將該結果儲存在該結果儲存中。 範例10. 如範例9之方法,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,還包括在執行該先前指令與該已解碼的單一指令之間開始回收該第二緩衝器。 範例11. 如範例9之方法,還包括為代表輸入二維矩陣的複數個暫存器之各者分配一識別值,以及所述檢查該融合乘積累加電路之二維柵格的該第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣包括比較來自該先前指令與該單一指令之相應的輸入二維矩陣的個別識別值。 範例12. 如範例11之方法,還包括將不同的識別值分配給該第二複數個暫存器以儲存下一個指令的輸入二維矩陣。 範例13. 如範例9之方法,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,還包括在執行該已解碼的單一指令期間不加載該融合乘積累加電路之二維柵格的該第二緩衝器。 範例14. 如範例9之方法,其中,該結果儲存是第三複數個暫存器,其代表透過執行該已解碼的單一指令所形成的至少一個輸出二維矩陣。 範例15. 如範例9之方法,其中,該運算包括將該二維柵格之融合乘積累加電路的第一適當子集之各者的個別輸出向下游傳輸到該二維柵格之融合乘積累加電路的第二適當子集之各者的個別輸入以形成該結果。 範例16. 如範例15之方法,其中,該融合乘積累加電路的第一適當子集是該融合乘積累加電路之二維柵格的列或行之其中一者,以及該融合乘積累加電路的第二適當子集是該融合乘積累加電路之二維柵格的該列或該行之其中另一者。 範例17. 一種非暫時性機器可讀取媒體,其儲存當由機器執行時,使得該機器執行包括下列步驟之方法的程式碼: 使用硬體處理器核心的解碼器將單一指令解碼成已解碼的單一指令,其中該硬體處理器核心耦合到包含融合乘積累加電路之二維柵格的矩陣運算加速器電路,該矩陣運算加速器電路耦合到代表第一輸入二維矩陣的第一複數個暫存器以及代表第二輸入二維矩陣的第二複數個暫存器,以及該單一指令包括識別結果儲存的欄位;以及 使用該硬體處理器核心的執行電路執行該已解碼的單一指令以: 從該第一複數個暫存器向該融合乘積累加電路之二維柵格的第一緩衝器加載該第一輸入二維矩陣, 檢查該融合乘積累加電路之二維柵格的第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣, 當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 防止在執行該先前指令與該已解碼的單一指令之間回收該第二緩衝器, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該緊接在前的輸入二維矩陣執行運算以產生結果,以及 將該結果儲存在該結果儲存中,以及 當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時: 將該第二輸入二維矩陣加載到該融合乘積累加電路之二維柵格的該第二緩衝器中, 對來自該第一緩衝器的該第一輸入二維矩陣及來自該第二緩衝器的該第二輸入二維矩陣執行該運算以產生結果,以及 將該結果儲存在該結果儲存中。 範例18. 如範例17之非暫時性機器可讀取媒體,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器未儲存來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,還包括在執行該先前指令與該已解碼的單一指令之間開始回收該第二緩衝器。 範例19. 如範例17之非暫時性機器可讀取媒體,其中為代表輸入二維矩陣的複數個暫存器之各者分配一識別值,以及所述檢查該融合乘積累加電路之二維柵格的該第二緩衝器是否儲存了與該第二輸入二維矩陣相同的緊接在前的輸入二維矩陣包括比較來自該先前指令與該單一指令之相應的輸入二維矩陣的個別識別值。 範例20. 如範例19之非暫時性機器可讀取媒體,還包括將不同的識別值分配給該第二複數個暫存器以儲存下一個指令的輸入二維矩陣。 範例21. 如範例17之非暫時性機器可讀取媒體,其中,當該融合乘積累加電路之二維柵格的該第二緩衝器儲存了來自執行該先前指令的、與該第二輸入二維矩陣相同的該緊接在前的輸入二維矩陣時,還包括在執行該已解碼的單一指令期間不加載該融合乘積累加電路之二維柵格的該第二緩衝器。 範例22. 如範例17之非暫時性機器可讀取媒體,其中,該結果儲存是第三複數個暫存器,其代表透過執行該已解碼的單一指令所形成的至少一個輸出二維矩陣。 範例23. 如範例17之非暫時性機器可讀取媒體,其中,該運算包括將該二維柵格之融合乘積累加電路的第一適當子集之各者的個別輸出向下游傳輸到該二維柵格之融合乘積累加電路的第二適當子集之各者的個別輸入以形成該結果。 範例24. 如範例23之非暫時性機器可讀取媒體,其中,該融合乘積累加電路的第一適當子集是該融合乘積累加電路之二維柵格的列或行之一者,以及該融合乘積累加電路的第二適當子集是該融合乘積累加電路之二維柵格的該列或該行之另一者。
在又一實施例中,一種設備,包括資料儲存裝置,其儲存程式碼,當該程式碼由硬體處理器執行時,致使該硬體處理器執行本文所述的任何方法。設備可如詳細描述中所述的。方法可如詳細描述中所述的。 詳細的示例性系統、處理器及仿真(Emulation)
本文詳細描述了用於執行上述指令的硬體、軟體等的範例。例如,下面描述的內容詳細說明了指令執行的態樣,包括各種管線階段,例如提取、解碼、排程、執行、引退等等。 指令集
指令集可包括一或多種指令格式。給定的指令格式可定義各種欄位(例如,位元數、位元的位置)來指定,除了其他以外,還有待執行的運算(例如,運算碼)以及將對其執行運算的一或多個運算元及/或其他一或多個資料欄位(例如,遮罩)。一些指令格式透過指令範本(指令範本)(或子格式)的定義被進一步細分。例如,可將給定的指令格式的指令範本定義成具有該指令格式的欄位的不同子集(所包括的欄位通常是依照相同的順序,但至少有一些因為包括較少的欄位而具有不同的位元位置)及/或定義成具有以不同方式解譯的給定欄位。因此,使用給定的指令格式(並且,若有定義的話,以該指令格式的給定的一指令範本)來表示指令集架構(ISA)的每個指令,並且每個指令包括用來指定運算及運算元的欄位。例如,示例性的ADD指令具有特定的運算碼和指令格式,該指令格式包括指定該運算碼的運算碼欄位和用以選擇運算元(來源1/目的地及來源2)的運算元欄位;並且在指令流中此ADD指令的出現將在選擇特定運算元的運算元欄位中具有特定內容。已經釋出及/或公開一組SIMD擴充指令集,其被稱為進階向量擴充指令集(Advanced Vector Extensions)(AVX) (AVX1及AVX2)且使用向量擴充指令集(Vector Extensions) (VEX)編碼方案(例如,參見2018年11月的Intel® 64及IA-32架構軟體開發者手冊(Architectures Software Developer’s Manual);以及參見2018年10月的Intel®架構指令集擴充編程參考(Architecture Instruction Set Extensions Programming Reference))。 示例性指令格式
本文所述之指令的實施例可以用不同的格式體現。此外,下面詳細描述了示例性系統、架構、及管線。可在此種系統、架構、及管線上執行指令的實施例,但不限於詳述的那些。 通用向量友善指令格式
向量友善指令格式是適於向量指令的指令格式(例如,有某些特定用於向量運算的欄位)。雖然描述了透過向量友善指令格式來支援向量及純量兩種運算的實施例,但替代的實施例僅使用向量友善指令格式的向量運算。
圖30A-30B是示出依據本公開之實施例的通用向量友善指令格式及其指令範本的方塊圖。圖30A是示出依據本公開之實施例的通用向量友善指令格式及其類別A指令範本的方塊圖;而圖30B是示出依據本公開之實施例的通用向量友善指令格式及其類別B指令範本的方塊圖。具體地,針對通用向量友善指令格式3000定義了類別A及類別B指令範本,這兩種指令範本皆包括無記憶體存取3005指令範本及記憶體存取3020指令範本。在向量友善指令格式的情境中,該術語一般是指不受限於任何特定指令集的指令格式。
雖然將說明在本公開的實施例中,向量友善指令格式支援下列:具有32位元(4位元組)或64位元(8位元組)資料元件寬度(或大小)的64位元組向量運算元長度(或大小)(因此,64位元組向量由16個雙字組大小的元件,或者,由8個四字組大小的元件組成);具有16位元(2位元組)或8位元(1位元組)資料元件寬度(或大小)的64位元組向量運算元長度(或大小);具有32位元(4位元組)、64位元(8位元組)、16位元(2位元組)、或8位元(1位元組)資料元件寬度(或大小)的32位元組向量運算元長度(或大小);以及具有32位元(4位元組)、64位元(8位元組)、16位元(2位元組)、或8位元(1位元組)資料元件寬度(或大小)的16位元組向量運算元長度(或大小);但是替代的實施例可支援具有更多、更少、或不同的資料元件寬度(例如,128位元(16位元組)資料元件寬度)的更多、更少及/或不同的向量運算元大小(例如,256位元組的向量運算元)。
圖30A中的類別A指令範本包括:1)在無記憶體存取3005指令範本內,示出無記憶體存取、全捨入(full round)控制類型運算3010指令範本和無記憶體存取、資料轉換類型運算3015指令範本;以及2)在記憶體存取3020指令範本內,示出記憶體存取、暫時3025指令範本和記憶體存取、非暫時3030指令範本。圖30B中的類別B指令範本包括:1)在無記憶體存取3005指令範本中,示出無記憶體存取、寫入遮罩控制、部分捨入控制類型運算3012指令範本和無記憶體存取、寫入遮罩控制、vsize類型運算3017指令範本;以及2)在記憶體存取3020指令範本中,示出記憶體存取、寫入遮罩控制3027指令範本。
通用向量友善指令格式3000包括以下欄位,下面以圖30A-30B中所示的順序列出。
格式欄位3040-在此欄位中的特定值(指令格式識別符值)唯一地識別向量友善指令格式,並且因而識別指令流中向量友善指令格式之指令的出現。因此,此欄位是可選的,因為僅有通用向量友善指令格式的指令集並不需要此欄位。
基底運算欄位3042-其內容區別不同的基底運算。
暫存器索引欄位3044-其內容直接指定或透過位址產生來指定來源和目的地運算元的位置,無論來源和目的地運算元的位置是在暫存器中或者在記憶體中。這些包括足夠的位元數以便從PxQ(例如,32x512、16x128、32x1024、64x1024)暫存器檔案選擇N個暫存器。雖然在一個實施例中,N可多達三個來源和一個目的地暫存器,但替代的實施例可支援更多或更少的來源和目的地暫存器(例如,可支援多達兩個來源,其中這些來源中的一個來源也用作目的地、可支援多達三個來源,其中這些來源中的一個來源也用作目的地、可支援多達兩個來源和一個目的地)。
修飾符欄位3046-其內容區別指定記憶體存取的通用向量指令格式之指令與不指定記憶體存取的通用向量指令格式之指令的出現;也就是說,區別無記憶體存取3005指令範本和記憶體存取3020指令範本。記憶體存取運算讀取及/或寫入到記憶體階層(在一些情況下,使用暫存器中的值來指定來源及/或目的地位址),而無記憶體存取運算則不這樣做(例如,來源及目的地是暫存器)。雖然在一個實施例中,此欄位亦在執行記憶體位址計算的三個不同的方式中選擇,但替代的實施例可支援更多、更少、或不同的執行記憶體位址計算的方式。
擴充運算欄位3050-其內容區別除了基底運算之外,要執行各種不同運算中的哪一個。此欄位是情境(context)特定的。在本公開的一個實施例中,此欄位被分成類別欄位3068、α欄位3052、及β欄位3054。擴充運算欄位3050允許共同運算群組在單一指令中,而不是在2、3、或4個指令中被執行。
縮放(scale)欄位3060-其內容允許縮放索引欄位的內容,用於記憶體位址產生(例如,用於使用2 scale* 索引+基底的位址產生)。
位移欄位3062A-其內容被使用作為記憶體位址產生的一部分(例如,用於使用2 scale*索引+基底+ 位移的位址產生)。
位移因子欄位3062B(注意,在位移因子欄位3062B正上方並列位移欄位3062A表示使用這兩者中的其中一者)-其內容被使用作為位址產生的一部分;其指定將被記憶體存取的大小(N)縮放的位移因子-其中N是記憶體存取中的位元組的數目(例如,用於使用2 scale*索引+基底+縮放位移的位址產生)。忽略冗餘的低階(low-order)位元,並且因此將位移因子欄位的內容乘以記憶體運算元總大小(N),以便產生在計算有效位址時要使用的最終位移。N的值是由處理器硬體在運行時依據完整運算碼欄位3074(於本文中稍後描述)及資料調處欄位3054C而決定的。位移欄位3062A和位移因子欄位3062B是可選的,因為它們不用於無記憶體存取3005指令範本及/或不同的實施例可僅實施兩者中的一個或者兩個都不實施。
資料元件寬度欄位3064-其內容區別要使用多種資料元件寬度中的哪一種(在一些實施例中用於所有的指令;在其他實施例中僅用於其中一些指令)。此欄位是可選的,因為若僅支援一種資料元件寬度及/或使用運算碼的某些態樣來支援資料元件寬度則不需要此欄位。
寫入遮罩欄位3070-其內容依據每資料元件位置,控制目的地向量運算元中的資料元件位置是否反映基底運算和擴充運算的結果。類別A指令範本支援合併寫入遮蔽,而類別B指令範本則支援合併及歸零寫入遮蔽二者。當合併時,向量遮罩允許在執行任何運算的期間(由基底運算和擴充運算指定),保護目的地中的任何一組元件免於更新;在另一個實施例中,保留其中對應的遮罩位元具有0之目的地的每個元件的舊值。相反的,當歸零時,向量遮罩允許在執行任何運算的期間(由基底運算和擴充運算指定),將目的地中的任何一組元件歸零;在一個實施例中,當對應的遮罩位元具有0值時,將目的地的元件設定為0。此功能的一子集是能夠控制被執行的運算的向量長度(亦即,從第一個到最後一個被修改的元件的跨度);然而,被修改的元件不一定是連續的。因此,寫入遮罩欄位3070容許部分的向量運算,包括載入、儲存、算數、邏輯等等。雖然描述了本公開的實施例,其中寫入遮罩欄位3070的內容選擇含有要被使用的寫入遮罩的多個寫入遮罩暫存器中的一個(並且因此寫入遮罩欄位3070的內容間接地識別要被執行的遮蔽),但替代的實施例替代地或者額外地允許寫入遮罩欄位3070的內容直接指定要被執行的遮蔽。
立即值欄位3072-其內容允許指定立即值。此欄位是可選的,因為在不支援立即值的通用向量友善格式的實施中不存在此欄位以及在不使用立即值的指令中不存在此欄位。
類別欄位3068-其內容區別不同的指令類別。參考圖30A-B,此欄位的內容在類別A和類別B指令之間選擇。在圖30A-B中,使用圓角方形來表示特定值存在於欄位中(例如,類別A 3068A和類別B 3068B分別用於圖30A -B中的類別欄位3068)。 類別A的指令範本
在類別A的無記憶體存取3005指令範本的情況下,α欄位3052被解譯為RS欄位3052A,其內容區別要執行不同擴充運算類型中的哪一種(例如,分別指定捨入3052A.1和資料轉換3052A.2用於無記憶體存取、捨入類型運算3010和無記憶體存取、資料轉換類型運算3015指令範本),而β欄位3054區別要執行哪個指定類型的運算。在無記憶體存取3005指令範本中,縮放欄位3060、位移欄位3062A、及位移縮放欄位3062B不存在。 無記憶體存取指令範本-全捨入控制類型運算
在無記憶體存取全捨入控制類型運算3010指令範本中,β欄位3054被解譯為捨入控制欄位3054A,其內容提供靜態捨入。雖然在本公開所述的實施例中,捨入控制欄位3054A包括抑制所有浮點數異常(suppress all floating point exceptions, SAE)欄位3056和捨入運算控制欄位3058,但替代實施例可支援可將這兩種概念編碼到相同的欄位中,或者僅具有這兩種概念/欄位的其中一種(例如,可僅具有捨入運算控制欄位3058)。
SAE 欄位3056-其內容區別是否要停用(disable)異常事件報告;當SAE欄位3056的內容指示啟動抑制時,給定的指令不會回報任何種類的浮點數異常旗標並且不會喚起任何浮點數異常處理器(exception handler)。
捨入運算控制欄位3058-其內容區別要執行捨入運算群組中的哪一個(例如,捨進(Round-up)、捨去(Round-down)、向零捨入(Round-towards-zero)及就近捨入(Round-to-nearest))。因此,捨入運算控制欄位3058允許依據每一指令改變捨入模式。在其中處理器包括用於指定捨入模式的控制暫存器的本公開之一個實施例中,捨入運算控制欄位3058的內容覆寫該暫存器值。 無記憶體存取指令範本-資料轉換類型運算
在無記憶體存取資料轉換類型運算3015指令範本中,β欄位3054被解譯為資料轉換欄位3054B,其內容區別要執行多種資料轉換中的哪一種(例如,無資料轉換、重新排列、廣播)。
在類別A的記憶體存取3020指令範本的情況下,α欄位3052被解譯為驅逐指示(eviction hint)欄位3052B,其內容區別要使用哪一個驅逐指示(在圖30A中,分別指定暫時3052B.1及非暫時3052B.2用於記憶體存取、暫時3025指令範本和記憶體存取、非暫時3030指令範本),而β欄位3054被解譯為資料調處欄位3054C,其內容區別要執行多種資料調處運算(亦稱為基元(primitive))中的哪一種(例如,無調處;廣播;來源的向上轉換(up conversion);以及目的地的向下轉換(down conversion))。記憶體存取3020指令範本包括縮放欄位3060,以及可選的位移欄位3062A或位移縮放欄位3062B。
向量記憶體指令執行自記憶體載入向量和儲存向量到記憶體,並且支援轉換。如同正規向量指令,向量記憶體指令以逐資料元件的方式自/向記憶體轉移資料,且實際被轉移的元件由被選為寫入遮罩的向量遮罩的內容指示。 記憶體存取指令範本-暫時
暫時資料是可能足夠快地被再次使用而獲益於快取的資料。然而,這是提示(hint),且不同的處理器可能以不同的方式實施,包括完全地忽略該提示。 記憶體存取指令範本-非暫時
非暫時資料是不可能足夠快地被再次使用而獲益於第一階快取中的快取,並且應被給予逐出優先權的資料。然而,這是提示,且不同的處理器可以不同的方式實施,包括完全地忽略該提示。 類別B的指令範本
在類別B的指令範本的情況下,α欄位3052被解譯為寫入遮罩控制(Z)欄位3052C,其內容區別被寫入遮罩欄位3070控制的寫入遮蔽是否應被合併或歸零。
在類別B的無記憶體存取3005指令範本的情況下,β欄位3054的一部分被解譯為RL欄位3057A,其內容區別要執行不同擴充運算類型中的哪一種(例如,分別指定捨入3057A.1和向量長度(VSIZE) 3057A.2用於無記憶體存取、寫入遮罩控制、部分捨入控制類型運算3012指令範本和無記憶體存取、寫入遮罩控制、VSIZE類型運算3017指令範本),而β欄位3054的其餘部分區別要執行哪一個指定類型的運算。在無記憶體存取3005指令範本中,縮放欄位3060、位移欄位3062A、及位移縮放欄位3062B不存在。
在無記憶體存取、寫入遮罩控制、部分捨入控制類型運算3012指令範本中,β欄位3054的其餘部分被解譯為捨入運算欄位3059A,並且停用異常事件報告(給定的指令不會回報任何種類的浮點數異常旗標並且不會喚起任何浮點數異常處理器)。
捨入運算控制欄位3059A -就如同捨入運算控制欄位3058,其內容區別要執行捨入操作運算群組中的哪一個(例如,捨進、捨去、向零捨入及就近捨入)。因此,捨入運算控制欄位3059A允許依據每一指令改變捨入模式。在其中處理器包括用於指定捨入模式的控制暫存器的本公開的一個實施例中,捨入運算控制欄位3050的內容覆寫該暫存器值。
在無記憶體存取、寫入遮罩控制、VSIZE類型運算3017指令範本中,β欄位3054的其餘部分被解譯為向量長度欄位3059B,其內容區別要執行多個資料向量長度中的哪一個(例如,128、256、或512位元組)。
在類別B的記憶體存取3020指令範本的情況下,β欄位3054的一部分被解譯為廣播欄位3057B,其內容區別是否要執行廣播類型資料調處運算,而β欄位3054的其餘部分被解譯為向量長度欄位3059B。記憶體存取3020指令範本包括縮放欄位3060、以及可選地位移欄位3062A或位移縮放欄位3062B。
關於通用向量友善指令格式3000,示出完整運算碼欄位3074,包括格式欄位3040、基底運算欄位3042、及資料元件寬度欄位3064。雖然示出其中完整運算碼欄位3074包括所有的這些欄位的一個實施例,但完整運算碼欄位3074在不支援所有這些欄位的實施例中會包括少於這些欄位。完整運算碼欄位3074提供運算碼(opcode)。
擴充運算欄位3050、資料元件寬度欄位3064、及寫入遮罩欄位3070允許在通用向量友善指令格式中依據每一指令來指定這些特徵。
寫入遮罩欄位和資料元件寬度欄位的組合建立了多種類型的指令,因為它們允許依據不同的資料元件寬度來施加遮罩。
在類別A和類別B內找到的各種指令範本在不同情況下是有益的。在本公開的一些實施例中,不同的處理器或處理器內的不同的核心可僅支援類別A、僅支援類別B、或支援兩種類別。例如,旨在用於通用計算的高性能通用亂序(out-of-order)核心可僅支援類別B、主要旨在用於圖形及/或科學(通量)計算的核心可僅支援類別A、以及旨在用於以上二者的核心可支援兩種類別(當然,具有來自兩種類別的範本及指令的某些混合、但非具有來自兩種類別的所有範本及指令的核心是在本公開的範圍內的)。此外,單一處理器可包括多個核心,其中所有的核心支援相同的類別或者其中不同的核心支援不同的類別。例如,在具有獨立圖形及通用核心的處理器中,主要旨在用於圖形及/或科學計算的圖形核心之其中一者可僅支援類別A,而通用核心之其中一或多者可以是僅支援類別B之旨在用於通用計算的具有亂序執行和暫存器重新命名的高性能通用核心。不具有單獨圖形核心的另一處理器可包括另一同時支援類別A和類別B的通用循序或亂序核心。當然,在本公開的不同實施例中,來自一個類別的特徵亦可在另一類別中被實施。以高階語言編寫的程式將被形成(例如,及時編譯或靜態編譯)成各種不同的可執行形式,包括:1)僅具有目標處理器支持的用於執行的一或多種類別的指令的形式;或2)具有使用所有類別的指令的不同組合編寫的替代常式,以及具有控制流程碼,該控制流程碼依據當前正在執行該碼的處理器所支持的指令來選擇要執行的常式的形式。 示例性特定向量友善指令格式
圖31是示出依據本公開之實施例的示例性特定向量友善指令格式的方塊圖。圖31示出特定向量友善指令格式3100,其特定的意思是因為其指定了欄位的位置、大小、解譯和順序,以及那些欄位中的一些欄位的值。特定向量友善指令格式3100可被用來擴充x86指令集,因此一些欄位與現有的x86指令集和其擴充(例如,AVX)中所使用的那些欄位相似或者相同。此格式與現有的有擴充的x86指令集的前綴編碼欄位、實際運算碼位元組欄位、MOD R/M欄位、SIB欄位、位移欄位、及立即值欄位保持一致。示出圖30的欄位映射到的圖31的欄位。
應理解的是,雖然為了說明的目的,在通用向量友善指令格式3000的上下文中參照特定向量友善指令格式3100描述本公開的實施例,但除了申請專利範圍所述之外,本公開不限於特定向量友善指令格式3100。例如,通用向量友善指令格式3000考慮到各種欄位的各種可能大小,而特定向量友善指令格式3100顯示為具有特定大小的欄位。舉特定範例來說,僅管資料元件寬度欄位3064在特定向量友善指令格式3100中被顯示為一位元的欄位,但本發明不侷限於此(亦即,通用向量友善指令格式3000考慮到其他大小的資料元件寬度欄位3064)。
特定向量友善指令格式3100包括以下欄位,下面以圖31A中所示的順序列出。
EVEX前綴(位元組0-3) 3102 -以四位元組形式編碼。
格式欄位3040(EVEX位元組0,位元[7:0])-第一位元組(EVEX 位元組0)是格式欄位3040,並且其含有0x62(在本公開的一個實施例中用來區別向量友善指令格式的唯一值)。
第二至第四位元組(EVEX 位元組1-3)包括提供特定能力的數個位元欄位。
REX欄位3105(EVEX 位元組1,位元[7-5])-由EVEX.R位元欄位(EVEX位元組1,位元[7]-R)、EVEX.X位元欄位(EVEX位元組1,位元[6]-X)、及EVEX.B位元欄位(EVEX位元組1,位元[5]-B)組成。EVEX.R、EVEX.X及EVEX.B位元欄位提供與相應的VEX位元欄位相同的功能,並且使用1的補數形式編碼該些位元欄位,即,將ZMM0編碼為1111B、將ZMM15編碼為0000B。如本領域中已知的,指令的其他欄位對暫存器索引的三個較低位元(rrr、xxx、及bbb)進行編碼,使得可藉由加上EVEX.R、EVEX.X、及EVEX.B來形成Rrrr、Xxxx、及Bbbb。
REX’欄位3110 -這是REX’欄位3110的第一部分,並且是被用來對擴充的32個暫存器集之較高的16個或較低的16個進行編碼的EVEX.R’位元欄位(EVEX位元組1,位元[4]-R’)。在本公開的一個實施例中,此位元連同如下所指示的其他位元一起被以位元反轉格式儲存,以(在習知的x86 32位元模式中)與BOUND指令區別,該BOUND指令的實際運算碼位元組是62,但在MOD R/M欄位(於下文描述)中不接受11的值在MOD欄位中;本公開的替代實施例不以反轉格式儲存此位元及下文的其他指示位元。使用1的值來編碼較低的16個暫存器。換句話說,透過合併EVEX.R’、EVEX.R以及來自其他欄位的其他RRR來形成R’Rrrr。
運算碼映射欄位3115(EVEX位元組1,位元[3:0]-mmmm)-其內容對隱含的前導運算碼位元組(0F、0F 38、或0F 3)進行編碼。
資料元件寬度欄位3064(EVEX位元組2,位元[7]-W)-由符號EVEX.W表示。EVEX.W被用來定義資料類型(32位元資料元件或64位元資料元件)的粒度(大小)。
EVEX.vvvv 3120(EVEX位元組2,位元[6:3]-vvvv)-EVEX.vvvv的作用可包括下列:1)EVEX.vvvv對以反轉(1的補數)形式指定的第一來源暫存器運算元進行編碼,並且對於具有2個或更多個來源運算元的指令是有效的;2)EVEX.vvvv針對某些向量位移,對以1的補數形式指定的目的地暫存器運算元進行編碼;或3)EVEX.vvvv不對任何運算元進行編碼,該欄位被保留並且應包含1111b。因此,EVEX.vvvv欄位3120對以反轉(1的補數)形式儲存的第一來源暫存器說明符的4個低階位元進行編碼。取決於指令,使用一額外的不同的EVEX位元欄位來將說明符大小擴充到32個暫存器。
EVEX.U 3068類別欄位(EVEX位元組2,位元[2]-U)-若EVEX.U=0,其指示類別A或EVEX.U0;若EVEX.U=1,其指示類別B或EVEX.U1。
前綴編碼欄位3125(EVEX位元組2,位元[1:0]-pp)-提供額外位元給基底運算欄位。除了對以EVEX前綴格式的傳統SSE指令提供支援之外,這也具有緊縮SIMD前綴的益處(而不需要一位元組來表示SIMD前綴,EVEX前綴僅需要2個位元)。在一個實施例中,為了支援使用以傳統格式和以EVEX前綴格式的SIMD前綴(66H、F2H、F3H)的傳統SSE指令,將這些傳統SIMD前綴編碼到SIMD前綴編碼欄位中;並且於執行時先被擴充成傳統SIMD前綴,然後才被提供給解碼電路的PLA(因此PLA可以執行這些傳統指令的傳統格式及EVEX格式而無需進行修改)。儘管較新的指令可將EVEX前綴編碼欄位的內容直接用作運算碼擴充,但某些實施例以類似的方式擴充以保持一致性,但允許這些傳統SIMD前綴指定不同的含義。替代的實施例可將PLA重新設計成支援2位元的SIMD前綴編碼,因此不需要擴充。
α欄位3052(EVEX位元組3,位元[7]-EH;亦稱為EVEX.EH、EVEX.rs、EVEX.RL、EVEX. 寫入遮罩控制及EVEX.N;亦以α示出)-如先前所述,此欄位是上下文特定的。
β欄位3054(EVEX位元組3,位元[6:4]-SSS,亦稱為EVEX.s2-0、EVEX.r2-0、EVEX.rr1、EVEX.LL0、EVEX.LLB;亦以βββ示出)-如先前所述,此欄位是上下文特定的。
REX’欄位3110-這是REX’欄位的其餘部分,並且是可被用來對擴充的32個暫存器集之較高的16個或較低的16個進行編碼的EVEX.V’位元欄位(EVEX位元組3,位元[3]-V’)。此位元以位元反轉格式被儲存。使用1的值來對較低的16個暫存器進行編碼。換句話說,透過合併EVEX.V’、EVEX.vvvv來形成V’VVVV。
寫入遮罩欄位3070(EVEX位元組3,位元[2:0]-kkk)-其內容指定寫入遮罩暫存器中的暫存器的索引,如先前所述。在本公開的一個實施例中,特定值EVEX.kkk=000具有隱含特定指令未使用寫入遮罩的特殊行為(這可以各種方式實現,包括使用固線連接到所有硬體的寫入遮罩或者旁路(bypass)遮罩硬體的硬體)。
實際運算碼欄位3130(位元組4)亦稱為運算碼位元組。部分的運算碼在此欄位中被指定。
MOD R/M欄位3140(位元組5)包括MOD欄位3142、Reg欄位3144及R/M欄位3146。如先前所述,MOD欄位3142的內容區別記憶體存取及無記憶體存取運算。Reg欄位3144的作用可被歸結為兩種情況:對目的地暫存器運算元或來源暫存器運算元進行編碼,或者被視為運算碼擴充且不被用來對任何指令運算元進行編碼。R/M欄位3146的作用可包括下列:對參考記憶體位址的指令運算元進行編碼,或者對目的地暫存器運算元或來源暫存器運算元進行編碼。
縮放、索引、基底(SIB)位元組(位元組6)-如先前所述,縮放欄位3060的內容被用於記憶體位址產生。SIB.xxx 3154及SIB.bbb 3156-這些欄位的內容先前已關於暫存器索引Xxxx及Bbbb而被提及。
位移欄位3062A(位元組7-10)-當MOD欄位3142包含10時,位元組7-10 是位移欄位3062A,並且其以與傳統32位元位移(disp32)相同的方式運作,並且在位元組粒度下運作。
位移因子欄位3062B(位元組7)-當MOD欄位3142包含01時,位元組7是位移因子欄位1362B。此欄位的位置與傳統x86指令集8位元位移(disp8)的位置相同,其在位元組粒度下運作。因為disp8是正負號擴展的,因此它只能定址在-128和127位元組偏移之間;就64位元組快取線而言,disp8使用8個位元,其僅可被設定成四個實際有用的值-128、-64、0及64;由於通常需要更大的範圍,因此使用disp32;然而,disp32需要4個位元組。與disp8和disp32不同,位移因子欄位3062B是對disp8的重新解譯;當使用位移因子欄位3062B時,透過將位移因子欄位的內容乘以記憶體運算元存取(N)的大小來確定實際的位移。這種類型的位移被稱為disp8*N。這減少了平均指令長度(單一位元組用於位移但具有更大的範圍)。這種壓縮的位移是基於有效位移是記憶體存取之粒度的倍數的假設,因此,位址偏移的冗餘低階位元不需要被編碼。換句話說,位移因子欄位3062B替代傳統x86指令集8位元位移。因此,位移因子欄位3062B的編碼方式與x86指令集8位元位移的方式相同(所以在ModRM/SIB編碼規則中沒有改變),唯一的例外是disp8被超載至disp8*N。換句話說,編碼規則或編碼長度沒有改變,但只有透過硬體對位移值的解譯有改變(其需要透過記憶體運算元的大小來縮放位移,以獲得按位元組(byte-wise)方式的位址偏移)。立即值欄位3072如先前所述進行操作。 完整運算碼欄位
圖31B是示出依據本公開之一個實施例的構成完整運算碼欄位3074的特定向量友善指令格式3100的欄位的方塊圖。具體地,完整運算碼欄位3074包括格式欄位3040、基底運算欄位3042及資料元件寬度(W)欄位3064。基底運算欄位3042包括前綴編碼欄位3125、運算碼映射欄位3115及真實運算碼欄位3130。 暫存器索引欄位
圖31C是示出依據本公開之一個實施例的構成暫存器索引欄位3044的特定向量友善指令格式3100的欄位的方塊圖。具體地,暫存器索引欄位3044包括REX欄位3105、REX’欄位3110、MODR/M.reg欄位3144、MODR/M.r/m欄位3146、VVVV欄位3120、xxx欄位3154及bbb欄位3156。 擴充運算欄位
圖31D是示出依據本公開之一個實施例的構成擴充運算欄位3050的特定向量友善指令格式3100的欄位的方塊圖。當類別(U)欄位3068包含0時,其表示EVEX.U0(類別A 3068A);當類別(U)欄位3068包含1時,其表示EVEX.U1(類別B 3068B)。當U=0且MOD欄位3142包含11時(表示無記憶體存取運算),α欄位3052(EVEX位元組3,位元[7]-EH)被解譯為rs欄位3052A。當rs欄位3052A包含1(捨入3052A.1)時,β欄位3054(EVEX位元組3,位元[6:4]-SSS)被解譯為捨入控制欄位3054A。捨入控制欄位3054A包括一位元SAE欄位3056和兩位元捨入運算欄位3058。當rs欄位3052A包含0(資料轉換3052A.2)時,β欄位3054(EVEX位元組3,位元[6:4]-SSS)被解譯為三位元資料轉換欄位3054B。當U=0且MOD欄位3142包含00、01、或10(表示記憶體存取運算)時,α欄位3052(EVEX位元組3,位元[7]-EH)被解譯為驅逐指示(EH)欄位3052B且β欄位3054(EVEX位元組3,位元[6:4]-SSS)被解譯為三位元資料調處欄位3054C。
當U=1時,α欄位3052(EVEX位元組3,位元[7]-EH)被解譯為寫入遮罩控制(Z)欄位3052C。當U=1且MOD欄位3142包含11(表示無記憶體存取運算)時,β欄位3054的一部分(EVEX位元組3,位元[4]-S 0)被解譯為RL欄位3057A;當其包含1(捨入3057A.1)時,β欄位3054的其餘部分(EVEX位元組3,位元[6-5]-S 2-1)被解譯為捨入運算欄位3059A,而當RL欄位3057A包含0(VSIZE 3057.A2)時,β欄位3054的其餘部分(EVEX位元組3,位元[6-5]-S 2-1)被解譯為向量長度欄位3059B(EVEX位元組3,位元[6-5]-L 1-0)。當U=1且MOD欄位3142包含00、01、或10(表示記憶體存取運算)時,β欄位3054(EVEX位元組3,位元[6:4]-SSS)被解譯為向量長度欄位3059B(EVEX位元組3,位元[6-5]-L 1-0)及廣播欄位3057B(EVEX位元組3,位元[4]-B)。 示例性暫存器架構
圖32是依據本公開之一個實施例的暫存器架構3200的方塊圖。在所示的實施例中,有32個向量暫存器3210,其為512位元寬;這些暫存器被稱為zmm0至zmm31。較低的16個zmm暫存器之較低階256位元覆蓋在暫存器ymm0-16上。較低的16個zmm暫存器之較低階128位元(ymm暫存器之較低階128位元)覆蓋在暫存器xmm0-15上。特定向量友善指令格式3100在如下表所示的這些被覆蓋的暫存器檔案上運算。
換句話說,向量長度欄位3059B在最大長度和一或更多個其他較短長度之間選擇,其中每一此種較短長度是先前長度的一半長度;並且不具有向量長度欄位3059B的指令範本對最大向量長度進行運算。此外,在一個實施例中,特定向量友善指令格式3100的類別B指令範本對緊縮的或純量的單/雙精度浮點資料及緊縮的或純量的整數資料進行運算。純量運算是對zmm/ymm/xmm暫存器中的最低階資料元件位置執行的運算;取決於實施例,將較高階資料元件位置保持與在指令之前的位置相同,或者歸零。
寫入遮罩暫存器3215-在所示實施例中,有8個寫入遮罩暫存器(k0到k7),每個大小為64位元。在替代的實施例中,寫入遮罩暫存器3215的大小為16位元。如先前所述,在本公開的一個實施例中,向量遮罩暫存器k0不能被用作寫入遮罩;當正常指示k0的編碼被用於寫入遮罩時,其選擇0xFFFF的固線式寫入遮罩,有效停用該指令的寫入遮罩。
通用暫存器3225-在所示的實施例中,有16個64位元通用暫存器,其與現有的x86定址模式一起用來定址記憶體運算元。透過名稱RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP、及R8至R15引用這些暫存器。
純量浮點堆疊暫存器檔案(x87堆疊)3245,其上混疊有MMX緊縮整數平坦暫存器檔案3250 -在所示的實施例中,x87堆疊是八元件堆疊,被用來使用x87指令集擴充對32/64/80位元浮點數資料執行純量浮點數運算;而MMX暫存器被用來對64位元緊縮整數資料執行運算,以及用來為在MMX和XMM暫存器之間執行的某些運算保存運算元。
本公開的替代實施例可使用更寬或更窄的暫存器。此外,本公開的替代實施例可使用更多、更少、或不同的暫存器檔案及暫存器。 示例性核心架構、處理器、及電腦架構
處理器核心可以不同方式實現、用於不同目的、以及在不同處理器中。例如,此種核心的實施方式可包括:1)用於通用計算的通用循序核心;2)用於通用計算的高效能通用亂序核心;3)主要用於圖形及/或科學(通量)計算的專用核心。不同處理器的實施方式可包括:1)CPU,包括一或多個用於通用計算的通用循序核心及/或一或多個用於通用計算的通用亂序核心;以及2)共處理器,包括一或多個主要用於圖形及/或科學(通量)計算的專用核心。此種不同處理器導致不同的電腦系統架構,其可包括:1)共處理器在與CPU分離的晶片上;2)共處理器在與CPU相同封裝中的單獨晶粒上;3)共處理器在與CPU相同的晶粒上(在這種情況下,這種共處理器有時被稱為專用邏輯,諸如積體圖形及/或科學(通量)邏輯,或被稱為專用核心);以及4)單晶片系統,其可在相同的晶粒上包括所述CPU(有時被稱為應用核心或應用處理器)、上述共處理器、及額外的功能。接下來說明示例性核心架構,隨後說明示例性處理器和電腦架構。 示例性核心架構 循序及亂序核心方塊圖
圖33A是示出依據本公開之實施例的示例性循序管線及示例性暫存器重新命名、亂序發出/執行管線二者的方塊圖。圖33B是示出依據本公開之實施例的將被包括在處理器中的循序架構核心的示例性實施例及示例性暫存器重新命名、亂序發出/執行架構核心的方塊圖。圖33A-B中的實線框示出循序管線及循序核心,而虛線框的可選附加示出暫存器重新命名、亂序發出/執行管線及核心。假定循序態樣是亂序態樣的子集,將說明亂序態樣。
在圖33A中,處理器管線3300包括提取階段3302、長度解碼階段3304、解碼階段3306、分配階段3308、重新命名階段3310、排程(也被稱為調度(dispatch)或發出(issue))階段3312、暫存器讀取/記憶體讀取階段3314、執行階段3316、寫回/記憶體寫入階段3318、例外處理階段3322、以及提交階段3324。
圖33B示出處理器核心3390,包括耦接至執行引擎單元3350的前端單元3330,並且執行引擎單元3350和前端單元3330皆耦接至記憶體單元3370。核心3390可以是精簡指令集計算(RISC)核心、複雜指令集計算(CISC)核心、極長指令字(VLIW)核心、或者是混和或替代的核心類型。作為另一種選擇,核心3390可以是專用核心,例如網路或通訊核心、壓縮引擎、共處理器核心、通用計算圖形處理單元(GPGPU)核心、圖形核心等等。
前端單元3330包括耦接至指令快取單元3334的分支預測單元3332,指令快取單元3334耦接至指令轉譯旁看(lookaside)緩衝器(TLB) 3336,指令轉譯旁看緩衝器(TLB) 3336耦接至指令提取單元3338,指令提取單元3338耦接至解碼單元3340。解碼單元3340(例如,解碼電路)可解碼指令(例如,巨集指令),並產生作為輸出的一或多個微運算、微碼進入點、微指令、其他指令、或其他控制信號,其係解碼自原始指令、或反映原始指令、或導出自原始指令。可使用各種不同的機制來實現解碼單元3340。合適機制的範例包括,但不限於,查找表(look-up tables)、硬體實現、可編程邏輯陣列(PLA)、微碼唯讀記憶體(ROM)等等。在一個實施例中,核心3390包括微碼ROM或儲存用於某些巨集指令的微碼的其他媒體(例如,在解碼單元3340中或者在前端單元3330內)。解碼單元3340耦接至執行引擎單元3350中的重新命名/分配器單元3352。
執行引擎單元3350包括耦接至引退單元3354的重新命名/分配器單元3352以及一或多個排程器單元3356的集合。排程器單元3356表示任何數量的不同排程器,包括保留站、中央指令窗等等。排程器單元3356耦接至實體暫存器檔案單元3358。實體暫存器檔案單元3358之各者表示一或多個實體暫存器檔案,不同的實體暫存器檔案儲存一或多種不同的資料類型,諸如純量整數、純量浮點數、緊縮整數、緊縮浮點數、向量整數、向量浮點數、狀態(例如,指令指標,其為下一個待執行指令的位址)等等。在一個實施例中,實體暫存器檔案單元3358包含向量暫存器單元、寫入遮罩暫存器單元、及純量暫存器單元。這些暫存器單元可提供架構向量暫存器、向量遮罩暫存器、及通用暫存器。實體暫存器檔案單元3358被引退單元3354重疊,以說明暫存器重新命名及亂序執行可被實施的各種方式(例如,使用重新排序緩衝器及引退暫存器檔案;使用未來檔案、歷史緩衝器、及引退暫存器檔案;使用暫存器映射及暫存器池;等等)。引退單元3354和實體暫存器檔案單元3358耦接到執行叢集3360。執行叢集3360包括一或多個執行單元3362(例如,執行電路)的集合以及一或多個記憶體存取單元3364的集合。執行單元3362可對各種類型的資料(例如,純量浮點數、緊縮整數、緊縮浮點數、向量整數、向量浮點數)執行各種運算(例如,偏移、加法、減法、乘法)及。雖然某些實施例可包括數個專用於特定功能或功能集的執行單元,但其他實施例可僅包括一個執行單元或多個全部執行所有功能的執行單元。排程器單元3356、實體暫存器檔案單元3358、及執行叢集3360被顯示為可能是複數個,因為某些實施例為某些類型的資料/運算建立單獨的管線(例如,純量整數管線、純量浮點數/緊縮整數/緊縮浮點數/向量整數/向量浮點數管線、及/或記憶體存取管線,其各具有它們自己的排程器單元、實體暫存器檔案單元、及/或執行叢集-並且在分別的記憶體存取管線的情況下,實施某些實施例,其中僅此管線的執行叢集具有記憶體存取單元3364)。亦應理解的是,在使用單獨管線的情況下,這些管線中的一或多個管線可以是亂序發出/執行,而其他的是循序。
記憶體存取單元3364的集合耦接到記憶體單元3370,該記憶體單元3370包括耦接到資料快取單元3374的資料TLB單元3372,該資料快取單元3374耦接到第2階(L2)快取單元3376。在一個示例性實施例中,記憶體存取單元3364可包括載入單元、儲存位址單元、及儲存資料單元,其各者耦接到記憶體單元3370中的資料TLB單元3372。指令快取單元3334進一步耦接到記憶體單元3370中的第2階(L2)快取單元3376。L2快取單元3376耦接到一或多個其他階的快取,並且最終耦接到主記憶體。
作為範例,示例性暫存器重新命名、亂序發出/執行核心架構可如下實現管線3300:1)指令提取3338執行提取和長度解碼階段3302和3304;2)解碼單元3340執行解碼階段3306;3)重新命名/分配器單元3352執行分配階段3308和重新命名階段3310;4)排程器單元3356執行排程階段3312;5)實體暫存器檔案單元3358和記憶體單元3370執行暫存器讀取/記憶體讀取階段3314;執行叢集3360執行執行階段3316;6)記憶體單元3370和實體暫存器檔案單元3358執行寫回/記憶體寫入階段3318;7)各種單元可涉及異常處理階段3322;以及8)引退單元3354和實體暫存器檔案單元3358執行提交階段3324。
核心3390可支援一或多個指令集(例如,x86指令集(具有與較新版本一起加入的擴充);美國加州Sunnyvale的MIPS技術公司的MIPS指令集;美國加州Sunnyvale的ARM控股公司的ARM指令集(具有諸如NEON的可選附加擴充)),其包括本文所述的指令。在一個實施例中,核心3390包括用以支援緊縮資料指令集擴充(例如,AVX1、AVX2)的邏輯,藉此允許使用緊縮資料執行由許多多媒體應用所使用的運算。
應理解的是,核心可支援多執行緒處理(multithreading)(執行兩個或更多個平行運算或執行緒組),並且可以各種方式來如此執行,包括時間切割(time sliced)多執行緒處理、同步多執行緒處理(其中單一實體核心提供邏輯核心給實體核心正同步多執行緒處理的每個執行緒)、或其組合(例如,時間切割提取和解碼以及其後的同步多執行緒處理,諸如Intel®超執行緒(Hyper-Threading)技術)。
雖然暫存器重新命名是在亂序執行的情境下描述的,應理解的是,暫存器重新命名可被用在循序架構中。雖然處理器的所示實施例亦包括單獨的指令和資料快取單元3334/3374及共用L2快取單元3376,但替代的實施例可具有用於指令和資料二者的單一內部快取,例如第1階(L1)內部快取,或多階的內部快取。在一些實施例中,系統可包括內部快取與在核心及/或處理器外部的外部快取的組合。替代地,所有的快取可以在核心及/或處理器的外部。 具體的示例性循序核心架構
圖34A-B示出更具體的示例性循序核心架構的方塊圖,其核心將是晶片中若干邏輯方塊(包括具有相同類型及/或不同類型的其他核心)中的一個。取決於應用,該些邏輯方塊透過高頻寬的互連網路(例如,環形網路)與一些固定功能邏輯、記憶體I/O介面及其他必要的I/O邏輯通訊。
圖34A是依據本公開之實施例的單處理器核心,連同其至晶粒上互連網路3402的連接以及其之第2階(L2)快取3404的本地子集的方塊圖。在一個實施例中,指令解碼單元3400支援具有緊縮資料指令集擴充的x86指令集。L1快取3406允許低延遲存取快取記憶體進入純量及向量單元。雖然在一個實施例中(為了簡化設計),純量單元3408及向量單元3410使用分別的暫存器集(分別為,純量暫存器3412及向量暫存器3414),並且將它們之間的資料轉移寫入到記憶體,然後從第1階(L1)快取3406讀回,但本公開的替代實施例可使用不同的方式(例如,使用單一暫存器集或者包括允許資料在兩個暫存器檔案之間轉移而不需寫入及讀回的通訊路徑)。
L2快取的本地子集3404是全域L2快取的一部分,該全域L2快取被分成單獨的本地子集,每個處理器核心有一個本地子集。每個處理器核心具有對其自己的L2快取的本地子集3404的直接存取路徑。由處理器核心所讀取的資料被儲存在其L2快取子集3404中,並且可被快速地存取,與其他處理器核心存取其自己的本地L2快取子集平行。由處理核心寫入的資料被儲存在其自己的L2快取子集3404中,且若需要的話,從其他的子集清除。環形網路確保共用資料的一致性。環形網路是雙向的,以允許諸如處理器核心、L2快取、及其他邏輯區塊等的代理器在晶片內彼此通訊。各環形資料路徑在每個方向為1012位元寬。
圖34B是依據本公開之實施例的圖34A中的處理器核心之一部分的擴展視圖。圖34B包括L1快取3406之L1資料快取3406A的部分,以及關於向量單元3410和向量暫存器3414的更多細節。具體地,向量單元3410是16倍寬(16-wide)的向量處理單元(VPU)(參見16倍寬ALU 3428),其執行整數、單精度浮點數和雙精度浮點數指令之其中一或多者。VPU支持以重新排列單元3420來重新排列整數輸入、以數值轉換單元3422A-B進行數值轉換、以及以複製單元3424對記憶體輸入進行複製。寫入遮罩暫存器3426允許斷定結果向量寫入。
圖35是依據本公開之實施例的處理器3500的方塊圖,該處理器可具有一個以上的核心、可具有積體記憶體控制器、且可具有積體圖形。圖35中的實線框示出具有單核心3502A、系統代理3510、一組一或多個匯流排控制器單元3516的處理器3500,而虛線框的可選附加示出具有多核心3502A-N、系統代理單元3510中的一組一或多個積體記憶體控制器單元3514、及專用邏輯3508的替代處理器3500。
因此,處理器3500的不同實施方案可包括:1)CPU,具有專用邏輯3508為積體圖形及/或科學(通量)邏輯(其可包括一或多個核心),且核心3502A-N為一或多個通用核心(例如,通用循序核心、通用亂序核心、兩者的組合);2)共處理器,具有核心3502A-N為大量的主要用於圖形及/或科學(通量)的專用核心;以及3)共處理器,具有核心3502A-N為大量的通用循序核心。因此,處理器3500可以是通用處理器、共處理器或專用處理器,例如,網路或通訊處理器、壓縮引擎、圖形處理器、GPGPU(通用圖形處理單元)、高通量多積體核心(MIC)共處理器(包括30或更多的核心)、嵌入式處理器等等。處理器可被實施在一或更多的晶片上。處理器3500可以是一或多個基板的一部分及/或可被實施在一或多個基板上,其使用例如BiCMOS、CMOS、或NMOS之多種製程技術中的任一種。
記憶體階層包括在核心內的一或多階快取、一組或一或多個共用快取單元3506、及耦接至該組積體記憶體控制器單元3514的外部記憶體(未示出)。該組共用快取單元3506可包括一或多個中階快取,諸如第2階(L2)、第3階(L3)、第4階(L4)、或其他階的快取、末階快取(LLC)、及/或其之組合。雖然在一個實施例中,基於環的互連單元3512將積體圖形邏輯3508、該組共用快取單元3506、及系統代理單元3510/積體記憶體控制器單元3514互連,但替代的實施例可使用任何數量的公知技術來互連這些單元。在一個實施例中,維持一或多個快取單元3506與核心3502A-N之間的一致性。
在一些實施例中,核心3502A-N中的一或多個能夠進行多緒處理。系統代理3510包括協調及操作核心3502A-N的那些元件。系統代理單元3510可包括例如電源控制單元(PCU)及顯示單元。PCU可以是或者可包括調節核心3502A-N及積體圖形邏輯3508之電源狀態所需的邏輯和元件。顯示單元係用於驅動一或多個外部連接的顯示器。
核心3502A-N在架構指令集方面可以是同質的(homogenous)或異質的(heterogeneous);即,核心3502A-N中的兩個或更多個能夠執行相同的指令集,而其他的能夠執行僅該指令集的子集或者不同的指令集。 示例性電腦架構
圖36-39是示例性電腦架構的方塊圖。針對膝上型電腦、桌上型電腦、手持式PC、個人數位助理、工程工作站、伺服器、網路裝置、網路集線器、交換器、嵌入式處理器、數位信號處理器(DSP)、圖形裝置、視訊遊戲裝置、機上盒、微控制器、行動電話、可攜式媒體播放器、手持裝置、及各種其他電子裝置之本領域中公知的其他系統設計和配置也是合適的。一般來說,如本文所述之能夠併入處理器及/或其他執行邏輯的各式各樣的系統或電子裝置通常是合適的。
現在參考圖36,所示是依據本公開之一個實施例的系統3600的方塊圖。系統3600可包括一或多個處理器3610、3615,其耦合至控制器集線器3620。在一個實施例中,控制器集線器3620包括圖形記憶體控制器集線器(GMCH) 3690及輸入/輸出集線器(IOH) 3650(其可以在不同的晶片上);GMCH 3690包括記憶體和圖形控制器,記憶體3640及共處理器3645耦接至其;IOH 3650將輸入/輸出(I/O)裝置3660耦接至GMCH 3690。替代地,將記憶體和圖形控制器之其中一者或二者整合在處理器內(如本文所述),將記憶體3640及共處理器3645直接耦接到處理器3610,以及控制器集線器3620與IOH 3650在單一晶片中。記憶體3640可包括矩陣加速碼3640A,例如,其儲存程式碼,當該程式碼被執行時,致使處理器執行本公開的任何方法。
在圖36中以虛線表示額外的處理器3615的可選性質。每個處理器3610、3615可包括本文所述之一或多個處理核心,並且可以是處理器3500的某個版本。
記憶體3640可以是,例如,動態隨機存取記憶體(DRAM)、相變記憶體(PCM)、或二者的組合。對至少一個實施例而言,控制器集線器3620經由諸如前側匯流排(FSB)之多點(multi-drop)匯流排、諸如快速路徑互連(QPI)之點對點介面、或者類似的連接3695,與處理器3610、3615通訊。
在一個實施例中,共處理器3645是專用處理器,諸如,舉例來說,高通量的MIC處理器、網路通訊處理器、壓縮引擎、圖形處理器、GPGPU、嵌入式處理器等等。在一個實施例中,控制器集線器3620可包括積體圖形加速器。
就指標度量的範圍而言,其包括架構、微架構、熱力、電力消耗特性等,實體資源3610、3615之間可存在各種的差異。
在一個實施例中,處理器3610執行控制一般類型的資料處理運算的指令。嵌入在指令中的可以是共處理器指令。處理器3610將這些共處理器指令識別為應由附接的共處理器3645執行的類型。因此,處理器3610在共處理器匯流排或其他互連上,向共處理器3645發出這些共處理器指令(或表示共處理器指令的控制信號)。共處理器3645接受並執行收到的共處理器指令。
現在參考圖37,示出的是依據本公開之實施例的第一更具體的示例性系統3700的方塊提。如圖37中所示,多處理器系統3700是點對點互連系統,並且包括經由點對點互連3750耦接的第一處理器3770及第二處理器3780。處理器3770及3780之各者可以是處理器3500的某版本。在本公開的一個實施例中,處理器3770和3780分別是處理器3610和3615,而共處理器3738是共處理器3645。在另一實施例中,處理器3770和3780分別是處理器3610和共處理器3645。
示出處理器3770及3780分別包括積體記憶體控制器(IMC)單元3772及3782。處理器3770還包括作為其匯流排控制器單元之一部分的點對點(P-P)介面3776及3778;類似的,第二處理器3780包括P-P介面3786及3788。處理器3770、3780可使用P-P介面電路3778、3788經由點對點(P-P)介面3750交換資訊。如圖37中所示,IMC 3772及3782將處理器耦接至個別的記憶體,也就是記憶體3732及記憶體3734,其可為主記憶體之本地附接至該些個別處理器的部分。
處理器3770、3780分別可透過個別的P-P介面3752、3754,使用點對點介面電路3776、3794、3786、3798與晶片組3790交換資訊。晶片組3790可選地可透過高效能介面3739與共處理器3738交換資訊。在一個實施例中,共處理器3738是專用處理器,諸如,舉例來說,高通量MIC處理器、網路或通訊處理器、壓縮引擎、圖形處理器、GPGPU、嵌入式處理器等等。
共用快取(未示出)可被包括在任一處理器中或在兩個處理器外部,但仍經由P-P互連與該些處理器連接,使得若一處理器處於低電源模式時,可將任一處理器或兩個處理器的本地快取資訊儲存在共用快取中。
晶片組3790可透過介面3796被耦接到第一匯流排3716。在一個實施例中,第一匯流排3716可以是週邊組件互連(PCI)匯流排,或是諸如快速週邊組件互連(PCI Express)匯流排或另一第三代I/O互連匯流排的匯流排,僅管本公開的範圍不限於此。
如圖37中所示,各種I/O裝置3714可以與將第一匯流排3716耦接到第二匯流排3720的匯流排橋接器3718一起耦合到第一匯流排3716。在一個實施例中,一或多個額外的處理器,諸如共處理器、高通量MIC處理器、GPGPU的加速器(例如,圖形加速器或數位信號處理(DSP)單元)、現場可編程閘陣列、或任何其他處理器等,被耦接到第一匯流排3716。在一個實施例中,第二匯流排3720可以是低接腳計數(low pin count, LPC)匯流排。在一個實施例中,各種裝置可被耦接到第二匯流排3720,包括,例如,鍵盤及/或滑鼠3722、通訊裝置3727及諸如磁碟機或其他大量儲存裝置的儲存單元3728,其可包括指令/碼及資料3730。此外,音訊I/O 3724可被耦接到第二匯流排3720。應注意的是,其他架構是可能的。舉例來說,取代圖37的點對點架構,系統可實現多點匯流排或其他此種架構。
現在參考圖38,所示是依據本公開之實施例的第二更具體的示例性系統3800的方塊圖。圖37及38中的相似元件具有相同的參考標號,並且在圖38中省略了圖37的某些方面,以避免混淆圖38的其他方面。
圖38示出處理器3770、3780分別可包括積體記憶體及I/O控制邏輯(“CL”) 3772及3782。因此,CL 3772、3782包括積體記憶體控制器單元且包括I/O控制邏輯。圖38示出了不僅記憶體3732、3734耦接到CL 3772、3782,還有I/O裝置3814也耦接到控制邏輯3772、3782。傳統I/O裝置3815耦接到晶片組3790。
現在參考圖39,所示是依據本公開之實施例的SoC 3900的方塊圖。圖35中的相似元件具有相同的參考標號。同樣的,虛線框是更先進的SoC上的可選特徵。在圖39中,互連單元3902被耦接至:應用處理器3910,其包括一組一或多個核心3502A-N以及共用快取單元3506;系統代理單元3510;匯流排控制器單元3516;積體記憶體控制器單元3514;一組或一或多個共處理器3920,其可包括積體圖形邏輯、影像處理器、音訊處理器、及視訊處理器;靜態隨機存取記憶體(SRAM)單元3930;直接記憶體存取(DMA)單元3932;以及用於耦接到一或多個外部顯示器的顯示單元3940。在一個實施例中,一或多個共處理器3920包括專用處理器,例如網路或通訊處理器、壓縮引擎、GPGPU、高通量MIC處理器、嵌入式處理器等等。
本文所揭示之(例如,手段的)實施例可以硬體、軟體、韌體、或這些實施方法的組合來實施。本揭示的實施例可被實施為電腦程式或者在可編程的系統上執行的程式碼,可編程的系統包括至少一個處理器、儲存系統(包括揮發性及非揮發性記憶體及/或儲存元件)、至少一個輸入裝置、及至少一個輸出裝置。
程式碼,例如圖37中所示的碼3730,可被應用到輸入指令,以執行本文所述的功能並且產生輸出資訊。可以已知的方式將輸出資訊應用到一或多個輸出裝置。為了本申請的目的,處理系統包括具有例如:數位信號處理器(DSP)、微控制器、特殊應用積體電路(ASIC)、或微處理器等之處理器的任何系統。
程式碼可以高階程序或物件導向的程式語言實作,以與處理系統通訊。若有需要,程式碼亦可以組合語言或機器語言實作。事實上,本文所述之手段不侷限於任何特定的程式語言的範疇。在任何情況下,語言可以是經過編譯的或者經過解譯的語言。
至少一個實施例的一或多個態樣可由儲存在機器可讀取媒體上的代表指令實作,其代表處理器內的各種邏輯,當由機器讀取指令時,致使機器製造邏輯以執行本文所述之技術。被稱為「IP核心」的此種代表可被儲存在有形的、機器可讀取的媒體上,並且被提供給各種客戶或製造廠,以載入到實際製造邏輯或處理器的製造機器。
這種機器可讀取儲存媒體可包括,但不限於,由機器或裝置所製造或形成的物件的非暫態、有形的配置,包括儲存媒體,諸如硬碟、包括軟碟、光碟、唯讀光碟記憶體(CD-ROM)、可複寫光碟(CD-RW)、及磁性光碟之任何其他類型的碟片,半導體裝置諸如唯讀記憶體(ROM)、隨機存取記憶體(RAM)諸如動態隨機存取記憶體(DRAM)、靜態隨機存取記憶體(SRAM)、可抹除可編程唯讀記憶體(EPROM)、快閃記憶體、電可抹除可編程唯讀記憶體(EEPROM)、相變記憶體(PCM)、磁性或光學卡、或適合儲存電子指令的任何其他類型的媒體。
因此,本公開之實施例亦包括非暫態、有形的機器可讀取媒體,其包含指令或包含設計資料,諸如硬體描述語言(HDL),其定義本文所述之架構、電路、設備、處理器及/或系統特徵。此種實施例也可被稱為程式產品。 仿真(包括二進制轉譯、碼變形等等)
在一些情況中,指令轉換器可被用來將指令從來源指令集轉換成目標指令集。例如,指令轉換器可將指令轉譯(例如,使用靜態二進制轉譯、包括動態編譯的動態二進制轉譯)、變形(morph)、仿真、或者轉換成將由核心處理的一或多個其他指令。指令轉換器可以軟體、硬體、韌體、或其組合來實作。指令轉換器可以在處理器上、處理器外、或者部分在處理器上且部分在處理器外。
圖40是依據本公開之實施例的對比使用軟體指令轉換器將來源指令集中的二進制指令轉換為目標指令集中的二進制指令的方塊圖。在示出的實施例中,指令轉換器是軟體指令轉換器,僅管可選地,指令轉換器可以用軟體、韌體、硬體或其各種組合來實現。圖40示出可使用x86編譯器4004來編譯高階語言4002的程式,以產生x86二進制碼4006,其可由具有至少一個x86指令集核心的處理器4016本機執行。具有至少一個x86指令集核心的處理器4016代表可實質上執行與具有至少一個x86指令集核心的Intel®處理器相同的功能的任何處理器,上述執行係藉由相容地執行或者處理(1) Intel® x86指令集核心的指令集的大部分、或(2)目標運行在具有至少一個x86指令集核心之Intel®處理器上的應用程式或其他軟體的目標碼版本,以便達到與具有至少一個x86指令集核心之Intel®處理器實質上相同的結果。x86編譯器4004代表可操作以產生可在具有或不具有額外的鍊接處理的情況下在具有至少一個x86指令集核心的處理器4016上執行的x86二進制碼4006(例如,目標碼)的編譯器。類似的,圖40示出可使用替代的指令集編譯器4008來編譯高階語言4002的程式,以產生替代的指令集二進制碼4010,其可由不具有至少一個x86指令集核心的處理器4014(例如,具有執行美國加州Sunnyvale的美普思科技公司(MIPS Technologies)的MIPS指令集及/或執行美國加州Sunnyvale的安謀控股公司(ARM Holdings)的ARM指令集的核心的處理器)本機執行。指令轉換器4012被用來將x86二進制碼4006轉換成可由不具有x86指令集核心的處理器4014本機執行的碼。此經轉換的碼不太可能與替代的指令集二進制碼4010一樣,原因在於難以製造能夠如此操作的指令轉換器;然而,經轉換的碼將完成一般的運算並且由來自替代的指令集的指令構成。因此,指令轉換器4012代表經由仿真、模擬或任何其他處理來允許不具有x86指令集處理器或核心的處理器或其他電子裝置執行x86二進制碼4006的軟體、韌體、硬體、或其組合。
102:應用記憶體 104:磚片 106:磚片 108:磚片 110:磚片 122:應用記憶體 124:磚片 126:磚片 128:磚片 130:磚片 301:主處理器/處理系統 303:連貫記憶體介面 305:資料緩衝器 307:矩陣運算加速器 309:融合乘積累加(FMA) 311:命令 401:主處理器 403:記憶體 405:矩陣運算加速器電路 501:主處理器 503:主記憶體 505:矩陣運算加速器 507:磚片記憶體 601:磚片 603:磚片 605:磚片 611:融合乘積累加(FMA) 701:來源 703:來源 705:乘法器電路 707:乘法器電路 709:來源 711:加法電路 713:加法器 715:目的地 801:來源 803:來源 805:乘法器電路 807:乘法器電路 809:來源 813:加法/飽和電路 815:結果 901:來源 903:來源 905:乘法器電路 907:乘法器電路 909:乘法器電路 911:乘法器電路 913:加法電路 915:來源 917:加法器 919:結果 1001:來源 1003:來源 1005:乘法器電路 1007:乘法器電路 1009:乘法器電路 1011:乘法器電路 1013:加法/飽和電路 1015:來源 1019:結果 1101:表 1103:表 1105:表 1201:核心 1203:核心 1205:核心 1207:核心 1211:矩陣運算電路 1213:矩陣運算電路 1223:記憶體控制器 1225:記憶體控制器 1231:記憶體 1233:記憶體 1245:環形互連 1251:矩陣運算電路 1301:指令儲存 1303:分支預測及解碼電路 1305:微碼 1307:分配/重命名電路 1309:排程器電路 1311:執行電路 1313:快取 1315:物理暫存器檔案 1317:引退電路 1321:純量電路 1323:向量/SIMD電路 1325:記憶體存取電路 1327:矩陣運算電路 1390:核心 1401:指令儲存 1403:分支預測及解碼電路 1405:微碼 1407:分配/重命名電路 1409:排程器電路 1411:執行電路 1413:快取 1415:物理暫存器檔案 1417:引退電路 1425:記憶體存取電路 1427:執行電路 1490:核心 1601:矩陣 1603:矩陣 1605:矩陣 1701:步驟 1703:步驟 1705:步驟 1707:步驟 1709:步驟 1801:記憶體 1803:磚片描述 1805:處理器/核心 1811:指令執行資源 1813:調色板表 1817:磚片配置 1819:暫存器 1901:調色板ID 1903:暫存器 1905:暫存器 1907:磚片 1913:列數 1915:行數 2001:磚片 2003:磚片 2011:暫存器 2013:暫存器 2015:狀態暫存器 2021:列配置 2023:行配置 2031:磚片配置 2101:主處理器/處理系統 2103:記憶體介面 2105:資料緩衝器 2107:矩陣運算加速器 2109:FMA柵格 2111:保留站(RS)電路 2113:矩陣加速器控制器電路 2115:調度電路 2200:矩陣運算加速器電路 2204-1:路由/緩衝器電路 2204-2:路由/緩衝器電路 2204-3:路由/緩衝器電路 2204-4:路由/緩衝器電路 2205:資料緩衝器 2206-1:處理元件 2206-2:處理元件 2206-3:處理元件 2206-4:處理元件 2208:偏移加法電路 2212:處理元件 2214:處理元件 2222:處理元件 2224:處理元件 2230:輸出 2232:輸出 2234:輸入 2236:輸出 2300:調度電路 2302:多工器 2304:輸出 2306:輸入 2308:計數器 2310:排程電路 2400:排程電路 2402:輸出 2404:計數器 2406:計數器 2408:計數器 2410:置換調度控制 2412:OR邏輯閘 2414:NOT邏輯閘 2500:排程電路 2502:輸入 2504:儲存 2506:有效磚片儲存 2508:比較電路 2510:輸出 2512:NOT邏輯閘 2514:AND邏輯閘 2516:K計數器 2518:M計數器 2520:計數器 2522:OR邏輯閘 2524:NOT邏輯閘 2526:輸出 2528:OR邏輯閘 2530:NOT邏輯閘 2532:置換調度控制 2600:調度電路 2602:排程電路 2604:多工器 2606:多工器 2608:輸出 2610:主要佇列 2612:第二通過佇列 2700:排程電路 2702:輸入 2704:儲存 2706:儲存 2708:比較電路 2710:輸出 2716A:計數器 2716B:計數器 2718:M計數器 2720:AND邏輯閘 2724:NOT邏輯閘 2726:OR邏輯閘 2728:NOT邏輯閘 2730:AND邏輯閘 2732:輸出 2800:虛擬碼 2900:方法 2902:步驟 2904:步驟 2906:步驟 2908:步驟 2910:步驟 2912:步驟 3000:通用向量友善指令格式 3005:無記憶體存取 3010:無記憶體存取、全捨入控制類型操作 3012:無記憶體存取、寫入遮罩控制、部分捨入控制類型操作 3015:無記憶體存取、資料轉換類型操作 3017:無記憶體存取、寫入遮罩控制、vsize類型操作 3020:記憶體存取 3025:記憶體存取、暫時 3027:記憶體存取、寫入遮罩控制 3030:記憶體存取、非暫時 3040:格式欄位 3042:基底運算欄位 3044:暫存器索引欄位 3046:修飾符欄位 3050:擴充運算欄位 3052:α欄位 3052A:RS欄位 3052A.1:捨入 3052A.2:資料轉換 3052B:驅逐指示欄位 3052B.1:暫時 3052B.2:非暫時 3052C:寫入遮罩控制欄位 3054:β欄位 3054A:捨入控制欄位 3054B:資料轉換欄位 3054C:資料操作欄位 3056:抑制所有浮點數異常(SAE)欄位 3057A:RL欄位 3057A.1:捨入 3057A.2:向量長度(VSIZE) 3057B:廣播欄位 3058:捨入操作控制欄位 3059A:捨入操作欄位 3059B:向量長度欄位 3060:縮放欄位 3062A:位移欄位 3062B:位移因子欄位 3064:資料元件寬度欄位 3068:類別欄位 3068A:類別A 3068B:類別B 3070:寫入遮罩欄位 3072:立即值欄位 3074:完整運算碼欄位 3100:特定向量友善指令格式 3102:EVEX前綴 3105:REX欄位 3110:REX’欄位 3115:運算碼映射欄位 3120:VVVV欄位 3125:前綴編碼欄位 3130:真實運算碼欄位 3140:MOD:R/M欄位 3142:MOD欄位 3144:MODR/M.reg欄位 3146:MODR/M.r/m欄位 3154:xxx欄位 3156:bbb欄位 3200:暫存器架構 3210:向量暫存器 3215:寫入遮罩暫存器 3225:通用暫存器 3245:純量浮點堆疊暫存器檔案(x87堆疊) 3250:MMX緊縮整數平坦暫存器檔案 3300:處理器管線 3302:提取階段 3304:長度解碼階段 3306:解碼階段 3308:分配階段 3310:重新命名階段 3312:排程階段 3314:暫存器讀取/記憶體讀取階段 3316:執行階段 3318:寫回/記憶體寫入階段 3322:例外處理階段 3324:提交階段 3330:前端單元 3332:分支預測單元 3334:指令快取單元 3336:指令轉譯旁看緩衝器(TLB) 3338:指令提取單元 3340:解碼單元 3350:執行引擎單元 3352:重新命名/分配器單元 3354:引退單元 3356:排程器單元 3358:實體暫存器檔案單元 3360:執行叢集 3362:執行單元 3364:記憶體存取單元 3370:記憶體單元 3372:資料TLB單元 3374:資料快取單元 3376:第2階(L2)快取單元 3390:處理器核心 3400:指令解碼單元 3402:晶粒上互連網路 3404:第2階(L2)快取的本地子集 3406:第1階(L1)快取 3406A:L1資料快取 3408:純量單元 3410:向量單元 3412:純量暫存器 3414:向量暫存器 3420:重新排列單元 3422A:數值轉換單元 3422B:數值轉換單元 3424:複製單元 3426:寫入遮罩暫存器 3428:16倍寬向量ALU 3500:處理器 3502A~N:核心 3504A~N:快取單元 3506:共用快取單元 3508:專用邏輯 3510:系統代理單元 3512:基於環的互連單元 3514:積體記憶體控制器單元 3516:匯流排控制器單元 3600:系統 3610:處理器 3615:處理器 3620:控制器集線器 3640:記憶體 3640A:矩陣加速碼 3645:共處理器 3650:輸入/輸出集線器(IOH) 3660:輸入/輸出(I/O)裝置 3690:圖形記憶體控制器集線器(GMCH) 3695:連接 3700:多處理器系統 3714:I/O裝置 3715:處理器 3716:第一匯流排 3718:匯流排橋接器 3720:第二匯流排 3722:鍵盤及/或滑鼠 3724:音訊I/O 3727:通訊裝置 3728:儲存單元 3730:指令/碼及資料 3732:記憶體 3734:記憶體 3738:共處理器 3739:高效能介面 3750:點對點互連 3752:P-P介面 3754:P-P介面 3770:處理器 3772:積體記憶體控制器(IMC)單元 3776:點對點介面電路 3778:點對點介面電路 3780:處理器 3782:積體記憶體控制器(IMC)單元 3786:點對點介面電路 3788:點對點介面電路 3790:晶片組 3794:點對點介面電路 3796:介面 3798:點對點介面電路 3800:系統 3814:I/O裝置 3815:傳統I/O裝置 3900:系統單晶片 3902:互連單元 3910:應用處理器 3920:共處理器 3930:靜態隨機存取記憶體(SRAM)單元 3932:直接記憶體存取(DMA)單元 3940:顯示單元 4002:高階語言 4004:x86編譯器 4006:x86二進制碼 4008:替代的指令集編譯器 4010:替代的指令集二進制碼 4012:指令轉換器 4014:不具有x86指令集核心的處理器 4016:具有至少一個x86指令集核心的處理器
本公開透過示例而非限制的方式在附圖的圖示中示出,其中相似的參考符號表示相似的元件,以及其中:
[圖1A]示出依據本公開之實施例的已配置磚片(tile)的實施例。
[圖1B]示出依據本公開之實施例的已配置磚片的實施例。
[圖2]示出依據本公開之實施例的矩陣儲存器的多個範例。
[圖3]示出依據本公開之實施例的利用矩陣(磚片)運算加速器之系統的實施例。
[圖4及5]示出了如何使用矩陣運算加速器共享記憶體的不同實施例。
[圖6]示出使用磚片之矩陣乘積累加運算(“TMMA”)的實施例。
[圖7]示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。
[圖8]示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。
[圖9]示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。
[圖10]示出執行連鎖的融合乘積累加指令之迭代的子集的實施例。
[圖11]示出依據實施例的二次冪大小的SIMD實現,其中累加器使用的輸入大小大於乘法器的輸入大小。
[圖12]示出使用矩陣運算電路之系統的實施例。
[圖13]示出支持使用磚片之矩陣運算的處理器核心管線的實施例。
[圖14]示出支持使用磚片之矩陣運算的處理器核心管線的實施例。
[圖15]示出以列(row)為主之格式以及以行(column)為主之格式表示的矩陣的範例。
[圖16]示出使用矩陣(磚片)的範例。
[圖17]示出使用矩陣(磚片)之方法的實施例。
[圖18]示出依據本公開之實施例的支持使用磚片的配置。
[圖19]示出對要支持的矩陣(磚片)之描述的實施例。
[圖20(A)-(D)]示出一或多個暫存器的範例。
[圖21]示出依據本公開之實施例的使用矩陣(磚片)運算加速器之系統的實施例。
[圖22]示出依據本公開之實施例的矩陣運算加速器電路,包括處理元件電路的二維柵格。
[圖23]示出依據本公開之實施例的矩陣運算加速器電路的調度電路。
[圖24]示出依據本公開之實施例的矩陣運算加速器電路之調度電路的排程電路。
[圖25]示出依據本公開之實施例的矩陣運算加速器電路之調度電路的排程電路,其可從基線排程模式切換到重複使用輸入矩陣的排程模式。
[圖26]示出依據本公開之實施例的用於多次通過的矩陣運算加速器電路的調度電路。
[圖27]示出依據本公開之實施例的用於多次通過的矩陣運算加速器電路的調度電路的排程電路。
[圖28]示出依據本公開之實施例的矩陣運算電路的虛擬碼。
[圖29]示出依據本公開之實施例的處理矩陣運算指令的方法。
[圖30A]是示出依據本公開之實施例的通用向量友善指令格式及其類別A指令範本的方塊圖。
[圖30B]是示出依據本公開之實施例的通用向量友善指令格式及其類別B指令範本的方塊圖。
[圖31A]是示出依據本公開之實施例的圖30A及30B中的通用向量友善指令格式的欄位的方塊圖。
[圖31B]是示出依據本公開之一個實施例的圖31A中構成完整運算碼欄位的特定向量友善指令格式的欄位的方塊圖。
[圖31C]是示出依據本公開之一個實施例的圖31A中構成暫存器索引欄位的特定向量友善指令格式的欄位的方塊圖。
[圖31D]是示出依據本公開之一個實施例的圖31A中構成擴充運算欄位3050的特定向量友善指令格式的欄位的方塊圖。
[圖32]是依據本公開之一個實施例的暫存器架構的方塊圖。
[圖33A]是示出依據本公開之實施例的示例性循序管線及示例性暫存器重新命名、亂序發出/執行管線二者的方塊圖。
[圖33B]是示出依據本公開之實施例的將被包括在處理器中的循序架構核心的示例性實施例及示例性暫存器重新命名、亂序發出/執行架構核心的方塊圖。
[圖34A]是依據本公開之實施例的單處理器核心,連同其至晶粒上互連網路的連接以及其之第2階(L2)快取的本地子集的方塊圖。
[圖34B]是依據本公開之實施例的圖34A中的處理器核心之一部分的擴展視圖。
[圖35]是依據本公開之實施例的處理器的方塊圖,該處理器可具有一個以上的核心、可具有積體記憶體控制器、且可具有積體圖形。
[圖36]是依據本公開之一個實施例的系統的方塊圖。
[圖37]是依據本公開之一實施例的更具體的示例性系統的方塊圖。
[圖38]所示是依據本公開之實施例的第二更具體的示例性系統的方塊圖。
[圖39]所示是依據本公開之實施例的單晶片系統(SoC)的方塊圖。
[圖40]是依據本公開之實施例的對比使用軟體指令轉換器將來源指令集中的二進制指令轉換為目標指令集中的二進制指令的方塊圖。

Claims (10)

  1. 一種裝置,包括: 第一一或多個向量暫存器,用以儲存第一複數個來源矩陣資料元件; 第二一或多個向量暫存器,用以儲存第二複數個來源矩陣資料元件,該第一及第二複數個來源矩陣資料元件的各個來源矩陣資料元件具有第一資料元件寬度; 第三一或多個向量暫存器,用以儲存複數個累加矩陣資料元件,該複數個累加矩陣資料元件的各個累加資料元件具有第二資料元件寬度,該第二資料元件寬度至少是該第一資料元件寬度的兩倍; 矩陣處理電路,可在複數個處理通道中操作,該矩陣處理電路用以執行單一矩陣指令,以在該複數個處理通道中執行相對應的複數個乘法;以及 運算元路由電路,用以根據該單一矩陣指令將該第一複數個來源矩陣資料元件中的第一來源矩陣資料元件廣播到該複數個處理通道中的多個處理通道,其中在該多個處理通道中的各個處理通道中,該矩陣處理電路用以執行該第一來源矩陣資料元件與該第二複數個來源矩陣資料元件中的不同資料元件的相對應乘法以產生相對應的乘積,該相對應的乘積被加到相對應的累加矩陣資料元件和該第一及第二複數個來源矩陣資料元件的個別資料元件相乘的一或多個其他乘積,以產生具有該第二資料元件寬度的相對應的結果矩陣資料元件。
  2. 如請求項1之裝置,其中,各個處理通道具有等於該第二資料元件寬度的處理通道寬度。
  3. 如請求項1或2之裝置,其中,該第一及第二複數個來源矩陣資料元件包括16位元的浮點資料元件,並且該累加矩陣資料元件包括32位元的浮點資料元件。
  4. 如請求項1之裝置,還包括: 本地緩衝器儲存,用以在執行該單一矩陣指令期間,至少儲存該第一複數個來源矩陣資料元件和該第二複數個來源矩陣資料元件的子集。
  5. 如請求項4之裝置,其中,在該第一複數個來源矩陣資料元件或該第二複數個來源矩陣資料元件之該子集中的一或多個矩陣資料元件將由該矩陣處理電路在多個操作中重複使用。
  6. 如請求項4之裝置,其中,該本地緩衝器儲存用以儲存該第一複數個來源矩陣資料元件的該子集和該第二複數個來源矩陣資料元件的子集。
  7. 如請求項5之裝置,其中,該矩陣處理電路用以對該第一複數個來源矩陣資料元件的該子集和該第二複數個來源矩陣資料元件的該子集執行矩陣運算,將相對應的結果資料元件儲存在該本地緩衝器儲存中,並且將該等相對應的結果資料元件與後續矩陣運算的後續結果資料元件組合。
  8. 如請求項4至7之任一項的裝置,其中,該矩陣處理電路用以防止回收該本地緩衝器儲存的至少一部分。
  9. 如請求項1之裝置,其中,該矩陣處理電路包括佈置在該複數個處理通道中的處理元件的二維柵格。
  10. 如請求項1之裝置,還包括積體電路(IC),該IC包括該第一一或多個向量暫存器、該第二一或多個向量暫存器、該第三一或多個向量暫存器、該矩陣處理電路和該運算元路由電路。
TW112150704A 2019-12-28 2020-09-18 用於矩陣運算加速器之指令的裝置,方法和系統 TW202418114A (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US16/729,361 2019-12-28

Publications (1)

Publication Number Publication Date
TW202418114A true TW202418114A (zh) 2024-05-01

Family

ID=

Similar Documents

Publication Publication Date Title
EP3651017B1 (en) Systems and methods for performing 16-bit floating-point matrix dot product instructions
US11714875B2 (en) Apparatuses, methods, and systems for instructions of a matrix operations accelerator
US20240078285A1 (en) Systems and methods of instructions to accelerate multiplication of sparse matrices using bitmasks that identify non-zero elements
CN110955453A (zh) 用于执行矩阵压缩和解压缩指令的系统和方法
CN114625423A (zh) 用于执行将矩阵变换为行交错格式的指令的系统和方法
US20210406018A1 (en) Apparatuses, methods, and systems for instructions for moving data between tiles of a matrix operations accelerator and vector registers
JP2021057004A (ja) 行列演算アクセラレータの命令のための装置、方法、及びシステム
CN111767516A (zh) 用于利用所选择的舍入来执行浮点加法的系统和方法
CN114237713A (zh) 用于执行快速转换片并且将片用作一维向量的指令的系统
US11269630B2 (en) Interleaved pipeline of floating-point adders
CN112148251A (zh) 跳过无意义的矩阵运算的系统和方法
EP3974966A1 (en) Large scale matrix restructuring and matrix-scalar operations
EP4276608A2 (en) Apparatuses, methods, and systems for 8-bit floating-point matrix dot product instructions
CN114675883A (zh) 用于对齐矩阵操作加速器瓦片的指令的装置、方法和系统
CN111752605A (zh) 使用浮点乘法-累加结果的模糊-j位位置
CN115525336A (zh) 用于针对矩阵乘法指令的指令的装置、方法和系统
TW202223633A (zh) 用於實施16位元浮點矩陣點積指令的裝置、方法及系統
US11334647B2 (en) Apparatuses, methods, and systems for enhanced matrix multiplier architecture
CN114675888A (zh) 用于加载矩阵操作加速器瓦片的指令的装置、方法和系统
CN112988230A (zh) 用于将大约为一的浮点值相乘的指令的装置、方法和系统
TW202418114A (zh) 用於矩陣運算加速器之指令的裝置,方法和系統
CN115525333A (zh) 用于具有移位控制和宽度控制的紧缩数据卷积指令的装置、方法和系统