由讀和寫掩碼控制的向量移動指令的制作方法
【技術領域】
[0001] 本公開涉及處理邏輯、微處理器以及相關聯的指令集架構的領域,該指令集架構 在被處理器或其他處理邏輯所執行時運行邏輯、數學或其他功能性操作。
【背景技術】
[0002] 指令集或指令集架構(ISA)是計算機架構中與編程有關的部分,并且可包括原生 數據類型、指令、寄存器架構、尋址模式、存儲器架構、中斷和異常處理、以及外部輸入和輸 出(I/O)。術語指令在本申請中一般表示宏指令--宏指令是被提供給處理器(或指令轉 換器,該指令轉換器(例如利用靜態二進制轉換、包括動態編譯的動態二進制轉換)轉換、 變形、仿真或以其他方式將指令轉換成將由處理器處理的一個或多個其他指令)以供執行 的指令--作為對比,微指令或微操作(微ops)是處理器的解碼器解碼宏指令的結果。
[0003] ISA與微架構不同,微架構是實現該指令集的處理器的內部設計。具有不同微架構 的處理器可共享共同的指令集。例如,丨ntel?酷睿(Core?)處理器、以及來自加利福尼亞 州桑尼威爾(Sunnyvale)的超微半導體有限公司(Advanced Micro Devices, Inc.)的諸多 處理器執行幾乎相同版本的x86指令集(在更新的版本中加入了一些擴展),但具有不同的 內部設計。例如,可利用公知技術(包括專用物理寄存器、利用寄存器重命名機制的一個或 多個動態分配的物理寄存器)在不同微架構中以不同方式實現該ISA的同一寄存器架構。
[0004] 許多現代ISA支持單指令多數據(SIMD)操作。取代僅對一個或兩個數據元素進 行操作的標量指令,向量指令(也稱為緊縮數據指令或SIMD指令)可同時或并行地對多個 數據元素或多對數據元素進行操作。處理器可具有并行的執行硬件,以響應于該向量指令 同時或并行地執行多個操作。SIMD操作在一個操作中對緊縮在一個向量寄存器或存儲器位 置之內的多個數據元素進行操作。這些數據元素被稱為緊縮數據或向量數據。向量元素中 的每一個可表示獨立的單條數據(例如像素的顏色,等等),可單獨或與其它數據無關地操 作該單條數據。
[0005] 在一些情況下,SMD操作可以以遞歸方式對獨立向量數據元素進行操作,其中對 于不同數據元素,迭代的數量不同。因此,一些數據元素的計算可能完成,而一些其它數據 元素仍需要更多迭代。遞歸計算的一個示例是WHILE循環操作。在本示例中,在條件(X[i]) 為真(滿足)時,對N元素的數組X[i](i = 0,...,N-1)進行遞歸計算。當條件(X[i])變 為假時,X[i]的計算停止。該條件的示例可以是X[i]>〇。
[0006] for(i = 0 ;i<N ;i++) {
[0007] while (條件(X[i])) {
[0008] X[i]=計算(X[i]) ;}}
[0009] 如果對于X[i]的不同數據元素,WHILE循環迭代的數量不同,則以上計算無法被 輕易向量化。一種可能的方法是用處理器在不滿足條件的那些元素上執行計算,然后丟棄 從這些元素導出的結果。然而,該方法具有低效率,因為處理器不僅在這些元素上執行不必 要的計算,而且還無法利用由這些元素占據的向量寄存器槽口。
【附圖說明】
[0010] 在附圖中的諸個圖中通過示例而非限制地示出各個實施例:
[0011] 圖1是根據一個實施例的包括向量寄存器和掩碼寄存器的指令處理裝置的框圖。
[0012] 圖2是根據一個實施例的寄存器架構的框圖。
[0013] 圖3示出根據一個實施例的向量操作序列的示例。
[0014] 圖4A示出根據一個實施例的使處理器在向量寄存器和掩碼寄存器上執行操作的 指令的偽代碼示例。
[0015] 圖4B示出根據一個實施例的使用圖4A的指令的代碼段示例。
[0016] 圖5A是根據一個實施例的示出響應于使用掩碼更新指令和向量移動指令的代碼 段而執行的操作的流程圖。
[0017] 圖5B是示出根據一個實施例的響應于掩碼更新指令而執行的操作的流程圖。
[0018] 圖5C是示出根據一個實施例的響應于向量移動指令而執行的操作的流程圖。
[0019] 圖6是示出根據一個實施例的使用軟件指令轉換器將源指令集中的二進制指令 轉換成目標指令集中的二進制指令的框圖。
[0020] 圖7A是根據一個實施例的有序和無序流水線的框圖。
[0021] 圖7B是根據一個實施例的有序和無序核的框圖。
[0022] 圖8A-B是根據一個實施例的更具體的示例性有序核架構的框圖。
[0023] 圖9是根據一個實施例的處理器的框圖。
[0024] 圖10是根據一個實施例的系統的框圖。
[0025] 圖11是根據一個實施例的第二系統的框圖。
[0026] 圖12是根據本發明的實施例的第三系統的框圖。
[0027] 圖13是根據一個實施例的芯片上系統(SoC)的框圖。
【具體實施方式】
[0028] 在以下描述中,陳述了多個具體細節。然而,應當理解的是,可不通過這些具體細 節來實施本發明的實施例。在其它實例中,未詳細示出公知的電路、結構以及技術,以免模 糊對本描述的理解。
[0029] 本文所述的實施例提供用于提高獨立數據元素上的遞歸向量計算的效率的指令。 這些指令利用一對向量寄存器和一對掩碼寄存器來執行遞歸向量計算,其中第一向量寄存 器充當用于累加向量計算結果的累加器,并且第二向量寄存器提供新的數據元素以填充第 一向量寄存器的未利用槽口(未使用或已完成的數據元素位置)。掩碼寄存器用于指示相 應向量寄存器中的哪些數據元素需要進一步的計算。
[0030] 在一個實施例中,第一向量寄存器(即累加器)累加輸入數據元素,直到寄存器被 完整向量填滿。然后,處理器使用非掩碼(即,密集)向量操作在這些數據元素上執行計算。 在計算之后,累加器中的一些元素(對于這些元素,完成了計算)可以被發送回儲存器或其 它存儲位置,而其它元素(對于這些元素,未完成計算)可以被保持在累加器中用于附加數 量的迭代。累加器中已完成計算的數據元素位置可以由還需要相同遞歸計算的新數據元素 所利用。
[0031] 本文描述兩個指令RWMASKUPDATE和SPARSEM0V。這些指令在許多情況下提高向 量化的效率。例如,在一種情況下,輸入數據元素可能來自一個或多個稀疏向量數據集,每 個稀疏向量數據集不具有足以填滿整個累加器(即,第一向量寄存器)的元素。此外,來自 不同數據集的輸入數據元素在計算中可能需要不同數量的迭代。因此,由于無需更多計算 的那些數據元素,在累加器中剩余未利用的槽口。本文所述的指令允許這些未利用的槽口 被有用的元素填充,從而實現在完整向量上的遞歸計算。如在以下進一步細節中所述的, SPARSEM0V指令是將有用的數據元素(即需要計算的數據元素)從第二向量寄存器移動到 累加器中的向量移動指令。RWMASKUPDATE指令更新讀掩碼寄存器(與第二向量寄存器相關 聯)和寫掩碼寄存器(與累加器相關聯)以標識在這兩個向量寄存器中的有用數據元素的 位置。
[0032] 與SPARSEM0V相結合地使用RWMASKUPDATE可以降低遞歸計算中所需指令的總數, 并且簡化上溢和下溢情形,在上溢和下溢情形中第二向量寄存器中有用數據元素(即,源 數據元素)的數量不與第一向量寄存器中未利用槽口(即,目標位置)的數量相匹配。經 更新的讀和寫掩碼用于控制兩個向量寄存器之間的數據移動;具體而言,寫掩碼位〇用于 標識累加器中的目標位置;并且讀掩碼位1用于標識第二向量寄存器中的源數據元素。使 用反轉的寫掩碼位來標識目標位置簡化稀疏和遞歸計算的向量化中的數據累加。
[0033] 圖1是指令處理裝置115的實施例的框圖,該指令處理裝置具有執行單元140,該 執行單元包括可操作用于執行指令(包括RWMASKUPDATE和SPARSEM0V指令)的電路。在 一些實施例中,指令處理裝置115可以是處理器、多核處理器的處理器核、或者電子系統中 的處理元件。
[0034] 解碼器130接收高級機器指令或宏指令形式的傳入指令,并且解碼所述指令以生 成低級微操作、微代碼進入點、微指令或其他低級指令或控制信號,它們反映了原始的高級 指令和/或從原始的高級指令導出。低級指令或控制信號可通過低級(例如,電路級或硬 件級)操作來實現高級指令的操作。可使用各種不同的機制來實現解碼器130。合適機制 的示例包括但不限于,微代碼、查找表、硬件實現、可編程邏輯陣列(PLA)、用于實現本領域 已知的解碼器的其他機制等。
[0035] 解碼器130可接收針對高速緩存110、存儲器120或其他源的傳入指令。經解碼的 指令被發送到執行單元140。執行單元140可從解碼器130接收一個或多個微操作、微代碼 進入點、微指令、其它指令或其它控制信號,它們反映了所接收的指令或者是從所接收的指 令導出的。執行單元140從寄存器組170、高速緩存110和/或存儲器120接收數據輸入并 向它們生成數據輸出。
[0036] 在一個實施例中,寄存器組170包括架構寄存器,架構寄存器也被稱為寄存器。短 語架構寄存器、寄存器組、以及寄存器在本文中用于表示對軟件和/或編程器可見(例如, 軟件可見的)和/或由宏指令指定來標識操作數的寄存器,除非另外予以規定或清楚明顯 可知。這些寄存器不同于給定微架構中的其他非架構式寄存器(例如,臨時寄存器、重排序 緩沖器、引退寄存器等)。
[0037] 為了避免混淆描述,已示出和描述了相對簡單的指令處理裝置115。應當理解,其 他實施例可具有超過一個執行單元。例如,裝置115可包括多個不同類型的執行單元,諸如 例如算術單元、算術邏輯單元(ALU)、整數單元、浮點單元等。指令處理裝置或處理器的再 其他實施例可具有多個核、邏輯處理器或執行引擎。稍后將參考圖7-13提供指令處理裝置 115的多個實施例。
[0038] 根據一個實施例,寄存器組170包括一組向量寄存器175和一組掩碼寄存器185, 兩者存儲RWMASKUPDATE和SPARSEM0V指令的操作數。每個向量寄存器175可以是512位、 256位、或128位寬,或者可以使用不同的向量寬度。每個掩碼寄存器185包含多個掩碼位, 每個掩碼位對應于向量寄存器175之一的一個數據兀素。由于每個掩碼位用于掩碼向量寄 存器的數據元素,64位掩碼寄存器可以用于掩碼512位寄存器的六十四個8位數據元素。 對于具有不同寬度(例如256位或128位)的向量寄存器和不同尺寸(例如16位、32位或 64位)數據元素,可以結合向量操作,使用不同數量的掩碼位。
[0039] 圖2示出了支持本文描述的指令的底層寄存器架構200的實施例。寄存器架構200 基于丨ntel?酷睿(Core?)處理器,該處理器實現包括x86、MMX?、流SMD擴展(SSE)、SSE2、 SSE3、SSE4. 1和SSE4. 2指令的指令集,以及SIMD擴展的附加集,該附加集被稱為高級向量 擴展(AVX) (AVX1、和AVX2)。然而,應理解,也可使用支持不同寄存器長度、不同寄存器類型 和/或不同數量的寄存器的不同的寄存器架構。
[0040] 在所示的實施例中,存在512位寬的32個向量寄存器210 ;這些寄存器被稱為 zmmO至zmm31。低位16個zmm寄存器的低階256位覆蓋在寄存器ymm〇-16上。低位16個 zmm寄存器的低階128位(ymm寄存器的低階128位)覆蓋在寄存器xmmO-15上。在所示實 施例中,存在8個掩碼寄存器220 (k0到k7),每個掩碼寄存器的長度為64位。在一替代實 施例中,掩碼寄存器220的寬度是16位。
[0041] 在所示實施例中,寄存器架構200進一步包括16個64位通用(GP)寄存器230。 在一實施例中,上述通用寄存器沿循現有x86尋址模式被使用以對存儲器操作數尋址。該 實施例還示出RFLAGS寄存器260、RIP寄存器270和MXCSR寄存器280。
[0042]