国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      用于存取存儲器中在未對準的地址處的數(shù)據(jù)的方法與流程

      文檔序號:11635272閱讀:389來源:國知局
      用于存取存儲器中在未對準的地址處的數(shù)據(jù)的方法與流程



      背景技術:

      本發(fā)明總體上涉及由處理器存取存儲器,且更具體地說,涉及由處理器原子地或以塊并行的方式存取存儲器中的數(shù)據(jù)塊。

      標量碼期望執(zhí)行該代碼的中央處理單元(cpu)將一起存取軟件變量的所有字節(jié)。在用于cpu的典型架構中,只要對存儲器中是正被存取的數(shù)據(jù)的大小的整數(shù)倍的邊界執(zhí)行存取,即滿足對標量碼的此種期望。當由編譯器向量化標量碼時,經常將加載及存儲指令轉換為向量加載及存儲指令。然而,向量加載指令及向量存儲指令經常不具有一致性保證,或僅在向量加載或存儲指令處于是cpu中的向量寄存器的大小的邊界上時才保證一致性。對于并非為原子的或塊并行的存取,如果一個cpu寫出數(shù)據(jù)且另一cpu同時讀取數(shù)據(jù),則讀取數(shù)據(jù)的cpu可以看到對含有后一cpu的變量的存儲器位置的部分更新。這與大部分編程語言或諸如無鎖數(shù)據(jù)結構的編程技術的語義不一致。



      技術實現(xiàn)要素:

      實施例包括用于存取存儲器中的數(shù)據(jù)的方法、系統(tǒng)及計算機程序產品。根據(jù)本發(fā)明的一個實施例,提供一種用于存取耦合至處理器的存儲器中的數(shù)據(jù)的方法。所述方法接收用于存取在所述存儲器中的一個地址處的具有第一大小的數(shù)據(jù)的存儲器引用指令。所述方法確定所述地址的對準大小。所述方法通過以塊并行的方式存取每個數(shù)據(jù)組而存取一個或多個數(shù)據(jù)組中的具有所述第一大小的所述數(shù)據(jù)。所述數(shù)據(jù)組具有是所述對準大小的倍數(shù)的大小。

      根據(jù)本發(fā)明的另一實施例,提供一種用于存取數(shù)據(jù)的系統(tǒng)。所述系統(tǒng)包括存儲器及被配置以執(zhí)行一種方法的處理器。所述方法接收用于存取在所述存儲器中的一個地址處的具有第一大小的數(shù)據(jù)的存儲器引用指令。所述方法確定所述地址的對準大小。所述方法通過以塊并行的方式存取每個數(shù)據(jù)組而存取一個或多個數(shù)據(jù)組中的具有所述第一大小的所述數(shù)據(jù)。所述數(shù)據(jù)組具有是所述對準大小的倍數(shù)的大小。

      根據(jù)本發(fā)明的另一個實施例,提供一種用于存取存儲器中的數(shù)據(jù)的計算機程序產品。所述計算機程序產品包括計算機可讀存儲介質,所述計算機可讀存儲介質具有使用其體現(xiàn)的機器指令。能夠由處理器讀取的所述機器指令引起所述處理器執(zhí)行一種方法。所述方法接收用于存取在所述存儲器中的一個地址處的具有第一大小的數(shù)據(jù)的存儲器引用指令。所述方法確定所述地址的對準大小。所述方法通過以塊并行的方式存取每個數(shù)據(jù)組而存取一個或多個數(shù)據(jù)組中的具有所述第一大小的所述數(shù)據(jù)。所述數(shù)據(jù)組具有是所述對準大小的倍數(shù)的大小。

      根據(jù)本發(fā)明的另一實施例,提供一種用于存取數(shù)據(jù)的系統(tǒng)。所述系統(tǒng)包括存儲器及被配置以執(zhí)行一種方法的處理器。所述方法接收用于存取在所述存儲器中的一個地址處的具有第一大小的數(shù)據(jù)的存儲器引用指令。所述存儲器引用指令指定所述第一大小。所述方法確定所述地址的對準大小。所述方法確定所述第一大小和所確定的對準大小的最大公約數(shù)。所述方法存取一個或多個數(shù)據(jù)組中的具有所述第一大小的所述數(shù)據(jù)。所述數(shù)據(jù)組的大小是所述最大公約數(shù)的大小的倍數(shù)。

      根據(jù)本發(fā)明的另一個實施例,提供一種用于存取存儲器中的數(shù)據(jù)的計算機程序產品。所述計算機程序產品包括計算機可讀存儲介質,所述計算機可讀存儲介質具有使用其體現(xiàn)的機器指令。能夠由處理器讀取的所述機器指令引起所述處理器執(zhí)行一種方法。所述方法接收用于存取在所述存儲器中的一個地址處的具有第一大小的數(shù)據(jù)的存儲器引用指令。所述存儲器引用指令指定所述第一大小。所述方法確定所述地址的對準大小。所述方法確定所述第一大小和所確定的對準大小的最大公約數(shù)。所述方法存取一個或多個數(shù)據(jù)組中的具有所述第一大小的所述數(shù)據(jù)。所述數(shù)據(jù)組的大小是所述最大公約數(shù)的大小的倍數(shù)。

      附圖說明

      在本說明書的結尾部分處的權利要求書中特別指出并清楚地要求保護被視為實施例的主題。實施例的前述及其他特征及優(yōu)勢自結合附圖進行的以下詳細描述顯而易見,其中:

      圖1說明根據(jù)本發(fā)明的一些實施例的具有自然對準的塊的存儲器的多個部分;

      圖2描繪根據(jù)本發(fā)明的一些實施例的被存取的存儲器的一部分;

      圖3描繪根據(jù)本發(fā)明的一些實施例的用于存取存儲器的處理流程;

      圖4描繪根據(jù)本發(fā)明的一些實施例的用于存取存儲器的處理流程;及

      圖5說明根據(jù)本發(fā)明的一些實施例的用于存取存儲器中的數(shù)據(jù)的系統(tǒng)。

      具體實施方式

      一些編程語言慣例要求由處理器(例如,中央處理單元cpu))并行地存取存儲器中的數(shù)據(jù)塊的所有字節(jié)(例如,原生型變量,諸如整數(shù)、浮點數(shù)、長整數(shù)、雙精度數(shù)等)。塊的字節(jié)被并行地存取意謂存取原始值或更新值且將不存取這兩個值的混合。舉例而言,當數(shù)據(jù)塊具有值“1234”且該值被更新至“5678”,則這兩個值中僅一個為取回的正確值??捎煞遣⑿械卮嫒?shù)據(jù)塊而產生的任何部分更新值(例如,“1278”或“5634”)為取回的不正確值。在本公開中,此并行存取要求被稱作“塊并行(blockconcurrency)”。此外,“以塊并行”方式存取存儲器或“塊并行”意謂存取存儲器中的數(shù)據(jù)的方式滿足塊并行。對于常規(guī)編程語言及處理器,僅在塊為“自然對準”時(亦即,塊的地址對應于塊的數(shù)據(jù)類型大小的倍數(shù)時)才保證用于數(shù)據(jù)塊的塊并行存取。

      向2個、4個、8個、16個及32個字節(jié)的字段給定特殊名稱。半字為兩個連續(xù)字節(jié)的組。字為四個連續(xù)字節(jié)的組。雙字為八個連續(xù)字節(jié)的組。四倍字為16個連續(xù)字節(jié)的組。八倍字為32個連續(xù)字節(jié)的組。當存儲器地址標明“自然對準的”半字、字、雙字、四倍字及八倍字時,地址的二進制表示分別含有一個、兩個、三個、四個或五個最右零位。半字、字、雙字或四倍字在本公開中被稱作塊。

      對于引用存儲器中的數(shù)據(jù)的一些指令,將對半字、字、雙字或四倍字內的所有字節(jié)的存取指定為表現(xiàn)為如由其他處理器及通道程序所觀察到的塊并行。在將取回型引用指定為表現(xiàn)為在塊內為并行時,在塊中所含的字節(jié)正由一個處理器取回的時間內,不允許另一處理器或通道程序對塊進行的存儲存取。在將存儲型引用指定為表現(xiàn)為在塊內為并行時,在塊內的字節(jié)正由一個處理器存儲的時間內,不允許另一處理器或通道程序對塊(取回型或存儲型)的存取。根據(jù)常規(guī)指令集架構,如果操作數(shù)中所指定的地址在整數(shù)邊界(integralboundary)處,則單操作數(shù)引用(例如,加載至單個寄存器的單個值或指令所使用的單個操作數(shù))具有對應于該操作數(shù)大小(亦即,正被存取的數(shù)據(jù)的大小)的塊并行。如果操作數(shù)中所指定的地址并非處于整數(shù)邊界處,則操作數(shù)是對應于僅一個字節(jié)大小的塊并行。

      對于常規(guī)處理器,字節(jié)的所有八個位始終被一起引用—這被稱作字節(jié)并行。因此,塊并行表示不同級別的字節(jié)并行。舉例而言,四字節(jié)數(shù)據(jù)塊的塊并行可被稱作四字節(jié)并行。此外,由于在通過四字節(jié)并行存取存儲器時將四字節(jié)數(shù)據(jù)塊的所有四個字節(jié)作為單個單元而并行地存取,所以兩個二字節(jié)數(shù)據(jù)塊及四個一字節(jié)塊分別為二字節(jié)并行及字節(jié)并行。

      塊并行存儲器操作亦被稱作關于存儲器引用的原子操作。如果整數(shù)塊內的所有字節(jié)被存取為如由其他處理器所見的單個單元,則存儲器引用被視為塊并行。整數(shù)塊為數(shù)據(jù)塊,所述整數(shù)塊的地址為塊的長度的整數(shù)倍。整數(shù)塊在整數(shù)邊界上—塊的第一字節(jié)的地址處于整數(shù)邊界處。

      圖1說明具有標明“自然對準的”塊的地址的存儲器的多個部分。具體地說,此圖描繪列102至112,所述列分別表示“自然對準的”半字、字、雙字、四倍字及八倍字。如所說明,將存儲器視為位的長水平字符串。位的字符串被細分成字節(jié)的單元((亦即,八個位)。通過是每個字節(jié)位置的地址的唯一非負整數(shù)識別存儲器中的該字節(jié)位置。

      列102表示具有一字節(jié)數(shù)據(jù)的塊的存儲器。列102中的每一矩形表示一字節(jié)數(shù)據(jù)的塊。每一矩形中所包括的數(shù)目為字節(jié)塊與基地址(對應于用偏移0標記的第一元素的地址)的偏移??墒褂玫刂芳芭c該地址的偏移存取每一字節(jié)(亦即,自存儲器取回或存儲至存儲器)。在一些實施例中,至少在字節(jié)級別((亦即,字節(jié)并行)以塊并行的方式存取存儲器。另外,如果正被存取的數(shù)據(jù)的第一字節(jié)的地址為對于較大塊大小的整數(shù)邊界,則對較大塊的存取相對于該塊大小可類似地為塊并行。

      列104表示具有自然對準的二字節(jié)數(shù)據(jù)的塊的存儲器。用二的倍數(shù)尋址二字節(jié)塊中的每一者,且因此所有二字節(jié)數(shù)據(jù)塊為整數(shù)塊,且可利用兩個字節(jié)的塊大小以塊并行的方式存取。同樣,列106中的四字節(jié)數(shù)據(jù)塊、列108中的八字節(jié)數(shù)據(jù)塊、列110中的16字節(jié)數(shù)據(jù)塊及列112中的32字節(jié)數(shù)據(jù)塊全部為整數(shù)塊,且可相對于四字節(jié)、八字節(jié)、16字節(jié)及32字節(jié)塊以塊并行的方式執(zhí)行對這些數(shù)據(jù)塊的存取。

      在本公開中,存儲器地址的地址對準大小為可由該地址(亦即,該地址的最大2乘冪約數(shù))尋址的最大整數(shù)塊的大小。舉例而言,地址96的地址對準大小為32(亦即,25)且地址64的地址對準大小為64(亦即,26)。在一些實施例中,通過以下步驟獲得地址的地址對準大?。簩ΧM制表示中的地址的尾隨零進行計數(shù)及接著自乘2至二進制表示中的尾隨零的乘冪,亦即,alignment_size(address)=2trailing_zeros(address),其中alignment_size()為采用地址作為輸入且輸出輸入地址的地址對準大小的函數(shù),且trailing_zeros()為采用地址作為輸入且輸出二進制表示中的地址中的尾隨零的數(shù)目的函數(shù)。舉例而言,地址96為11000002,其具有五個尾隨零。因此,地址96的地址對準大小為25或32。地址64為10000002,其具有六個尾隨零。因此,地址64的地址對準大小為26或64。

      對于常規(guī)存儲器引用指令,塊并行取決于正被引用的數(shù)據(jù)塊的第一字節(jié)的地址是否是存儲器引用大小的整數(shù)倍(亦即,第一字節(jié)的地址是否為存儲器引用大小的倍數(shù),或地址對準大小是等于還是大于存儲器引用大小)。亦即,用于常規(guī)存儲器引用指令的塊并行取決于正由指令引用的數(shù)據(jù)塊是否具有與存儲器引用大小相同的地址對準大小。舉例而言,如果常規(guī)存儲器引用指令引用八字節(jié)整數(shù)邊界(例如,由列108所表示的存儲器的部分中所展示的地址0、8、16、24等等)上的數(shù)據(jù)的八個字節(jié),則該指令為八字節(jié)并行。然而,如果常規(guī)存儲器引用指令引用四字節(jié)整數(shù)邊界(例如,由列106所表示的存儲器的部分中所展示的地址4、12、20等等)上的數(shù)據(jù)的八個字節(jié),則不保證八字節(jié)并行。這是因為當常規(guī)存儲器引用指令引用在四字節(jié)邊界處對準的存儲器中的數(shù)據(jù)的八字節(jié)塊時,不保證在一個處理器正引用八個字節(jié)時兩個四字節(jié)塊或四個二字節(jié)塊將不被另一處理器所更新。

      當正被引用的數(shù)據(jù)塊的地址不是引用該塊的指令的存儲器引用大小的整數(shù)倍時,常規(guī)指令集架構保證僅單個字節(jié)并行用于此存儲器引用(諸如用于加載至單個寄存器或自單個寄存器存儲),所述存儲器引用將來自存儲器的一個操作數(shù)提供至期望存儲器操作數(shù)的指令,等等。因此,軟件可僅依賴于常規(guī)存儲器引用,所述存儲器引用提供在存儲器引用大小處的塊并行或僅單字節(jié)并行。根據(jù)常規(guī)指令集架構,存儲器引用指令不保證塊并行的中間級別。亦即,例如,當存儲器引用大小為八字節(jié)且正被引用的數(shù)據(jù)塊在四字節(jié)邊界或二字節(jié)邊界處對準時,因為僅為整數(shù)八字節(jié)存儲器地址上的八字節(jié)(雙字)引用提供八字節(jié)并行(亦即,當?shù)刂窞榘俗止?jié)數(shù)據(jù)大小的倍數(shù)時),所以僅提供單字節(jié)并行(亦即,具有一個字節(jié)的塊大小的塊并行)或以其他方式保證單字節(jié)并行。

      在現(xiàn)代處理器中,可以以與對較小數(shù)據(jù)大小的引用相同的速度共同地執(zhí)行對于寬數(shù)據(jù)引用(例如,雙字、四倍字或八倍字)的存取。因此,當較大存儲器區(qū)域待存取、處理或復制時,希望利用適于使用較大存儲器引用大小存取、處理和/或復制存儲器的存儲器指令來存取、處理或復制大區(qū)域。因此,例如,當兩個連續(xù)字待復制時,可用單次雙字加載及單次雙字存儲替換兩次字加載及兩次字存儲,且藉此使復制操作的速度加倍。如果二字節(jié)邊界上的32個二字節(jié)變量的陣列待復制,則可采用32次半字加載及32次半字存儲來完成復制。在實施雙字存取的處理器上,一組四個半字存取各自可由單個雙字存取替換。

      本發(fā)明的實施例提供一種機制,所述機制用于當使用對于大于其各別(數(shù)據(jù)元素)整數(shù)邊界處的每一個體數(shù)據(jù)元素的大小(例如,字大小-四個字節(jié))的數(shù)據(jù)大小(例如,雙字大小-八個字節(jié))的存儲器引用復制此數(shù)據(jù)時,以及當其各別(數(shù)據(jù)元素)整數(shù)邊界(例如,地址1002)處的第一個體數(shù)據(jù)元素并未在較大數(shù)據(jù)大小整數(shù)邊界(例如,地址10002)(其對應于用于復制在其整數(shù)邊界處對準的數(shù)據(jù)元素的序列的存取大小)處對準時,利用各別個體數(shù)據(jù)元素處的塊并行復制其整數(shù)地址(例如,地址1002)處的對準數(shù)據(jù)(例如,字)的序列。

      本發(fā)明的實施例提供系統(tǒng)及方法,其即使在正被引用的數(shù)據(jù)塊的地址不是存儲器引用大小的整數(shù)倍的情況下仍提供不同級別的塊并行。在一些實施例中,指令的操作數(shù)包括多個塊并行存取,每一塊對應于其對應的整數(shù)邊界處的塊。舉例而言,如果一些實施例的存儲器引用指令引用四字節(jié)邊界(例如,由列106表示的存儲器的部分中所展示的地址1002或11002)上的八字節(jié)數(shù)據(jù),則保證對于在整數(shù)四字節(jié)邊界處對準的每一四字節(jié)塊的四字節(jié)并行。此外,也保證二字節(jié)并行,因為其由所保證的四字節(jié)并行暗示(亦即,因為四為二的倍數(shù),故在整數(shù)四字節(jié)邊界處對準的任何塊亦在整數(shù)二字節(jié)邊界處對準)。同樣,如果存儲器引用指令在具有八字節(jié)邊界(例如,由列106表示的存儲器的部分中所展示的地址10002或110002)的存儲器的地址處具有16字節(jié)的存儲器引用大小,則針對在包括16字節(jié)塊的其整數(shù)八字節(jié)、四字節(jié)、二字節(jié)及一字節(jié)塊邊界處對準的八字節(jié)、四字節(jié)、二字節(jié)及一字節(jié)塊保證八字節(jié)塊并行、四字節(jié)塊并行、二字節(jié)塊并行及單字節(jié)塊并行。亦即,保證在其整數(shù)邊界上包括被存取的16字節(jié)引用大小的任何八字節(jié)、四字節(jié)、二字節(jié)或一字節(jié)塊不包含部分更新值。

      正被引用的數(shù)據(jù)塊的地址的對準大小僅為執(zhí)行本發(fā)明的一些實施例的存儲器引用指令的處理器所提供的最小字節(jié)并行級別。亦即,在一些實施例中,單個塊并行存取可實施為結合邏輯的多個存取以確保多個此類存取展現(xiàn)塊并行行為。在一些實施例中,多個塊并行存取被實施為單個存取,所述單個存取將至少塊并行行為提供至在整數(shù)邊界處對準的所述多個存取中的每個塊。

      圖2描繪根據(jù)本發(fā)明的一些實施例的由處理器存取的存儲器200的一部分。具體地說,此圖說明具有自32至55的地址的存儲器的一部分。存儲器200具有八字節(jié)邊界(例如,高速緩存接口大小)。亦即,地址32、40及48包括邊界。

      作為一實例,根據(jù)本發(fā)明的一些實施例的存儲器引用指令具有16字節(jié)的存儲器引用大小(亦即,四倍字的大小),且16字節(jié)的此塊具有地址34(亦即,該塊的第一字節(jié)在存儲器200的地址34處)。在圖2中將這16個字節(jié)描繪為灰方框。執(zhí)行此存儲器引用指令的處理器將存取數(shù)據(jù)的16個字節(jié),同時保證二字節(jié)并行。這是因為呈二進制形式(亦即,1000102)的地址34具有一個尾隨零,且因此該地址具有兩個字節(jié)的對準大小。

      在一些實施例中,處理器可存取為對準大小的倍數(shù)的任何大小的組中的數(shù)據(jù)的16個字節(jié),只要所述組中無一者跨越存儲器的邊界。舉例而言,執(zhí)行該指令的處理器將存取具有地址34至37的四個字節(jié)、具有地址38及39的兩個字節(jié)、具有地址40至43的四個字節(jié)、具有地址44至47的四個字節(jié),及具有地址48及49的兩個字節(jié)。然而,因為存取每一組花費時間且影響性能,則執(zhí)行該指令的處理器將在避免跨越高速緩存線的同時以盡可能小的存取次數(shù)存取數(shù)據(jù)的這16個字節(jié)(亦即,此實例中的地址32、40、48)。具體地說,處理器將存取具有地址34至39直至高速緩存線地址40的前六個字節(jié)、具有地址40至47直至下一高速緩存線地址48的接下來的八個字節(jié),及具有地址48及49的接下來的兩個字節(jié)。可以以任何次序執(zhí)行這三個存取(亦即,六字節(jié)存取、八字節(jié)存取及二字節(jié)存取),以便存取所有16個字節(jié)。

      與根據(jù)本發(fā)明的一些實施例的執(zhí)行存儲器引用指令的處理器相比,執(zhí)行引用存儲器200的地址34處的數(shù)據(jù)的16個字節(jié)的常規(guī)存儲器引用指令的處理器將使用至多16個一字節(jié)存取來存取數(shù)據(jù)的16個字節(jié)。這是因為對于常規(guī)存儲器引用指令而言,16字節(jié)數(shù)據(jù)的地址不是存儲器引用大小(亦即,16個字節(jié))的整數(shù)倍,且因此僅保證字節(jié)并行。在一些情況下,執(zhí)行常規(guī)存儲器引用指令的處理器將必須在字節(jié)地址32、33及50至55處填充無意義字節(jié),以存取具有地址34至49的十六個字節(jié)而不導致對準故障。這些額外步驟將影響性能。

      除非另有說明,否則將基于根據(jù)ibm的z/architecture的例示性指令指定以下程序代碼實例。然而,本領域技術人員將理解如何使本文中的實例適于其他架構,諸如powerisa架構。ibmsystemz服務器系列的指令集(被稱為z/architecture指令集)闡述于ibm出版物z/architectureprinciplesofoperation(sa22-7832-09(2012年9月第10版)),其以全文引用的方式并入本文中。powerservers的指令集(被稱為powerisa(指令集架構))闡述于powerisa(2010年7月,版本2.06修正版b)中,其以全文引用的方式并入本文中。

      在以下例示性z/architecture指令(實例1)中,展示16次半字加載及存儲的復制循環(huán):

      lhir1,16

      xgrr3,r3

      loop:llhr2,0(r3,r4)

      sthr2,0(r3,r5)

      aghir3,2

      bctr1,loop

      其中l(wèi)hi為loadhalfwordimmediate指令,xgr為exclusiveor指令,llh為loadlogicalhalfword指令,sth為storehalfword指令,aghi為addhalfwordimmediate指令,bct為branchoncount指令,且r1至r5為寄存器。在上文并入的z/architectureprinciplesofoperation中描述這些指令的更詳細描述。

      實例1中所展示的16次半字加載及存儲可用雙字寄存器的四次加載及四次存儲替換,從而將執(zhí)行時間自對應于執(zhí)行66個指令的時間減少至對應于執(zhí)行如以下實例2中所展示的18個指令的時間:

      lhir1,4

      xgrr3,r3

      loop:lgr2,0(r3,r4)

      stgr2,0(r3,r5)

      aghir3,8

      bctr1,loop

      然而,基于復制16個半字的實例1在寄存器r4及r5中所保存的地址對應于至少為二的地址對準大小的情況下供應二字節(jié)塊并行,以及供應單字節(jié)并行(亦即,具有對應于單個字節(jié)的塊大小的塊并行)。另一方面,實例2中所展示的指令通??稍诩拇嫫鱮4及r5具有至少為四倍字的地址對準大小的情況下保證四倍字塊并行,且另外保證字節(jié)并行。因此,將指令自實例1轉換至實例2的編程器或編譯器可將實例1的塊并行保證自半字塊并行降低至對于具有小于四倍字但至少半字大小的對準地址大小的地址的僅字節(jié)并行。因此,編程器或編譯器可能隨此在其他方面有益的變化引入編程語言或編程慣例的違規(guī)。

      作為另一實例,如果二字節(jié)邊界上的32個二字節(jié)變量的陣列待復制,則將采用32次半字加載及32次半字存儲來完成復制。如果使用根據(jù)本發(fā)明的一些實施例的一次加載16個字節(jié)的單指令多數(shù)據(jù)(simd)加載,則僅需要兩次加載及兩次存儲,從而極大地減少復制的執(zhí)行時間。當在z/architecture處理器上實施此simd加載時,以下實例3中的代碼可用如以下實例4中所展示的兩個vectorload指令接著用兩個vectorstore指令替換。

      實例3展示16次半字加載及存儲的復制循環(huán):

      lhir1,16

      xgrr3,r3

      loop:llhr2,0(r3,r4)

      sthr2,0(r3,r5)

      aghir3,2

      bctr1,loop

      此復制循環(huán)可用僅向量寄存器的兩次加載及兩次存儲替換,從而將執(zhí)行時間自對應于執(zhí)行66個指令的時間減少至對應于執(zhí)行如實例4中所展示的四個指令的時間:

      vlv1,0(r4)

      vstv1,0(r5)

      vlv1,16(r4)

      vstv1,16(r5)

      其中vl為vectorload指令,vst為vectorstore指令,且v1為向量數(shù)據(jù)類型。

      然而,根據(jù)常規(guī)指令架構,基于復制16個半字的實例3在寄存器r4及r5中所保存的地址對應于至少為二的地址對準大小的情況下供應二字節(jié)塊并行,以及供應單個字節(jié)并行。另一方面,實例4通??稍诩拇嫫鱮4及r5具有至少為四倍字的地址對準大小的情況下保證四倍字塊并行,且另外保證字節(jié)并行。因此,將指令自實例3轉換至實例4的編程器或編譯器可將實例3的塊并行保證自半字塊并行降低至對于具有小于四倍字但至少半字大小的對準地址大小的地址的僅字節(jié)并行。因此,編程器或編譯器可能隨此在其他方面有益的變化引入編程語言或編程慣例的違規(guī)。

      當陣列的多個值待增加一常量時,可進行類似變換。具體地說,以下實例5展示16個半字的加法循環(huán):

      lhir1,16

      lhr7,r6

      xgrr3,r3

      loop:llhr2,0(r3,r4)

      ahr2,r6

      sthr2,0(r3,r5)

      aghir3,2

      bctr1,loop

      其中l(wèi)h為loadhalfword指令,ah為addhalfword指令,且r6及r7為寄存器。16個半字的此加法循環(huán)可用僅兩次向量加法替換,從而將執(zhí)行時間自對應于執(zhí)行83個指令的時間減少至對應于執(zhí)行如以下實例6中所展示的7個指令的時間:

      vlrephv3,0(r6)

      vlv1,0(r4)

      vahv1,v1,v3

      vstv1,0(r5)

      vlv1,16(r4)

      vahv1,v1,v3

      vstv2,16(r5)

      其中vlreph為vectorloadandreplicate指令,vah為vectoraddhalfword指令,且v1至v3為向量。

      實例5在地址r4及r5具有至少為二的地址對準大小的情況下提供對于經如此增加的每一半字的塊并行,而實例6在r4及r5具有至少為16的地址對準大小的情況下提供對于經如此增加的八個半字的組的塊并行,且另外提供僅字節(jié)并行。因此,自實例5至實例6的變換并不保留實例5的塊并行行為。

      應注意,實例4及6中所展示的向量指令不是常規(guī)存儲器引用指令而是新指令。然而,根據(jù)本文所描述的本發(fā)明的一些實施例,這些新向量指令并不具有塊并行行為。

      本發(fā)明的實施例基于被指定存儲器地址的地址對準大小提供存儲器引用指令的新定義,使得這些指令為對應于以該地址對準大小對準的地址對準大小的塊大小的子塊提供塊并行。因此,可在加載及存儲指令的新的修改后的指令定義的基礎上執(zhí)行以上三個代碼變換(自實例1至實例2、自實例3至實例4,及自實例5至實例6)。所述修改對應于本文中所描述的塊并行行為,同時使指令執(zhí)行的其他方面的行為未被修改。為了澄清,在指令的以下實例中,在操作碼的開始處用“m”指示以下例示性修改后的指令的操作碼。

      可用如以下實例7中所展示的修改后的雙字存取指令執(zhí)行具有半字塊并行的半字的復制循環(huán):

      lhir1,4

      xgrr3,r3

      loop:mlgr2,0(r3,r4)

      mstgr2,0(r3,r5)

      aghir3,8

      bctr1,loop

      在一些實施例中,實例7中的此代碼在寄存器r4及r5中所保存的地址對應于至少為二的地址對準大小的情況下供應二字節(jié)塊并行,以及供應單字節(jié)并行。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為四的地址對準大小的情況下供應四字節(jié)塊并行。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為八的地址對準大小的情況下供應八字節(jié)塊并行。

      類似地,可在加載及存儲指令的修改后的powerisa指令定義的基礎上使用powerisa表達實例7的指令。所述修改對應于本文中所描述的塊并行行為,同時使指令執(zhí)行的其他方面的行為未被修改,如由powerisa定義所指定的。又,為了澄清,在實例7的以下指令中,在操作碼的開始處用“m”指示這些修改后的指令的操作碼:

      lir1,4

      mtctrr1

      xorr3,r3,r3

      loop:mldxr2,r3,r4

      mstdxr2,r3,r5

      addir3,r3,8

      bdnzloop

      其中l(wèi)i為loadimmediate指令,mtctr為movetocountregister指令,xor為exclusiveor指令,ldx為loaddoubleword指令,stdx為storedoublewordindexed指令,addi為addimmediate指令,bdnz為branch指令,且r1至r5為寄存器。

      此外,實例4的優(yōu)化后的指令可變換為以下實例8的指令??捎萌缦碌男薷暮蟮闹噶顖?zhí)行優(yōu)化后的代碼:

      mvlv1,0(r4)

      mvstv1,0(r5)

      mvlv1,16(r4)

      mvstv1,16(r5)

      在一些實施例中,實例8的此代碼在寄存器r4及r5中所保存的地址對應于至少為二的地址對準大小的情況下供應二字節(jié)塊并行,以及供應單字節(jié)并行(亦即,具有對應于單個字節(jié)的塊大小的塊并行)。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為四的地址對準大小的情況下供應四字節(jié)塊并行。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為八的地址對準大小的情況下供應八字節(jié)塊并行。另外,在一些實施例中,在寄存器r4及r5中所保存的地址對應于至少為16的地址對準大小,在mvl及mvst的最大塊并行大小被定義為至少為16個字節(jié)的情況下,此代碼供應16字節(jié)塊并行。在一些實施例中,在寄存器r4及r5中所保存的地址對應于至少為16的地址對準大小,在mvl及mvst的最大塊并行大小被定義為至少為八個字節(jié)的情況下,此代碼供應八字節(jié)塊并行。

      類似地,可使用修改后的powerisa定義將實例7的代碼表達為以下實例8:

      lir1,16

      mlxvxv1,r0,r4

      mstxvxv1,r0,r5

      mlxvxv1,r1,r4

      mstxvxv1,r1,r5

      類似地,實例6可表達為以下實例9:

      vlrephv3,0(r6)

      mvlv1,0(r4)

      vahv1,v1,v3

      mvstv1,0(r5)

      mvlv1,16(r4)

      vahv1,v1,v3

      mvstv2,16(r5)

      在一些實施例中,實例9的代碼在寄存器r4及r5中所保存的地址對應于至少為二的地址對準大小的情況下供應二字節(jié)塊并行,以及供應單字節(jié)并行(亦即,具有對應于單個字節(jié)的塊大小的塊并行)。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為四的地址對準大小的情況下供應四字節(jié)塊并行。另外,在一些實施例中,此代碼在寄存器r4及r5中所保存的地址對應于至少為八的地址對準大小的情況下供應八字節(jié)塊并行。另外,在一些實施例中,在寄存器r4及r5中所保存的地址對應于至少為16的地址對準大小,在mvl及mvst的最大塊并行大小被定義為至少為16個字節(jié)的情況下,此代碼供應16字節(jié)塊并行。在一些實施例中,在寄存器r4及r5中所保存的地址對應于至少為16的地址對準大小,在mvl及mvst的最大塊并行大小被定義為至少為八個字節(jié)的情況下,此代碼供應八字節(jié)塊并行。

      在一些實施例中,修改現(xiàn)有指令及操作碼,且不引入用于所述指令的新助記符。在其他實施例中,基于本文中所描述的地址對準大小,利用塊并行的教導引入新指令及操作碼。

      圖3描繪根據(jù)本發(fā)明的一些實施例的用于存取存儲器的處理流程。在一些實施例中,處理器(例如cpu)執(zhí)行圖3中所展示的處理流程。在方框305處,處理器接收引用在存儲器的一個地址處的數(shù)據(jù)塊的存儲器引用指令。存儲器引用指令包括引用存儲器中的數(shù)據(jù)塊的任何指令(例如,包括存儲器中作為操作數(shù)的地址的指令)。此類指令包括加載指令及存儲指令以及用于算術運算的指令(例如,相加指令、減去指令、比較指令等)。

      在決策方框310處,處理器可選地判定處理器自其引用數(shù)據(jù)的存儲器是否具有大于或等于由在方框305處接收的存儲器引用指令所支持的最大塊并行存儲器引用大小(或最大塊并行大小)的存儲器地址邊界(亦即,在存儲器引用指令中所指定的地址的地址對準大小)。針對指令集架構的所有指令定義指令的最大存儲器引用大小。最大塊并行存儲器引用大小可為指令的存儲器引用的大小或可對應于針對指令集架構的所有指令所定義的最大塊并行引用大小。在一些實施例中,最大塊并行存儲器引用大小可為指令的存儲器引用的大小或可對應于獨立地針對指令集架構的每一指令所定義的最大塊并行存儲器引用大小。

      響應于在決策方框310處判定存儲器地址邊界不大于或等于最大塊并行存儲器引用大小,處理器繼續(xù)進行至決策方框320,其將在下文得以進一步描述。響應于在決策方框310處判定存儲器地址邊界大于或等于最大塊并行存儲器引用大小,處理器繼續(xù)進行至方框315以利用最大塊并行存儲器引用大小下的塊并行存取存儲器。舉例而言,當存儲器引用大小為32字節(jié)且存儲器地址邊界為16字節(jié),但最大塊并行存儲器引用大小為八字節(jié)時,處理器利用八字節(jié)并行存取存儲器。

      在決策方框320處,處理器判定所請求的存儲器地址的對準大小是否為2的n次冪(亦即,2n),其中n為使2n小于或等于存儲器引用大小的最大非負整數(shù)。舉例而言,當存儲器引用大小為36個字節(jié)時,在決策方框320處,處理器判定所請求的存儲器地址是否具有32個字節(jié)(25字節(jié))的對準大小。響應于判定所請求的存儲器地址對準大小為2的n次冪,處理器繼續(xù)進行至方框325以利用2n字節(jié)并行存取存儲器。舉例而言,如果存儲器地址對準大小為32字節(jié)且存儲器引用大小為32字節(jié),則處理器以塊并行的方式一起存取存儲器的32個字節(jié)以存取所有32個字節(jié)。響應于判定所請求的存儲器地址對準并非2的n次冪,處理器繼續(xù)進行至方框330。如上文所描述,可針對一個或多個指令設定最大塊并行存儲器引用大小。在一些實施例中,將n設定為使得2n小于或等于最大塊并行存儲器引用大小的最大非負整數(shù)而不考慮存儲器引用大小。舉例而言,指令可提供八個字節(jié)的最大塊并行存儲器引用大小。隨后,即使存儲器引用大小大于23,仍將n設定為3。

      在決策方框330處,處理器判定所請求的存儲器地址對準大小是否為2的(n-1)次冪(亦即,2(n-1))。舉例而言,當存儲器引用大小為32個字節(jié)(25個字節(jié))時,在方框330處,處理器判定所請求的存儲器地址對準大小是否為16個字節(jié)(24個字節(jié))。響應于判定所請求的存儲器地址對準大小為2的(n-1)次冪,處理器繼續(xù)進行至方框335以利用2(n-1)字節(jié)并行存取存儲器。舉例而言,如果存儲器引用大小為32個字節(jié)(25個字節(jié)),則處理器以塊并行的方式一次存取存儲器的16個字節(jié)(24個字節(jié))以存取所有32個字節(jié)。

      響應于判定所請求的存儲器地址對準大小并非2的(n-1)次冪,處理器以類似方式繼續(xù)進行至決策方框340直至在決策方框340處將所請求的存儲器地址對準大小判定為2的一次冪(亦即,21個字節(jié))。響應于判定所請求的存儲器地址對準大小為2,處理器繼續(xù)進行至方框345以利用二字節(jié)并行存取存儲器。舉例而言,如果存儲器引用大小為32字節(jié),則處理器以塊并行的方式一次存取存儲器的二個字節(jié)以存取所有32個字節(jié)。響應于在決策方框340處判定所請求的存儲器地址對準大小并非為2,處理器繼續(xù)進行至方框350以利用一字節(jié)并行存取存儲器。亦即,處理器一次存取一個字節(jié)以存取由存儲器引用指令所指定的所有字節(jié)。

      應認識到,在方框320至350處,在所請求的存儲器地址對準大小小于存儲器引用指令的存儲器引用大小時,處理器利用所請求的存儲器地址對準大小下的塊并行存取存儲器。亦即,在一些實施例中,執(zhí)行存儲器引用指令的處理器表現(xiàn)得如同存取對于所請求的數(shù)據(jù)塊的地址被對準到的任何邊界均是塊并行(亦即,存取在任何對準大小下為塊并行)一樣。

      在一些實施例中,存儲器引用指令的存儲器引用大小由(例如)指令的操作碼(操作代碼)所暗示。這是因為指令的操作碼指示正被引用的數(shù)據(jù)的數(shù)據(jù)類型以及將執(zhí)行的操作。備選地或結合地,在一些實施例中,可定義存儲器引用指令以顯式地(例如)在指令的操作數(shù)中指定存儲器引用大小。舉例而言,指令的操作數(shù)指定將取回或存儲的最高索引字節(jié)。這允許編程器指定存儲器引用大小。在一些情況下,被指定的存儲器引用大小可以不是2的乘冪(例如,10個字節(jié)),且可以不與操作碼暗示的存儲器引用大小相匹配。

      本發(fā)明的實施例提供在所指定的存儲器引用大小與所請求的存儲器的地址邊界不相同時提供塊并行的系統(tǒng)及方法。在一些實施例中,當在存儲器引用指令中指定存儲器引用大小時,執(zhí)行指令的處理器使用存儲器的所請求地址的地址邊界與所指定的存儲器引用大小的最大公約數(shù)作為塊并行數(shù)據(jù)存取大小。舉例而言,如果指令的操作數(shù)地址在四字節(jié)邊界上且所指定的存儲器引用大小為10字節(jié),則數(shù)據(jù)存取對其他處理器表現(xiàn)為至少為二字節(jié)并行,因為2為10與4的最大公約數(shù)。這考慮到以與標量碼相同的方式起作用的數(shù)據(jù)平行碼且不破壞任何編程語言語義或慣例。

      在一些實施例中,直接自地址對準大小導出塊并行的塊大小(亦即,塊并行的級別,例如,2字節(jié)并行、4字節(jié)并行、16字節(jié)并行、32字節(jié)并行)。在其他實施例中,塊并行存取的塊并行大小基于指令的地址對準大小及存儲器引用大小兩者。在一些此類實施例中,塊并行存取的塊大小為直接自地址對準及存儲器引用的大小導出的塊并行的塊大小的最小值。又在其他實施例中,由地址對準大小與存儲器引用大小之間共同的最大2乘冪塊大小確定用于塊并行存取的塊大小,如圖4中所進一步展示。

      圖4描繪用于在塊并行存取的塊大小基于存儲器引用指令的地址對準大小及存儲器引用大小兩者時存取存儲器的處理流程。在一些實施例中,可將塊并行存取的最大塊大小強加至所有指令(通過指令集架構)或強加至具有最大塊并行大小的特定指令。一些存儲器引用指令顯式地指定存儲器引用大小,且其可不為2的乘冪。然而,一些實施可僅允許2的乘冪的塊并行大小。在一些此類實施例中,處理器(例如,cpu)執(zhí)行圖4中所展示的處理流程。

      在方框405處,處理器接收引用在存儲器的一個地址處的數(shù)據(jù)塊的存儲器引用指令。此存儲器引用指令亦(例如)在指令的操作數(shù)中指定將引用的數(shù)據(jù)的大小。

      在決策方框410處,處理器可選地判定處理器自其引用數(shù)據(jù)的存儲器是否具有大于或等于在方框405處接收的存儲器引用指令的最大塊并行存儲器引用大小的存儲器地址對準大小。響應于判定存儲器地址對準大小不大于或等于最大塊并行存儲器引用大小,處理器繼續(xù)進行至決策方框420,其將在下文得以進一步描述。響應于判定存儲器地址對準大小大于或等于所指定的存儲器引用大小,處理器繼續(xù)進行至方框415以利用最大塊并行存儲器引用大小下的塊并行存取存儲器。舉例而言,當所指定的存儲器引用大小為八字節(jié)且存儲器地址對準大小為八字節(jié),但最大塊并行存取大小為4字節(jié)時,處理器利用四字節(jié)并行存取存儲器。

      在決策方框420處,處理器判定所請求的存儲器地址對準大小是否為2的n次冪(亦即,2n),其中n為使2n小于或等于所指定的存儲器引用大小的最大非負整數(shù)。舉例而言,當所指定的存儲器引用大小為十字節(jié)時,在方框415處,處理器判定所請求的存儲器地址是否對準到八個(23個)字節(jié)。響應于在決策方框420處判定所請求的存儲器地址對準大小不是2的n次冪,處理器繼續(xù)進行至決策方框435,其將在下文得以進一步描述。

      響應于在決策方框420處判定所請求的存儲器地址對準大小為2的n次冪,處理器繼續(xù)進行至決策方框425以判定所指定的存儲器引用大小是否為2的n次冪的倍數(shù)。舉例而言,當所指定的存儲器引用大小為十個字節(jié)時,在決策方框425處,處理器判定所指定的存儲器引用大小十是否為八個字節(jié)的倍數(shù)。如果所指定的存儲器引用大小不是2的n次冪的倍數(shù),則處理器繼續(xù)進行至決策方框440,其將在下文得以進一步描述。如果所指定的存儲器引用大小為2的n次冪,則處理器繼續(xù)進行至方框430以利用2n字節(jié)并行存取存儲器。

      在決策方框435處,處理器判定所請求的存儲器地址對準大小是否為2的(n-1)次冪(亦即,2(n-1))。舉例而言,當存儲器引用大小為十個字節(jié)時,在決策方框435處,處理器判定所請求的存儲器地址對準大小是否為四個字節(jié)(亦即,22個字節(jié))。響應于判定所請求的存儲器地址對準大小不是2的(n-1)次冪,處理器朝向決策方框450繼續(xù)進行,其將在下文得以進一步描述。

      響應于在決策方框435處判定所請求的存儲器地址對準大小為2的(n-1)次冪,處理器繼續(xù)進行至決策方框440以判定所指定的存儲器引用大小是否為2的(n-1)次冪的倍數(shù)。舉例而言,當所指定的存儲器引用大小為十個字節(jié)時,在決策方框440處,處理器判定所指定的存儲器引用大小十是否為四個字節(jié)(22個字節(jié))的倍數(shù)。如果所指定的存儲器引用大小不是2的(n-1)次冪的倍數(shù),則處理器朝向決策方框455繼續(xù)進行,其將在下文得以進一步描述。如果所指定的存儲器引用大小為2的(n-1)次冪,則處理器繼續(xù)進行至方框445以利用2(n-1)字節(jié)并行存取存儲器。

      響應于在決策方框435處判定所請求的存儲器地址對準大小不是2的(n-1)次冪,處理器以類似方式朝向方框450繼續(xù)進行直至在方框450處將所請求的存儲器地址對準大小判定為2的一次冪(亦即,21)。響應于在決策方框450處判定所請求的存儲器地址對準大小不是2,處理器在方框465處利用一字節(jié)并行存取存儲器。亦即,處理器一次存取一個字節(jié)以存取由存儲器引用指令所指定的所有字節(jié)。

      響應于在決策方框450處判定所請求的存儲器地址對準大小為2,處理器繼續(xù)進行至決策方框455以判定所指定的存儲器引用大小是否為兩個字節(jié)的倍數(shù)。如果所指定的存儲器引用大小不是2的倍數(shù),則處理器繼續(xù)進行至方框465以利用一字節(jié)并行存取存儲器。如果所指定的存儲器引用大小為2的倍數(shù),則處理器繼續(xù)進行至方框460以利用二字節(jié)并行存取存儲器。舉例而言,如果存儲器引用大小為十個字節(jié),則處理器一次存取存儲器的兩個字節(jié),以存取所有十個字節(jié)。

      應認識到,在方框420至465處,處理器以字節(jié)數(shù)目識別所請求的存儲器地址對準大小與所指定的存儲器引用大小的最大公約數(shù),且利用所述最大公約數(shù)下的塊并行存取存儲器。舉例而言,當所指定的存儲器引用大小為十個字節(jié)且所請求的存儲器地址對準大小為四個字節(jié)時,處理器識別最大公約數(shù)(其為兩個字節(jié))且利用二字節(jié)并行存取存儲器(亦即,藉由以塊并行的方式一次存取兩個字節(jié)來存取所有十個字節(jié))。

      在一些實施例中,可針對一個或多個指令設定最大塊并行大小。舉例而言,指令可提供八個字節(jié)的最大塊并行大小。隨后,在決策方框420處,即使所指定的存儲器引用大小大于23,仍將n設定為3。在一些實施例中,最大塊并行大小適用于所有指令。在其他實施例中,每一指令可具有單獨的最大塊并行大小。

      圖5說明根據(jù)本發(fā)明的一些實施例的用于存取存儲器中的數(shù)據(jù)的系統(tǒng)500。具體地說,此圖說明系統(tǒng)500包括存儲器505及多個處理器510及515,以及為說明及描述的簡單起見而未描繪的其他組件。存儲器505及處理器510及515經由一個或多個總線520彼此耦合。處理器510及515被示為分別具有寄存器525及530,但為說明及描述簡單起見而未描繪處理器內的其他組件(例如,算術邏輯單元、控制單元、時鐘、內部總線等)。

      在一些實施例中,系統(tǒng)500表示各種平行處理環(huán)境。舉例而言,處理器510及515中的一者可為執(zhí)行向量化指令的向量處理器。其他處理器中的一者可為執(zhí)行標量指令的標量處理器。向量處理器及標量處理器可共享存儲器505。作為另一實例,系統(tǒng)500可表示多核處理器,其中處理器510及515為共享存儲器505的不同核心。作為又一實例,系統(tǒng)500可表示具有以平行方式進行處理的處理器510及515的大型計算機系統(tǒng)。

      如本領域中已知的,處理器或處理器系列(諸如,8086及x86系列或ibmsystemz服務器系列的那些處理器)具有其自己的機器指令集。舉例而言,ibmsystemz服務器系列的指令集(被稱為z/architecture指令集)闡述于以上并入的z/architectureprinciplesofoperation,且powerservers的指令集(被稱為powerisa(指令集架構))闡述于以上并入的powerisa中。機器指令是按照設計對應于至機器的不同命令的位模式。在大多數(shù)情況下,指令集特定于使用同一架構的一類處理器。多數(shù)指令具有:一個或多個操作碼,其指定基本指令類型(諸如,算術、存儲器引用、分支等)及實際操作(諸如,加載、存儲、相加或比較),及其他字段,其可給定一個或多個操作數(shù)、一個或多個尋址模式、一個或多個尋址偏移或索引的類型或實際值本身。亦即,每一機器指令用于在寄存器或存儲器中的數(shù)據(jù)單元上執(zhí)行非常特定的任務,諸如加載、分支或算術邏輯單元(alu)操作。這些機器指令中的一些機器指令是存儲器引用指令,其引用存儲器505中的特定地址處的數(shù)據(jù)以自存儲器530或寄存器取回數(shù)據(jù)或將數(shù)據(jù)存儲至存儲器530或寄存器。

      處理器510及515可被配置以執(zhí)行存儲器引用指令,所述存儲器引用指令即使在存儲器505內的數(shù)據(jù)塊的地址不是存儲器引用指令的存儲器引用大小的整數(shù)倍的情況下仍提供塊并行。亦即,在一些實施例中,處理器510及515的存儲器引用指令將表現(xiàn)得如同所述指令對于所請求的數(shù)據(jù)塊的地址被對準到的任何邊界均是塊并行一樣。在一些實施例中,存在最大八字節(jié)并行。在一些實施例中,處理器以字節(jié)數(shù)目識別存儲器地址對準大小與所指定的存儲器引用大小的最大公約數(shù),且利用所述最大公約數(shù)下的塊并行存取存儲器505。因此,可改進包括處理器510及515的計算機的功能。

      不同實施例以不同方式配置處理器510及515。舉例而言,在一些實施例中,根據(jù)本發(fā)明的各種實施例,可通過將新定義提供至現(xiàn)有的常規(guī)存儲器引用指令來配置處理器510及515,以使得處理器510及515在執(zhí)行指令時存取存儲器505。備選地或結合地,根據(jù)本發(fā)明的各種實施例,可通過定義存取存儲器505的新存儲器引用指令來配置處理器510及515。

      舉例而言,存儲器引用指令包括向量加載指令,其經常具有16字節(jié)對準要求。亦即,預期具有16字節(jié)對準要求的向量加載指令將16字節(jié)數(shù)據(jù)塊的所有16個字節(jié)作為單個單元來從存儲器加載。當由編譯器向量化多線程代碼以(例如)允許數(shù)據(jù)平行執(zhí)行時,假定如果一個變量由第一cpu更新及由第二cpu讀取,則第二cpu將看見該變量的整體變化且從不使結果混淆。利用常規(guī)向量加載指令定義不能保證塊并行。因此,常常難以在亦使用線程平行性時使用更大程度的數(shù)據(jù)平行性。這限制潛在的軟件性能且導致硬件未得到充分利用。

      通過根據(jù)本發(fā)明的各種實施例配置處理器以存取存儲器,處理器可在使用線程平行性時使用更大程度的數(shù)據(jù)平行性,而無需外部串行化(例如,鎖)。根據(jù)本發(fā)明的實施例被配置的處理器亦改進軟件性能且促進硬件的利用。本發(fā)明的實施例允許較小數(shù)據(jù)類型被封裝至向量中且對其他處理器表現(xiàn)為利用與在使用標量指令時相同的語義進行操作。此外,塊并行通過避免額外對準限制及對額外程序代碼的需要而允許編譯器對代碼的更簡單的自動平行化,以處置可能未被對準的數(shù)據(jù)部分。

      在本發(fā)明的一些實施例中,提供一種用于存取耦合至處理器的存儲器中的數(shù)據(jù)的方法。所述方法接收用于存取在所述存儲器中的一個地址處具有第一大小的數(shù)據(jù)的存儲器引用指令。所述方法確定所述地址的對準大小。所述方法通過以塊并行的方式存取每個數(shù)據(jù)組而存取一個或多個數(shù)據(jù)組中的具有第一大小的數(shù)據(jù)。所述數(shù)據(jù)組具有是所述對準大小的倍數(shù)的大小。所述方法通過對二進制表示中的地址中的尾隨零的數(shù)目進行計數(shù)來確定對準大小。每個數(shù)據(jù)組在字節(jié)方面不大于預定義最大塊并行大小。在一些實施例中,所述第一大小大于所確定的對準大小。在一些實施例中,所述第一大小及所確定的對準大小是字節(jié)的數(shù)目,其中所述第一大小為2a且所確定的對準大小為2b,其中a為大于b的整數(shù),b為非負整數(shù)。在一些實施例中,所述方法基于存儲器引用指令的操作碼確定所述第一大小。在一些實施例中,所述處理器包括向量處理器,且所述存儲器引用指令包括向量指令。

      在本發(fā)明的一些實施例中,提供一種用于存取耦合至處理器的存儲器中的數(shù)據(jù)的方法。所述方法接收用于存取在所述存儲器中的一個地址處具有第一大小的數(shù)據(jù)的存儲器引用指令。存儲器引用指令指定所述第一大小。所述方法確定所述地址的對準大小。所述方法確定所述第一大小及所確定的對準大小的最大公約數(shù)。所述方法存取一個或多個數(shù)據(jù)組中的具有第一大小的數(shù)據(jù)。所述數(shù)據(jù)組的大小是最大公約數(shù)的大小的倍數(shù)。在一些實施例中,所述第一大小大于所確定的對準大小。在一些實施例中,所述第一大小及所確定的對準大小是字節(jié)的數(shù)目,其中所述第一大小不是2的乘冪的大小,且所確定的對準大小是2的乘冪的大小。在一些實施例中,所述方法基于存儲器引用指令的操作數(shù)確定所述第一大小。在一些實施例中,所述處理器包括向量處理器,且所述存儲器引用指令包括向量指令。

      本發(fā)明可為一種系統(tǒng)、方法和/或計算機程序產品。計算機程序產品可包括計算機可讀存儲介質(或多個介質),其上具有計算機可讀程序指令以用于使處理器執(zhí)行本發(fā)明的方面。

      計算機可讀存儲介質可為有形器件,其可保留及存儲指令以供指令執(zhí)行設備使用。計算機可讀存儲介質可為(例如但不限于)電子存儲器件、磁性存儲器件、光學存儲器件、電磁存儲器件、半導體存儲器件或前述各者的任何合適組合。計算機可讀存儲介質的更特定實例的非窮盡性列表包括以下各者:便攜式計算機磁盤、硬盤、隨機存取存儲器(ram)、只讀存儲器(rom)、可擦除可編程只讀存儲器(eprom或閃存)、靜態(tài)隨機存取存儲器(sram)、便攜式光盤只讀存儲器(cd-rom)、數(shù)字化通用光盤(dvd)、記憶棒、軟盤、機械編碼的器件(諸如其上記錄有指令的打孔卡或凹槽中的凸起結構)及前述各者的任何合適組合。如本文中所使用,不將計算機可讀存儲介質本身理解為暫時性信號,諸如無線電波或其他自由傳播的電磁波、經由波導或其他傳輸介質傳播的電磁波(例如,經由光纜傳遞的光脈沖),或經由導線傳輸?shù)碾娦盘枴?/p>

      本文中所描述的計算機可讀程序指令可經由網絡(例如,因特網、局域網絡、廣域網和/或無線網絡)自計算機可讀存儲介質下載至各別計算/處理器件或下載至外部計算機或外部存儲器件。網絡可包括銅傳輸線纜、光學傳輸光纖、無線傳輸、路由器、防火墻、交換機、網關計算機和/或邊緣服務器。每一計算/處理器件中的網絡適配卡或網絡接口自網絡接收計算機可讀程序指令且轉發(fā)計算機可讀程序指令以用于存儲于各別計算/處理器件內的計算機可讀存儲介質中。

      用于執(zhí)行本發(fā)明的操作的計算機可讀程序指令可為以一種或多種編程語言的任何組合撰寫的編譯器指令、指令集合架構(isa)指令、機器指令、機器相關指令、微碼、固件指令、狀態(tài)設定數(shù)據(jù)或源代碼或目標程序代碼,所述一種或多種編程語言包括諸如smalltalk、c++或其類似者的面向對象式編程語言,及諸如“c”編程語言或類似編程語言的常規(guī)程序編程語言。計算機可讀程序指令可完全在用戶的計算機上執(zhí)行、部分地在用戶的計算機上執(zhí)行、作為獨立軟件包執(zhí)行、部分地在用戶的計算機上執(zhí)行且部分地在遠程計算機上執(zhí)行或完全在遠程計算機或服務器上執(zhí)行。在后種情形中,遠程計算機可經由任一類型的網絡(包括局域網絡(lan)或廣域網(wan))連接至用戶的計算機,或可(例如,經由使用因特網服務提供商的因特網)連接至外部計算機。在一些實施例中,電子電路(包括例如可編程邏輯電路、場可編程門陣列(fpga)或可編程邏輯陣列(pla))可通過利用計算機可讀程序指令的狀態(tài)信息來個性化電子電路而執(zhí)行計算機可讀程序指令,以執(zhí)行本發(fā)明的方面。

      本文參考根據(jù)本發(fā)明的實施例的方法、裝置(系統(tǒng))及計算機程序產品的流程圖說明和/或方塊圖描述本發(fā)明的方面。應理解,可通過計算機可讀程序指令實施流程圖說明和/或方塊圖的每一塊,及流程圖說明和/或方塊圖中的塊的組合。

      可將這些計算機可讀程序指令提供至通用計算機、專用計算機或其他可編程數(shù)據(jù)處理裝置的處理器以產生機器,以使得經由所述計算機或其他可編程數(shù)據(jù)處理裝置的處理器執(zhí)行的指令創(chuàng)建用于實施一個或多個流程圖和/或方塊圖塊中所指定的功能/動作的部件。亦可將這些計算機可讀程序指令存儲于計算機可讀存儲介質中,所述指令可引導計算機、可編程數(shù)據(jù)處理裝置和/或其他器件以特定方式工作,使得其中存儲有指令的計算機可讀存儲介質包括制品,所述制品包括實施一個或多個流程圖和/或方塊圖塊中指定的功能/動作的方面的指令。

      計算機可讀程序指令亦可加載至計算機、其他可編程數(shù)據(jù)處理裝置或其他器件上,以使一系列操作步驟在所述計算機、其他可編程裝置或其他器件上執(zhí)行以產生計算機實施的處理,使得在所述計算機、其他可編程裝置或其他器件上執(zhí)行的指令實施一個或多個流程圖和/或方塊圖塊中所指定的功能/動作。

      附圖中的流程圖及方塊圖說明根據(jù)本發(fā)明的各種實施例的系統(tǒng)、方法及計算機程序產品的可能實施方式的架構、功能性及操作。就此而言,流程圖或方塊圖中的每一塊可表示指令的模塊、段或部分,其包括用于實施指定邏輯功能的一個或多個可執(zhí)行指令。在一些備選實施方式中,塊中提及的功能可不按圖中所提及的次序發(fā)生。舉例而言,取決于所涉及的功能性,以連續(xù)方式展示的兩個塊實際上可基本并行地執(zhí)行,或所述塊有時可以以相反次序執(zhí)行。亦將注意,可由執(zhí)行指定功能或動作或進行專用硬件及計算機指令的組合的基于硬件的專用系統(tǒng)實施方塊圖和/或流程圖說明的每一塊,及方塊圖和/或流程圖說明中的塊的組合。

      已出于說明目的呈現(xiàn)本發(fā)明的各個實施例的描述,但所述描述并不意欲為窮舉的或限于所揭示的實施例。在不背離所描述實施例的范圍及精神的情況下,對于本領域技術人員而言,許多修改及變化將顯而易見。本文中所使用的術語經選擇以最佳解釋實施例的原理、實際應用或相較于市場中發(fā)現(xiàn)的技術的技術改進,或使得本領域技術人員能夠理解本文中所揭示的實施例。

      當前第1頁1 2 
      網友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1