欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

減少64位計算機程序循環(huán)中符號擴展指令的需求驅動算法的制作方法與工藝

文檔序號:12008814閱讀:329來源:國知局
減少64位計算機程序循環(huán)中符號擴展指令的需求驅動算法的制作方法與工藝
減少64位計算機程序循環(huán)中符號擴展指令的需求驅動算法相關申請的交叉引用本申請要求于2011年11月7日提交的序列號為61/556,782的美國臨時專利申請、以及于2012年10月26日提交的序列號為13/661,478的美國專利申請的優(yōu)先權。在此通過援引的方式對這些申請的每一個加以合并。技術領域本發(fā)明總地涉及計算機處理,并且更具體地,涉及減少包括在64位計算機程序的循環(huán)(loop)中的符號擴展指令的需求驅動算法。

背景技術:
開發(fā)者使用編譯器來從高級源代碼生成可執(zhí)行程序。一般地,編譯器配置為接收程序的高級源代碼(例如以C++或Java所編寫)、確定程序將在其上執(zhí)行的目標硬件平臺(例如x86處理器)、以及隨后將高級源代碼轉譯成可在目標硬件平臺上執(zhí)行的匯編級代碼。該配置提供以下優(yōu)點:使開發(fā)者能夠編寫單一高級源代碼程序以及隨后將該程序的目標定為跨多種硬件平臺而執(zhí)行,諸如移動設備、個人計算機或服務器。通常,編譯器包括三個部件:前端、中端和后端。前端配置為確保高級源代碼滿足編程語言語法和語義,于是前端單元生成高級源代碼的第一中間表示(intermediaterepresentation,IR)。中端配置為接收和優(yōu)化第一IR,其通常涉及例如如果存在任何包括在第一IR中的不可達代碼的話,移除該不可達代碼。在優(yōu)化第一IR后,中端生成第二IR用于后端來處理。具體來講,后端接收第二IR并將第二IR轉譯成匯編級代碼。匯編級代碼包括在作為目標硬件平臺的一部分的處理器上可直接執(zhí)行的低級匯編指令。在一些情況下,程序在“64位模式”下執(zhí)行,其中基本存儲器地址是64位值(例如int64變量)并且存儲器偏移是32位值(例如int32變量)。因此,典型的地址計算,例如關于特定的陣列索引,要求將32位存儲器偏移加到64位基本地址。對于實施該加法的處理器來說,該處理器必須首先將32位存儲器偏移轉換成64位存儲器偏移,使得與存儲器偏移相關聯(lián)的位數(shù)和與64位基本地址相關聯(lián)的位數(shù)對齊。這種轉換在本文稱為“符號擴展(sign-extension)”,具體來講,其涉及增加二進制數(shù)的位數(shù)同時保留數(shù)的符號(即正/負)和值。雖然符號擴展操作不是非常高成本的操作,但包括在循環(huán)中的符號擴展操作抑制重要的被稱為“循環(huán)強度縮小”的循環(huán)優(yōu)化。注意,在“64位模式”下執(zhí)行的幾乎所有代碼都包括相當多的循環(huán),這些循環(huán)的許多包括符號擴展指令。一種用于消除在循環(huán)之內(nèi)的32位變量到64位變量的符號擴展的技術,涉及通過在循環(huán)的前置頭(preheader)中實施符號擴展來在循環(huán)外將變量轉換成64位變量以及用針對所提升的變量的64位操作來替換針對初始32位變量的所有32位操作。然而該變換做出重要的假定,即沒有初始32位操作使整數(shù)溢出。該假定對于類似C和C++的普通編程語言有效,在該類語言中未定義依賴于有符號的算術運算符的溢出的任何程序。針對64位寄存器和操作沒有額外成本的架構,這種優(yōu)化總是有優(yōu)勢的。然而,針對64位寄存器和操作要求附加資源的架構,必須進行仔細的考慮,并且對選擇性地挑選該優(yōu)化的成本收益分析是可取的,這是因為64位寄存器和操作的使用可增加寄存器不足并消耗更多周期。因此,本領域所需要的是用于使用成本收益分析來識別符號擴展指令以消除的技術,以及用于針對程序的低級中間表示(IR)實施變換的方法。

技術實現(xiàn)要素:
本發(fā)明的一個實施例闡述了用于減少包括在計算機程序中的符號擴展指令(SEI)的方法。方法包括以下步驟:接收中間代碼,所述中間代碼與計算機程序相關聯(lián)并包括被包括在計算機程序內(nèi)的循環(huán)結構中的第一SEI;確定第一SEI適格被移動到循環(huán)結構之外;將第二SEI插入到循環(huán)的前置頭中,該第二SEI當由處理器所執(zhí)行時,將由第一SEI定為目標的初始值從較小類型提升到較大類型;以及用適格于附加的編譯器優(yōu)化的一個或多個中間指令替換第一SEI。所公開的實施例的一個優(yōu)點是,編譯器自動識別包括在計算機程序的循環(huán)中的符號擴展指令并在其初始被包括在其中的循環(huán)之外置換(displace)符號擴展指令。編譯器隨后修改在循環(huán)之內(nèi)的指令以說明所移除的符號擴展指令使得計算機程序的正確性保持完整。因此,處理器執(zhí)行程序所要求的時鐘周期數(shù)目可減少,這與整體功率節(jié)省直接相關。附圖說明因此,可以詳細地理解本發(fā)明的上述特征,并且可以參考實施例得到對如上面所簡要概括的本發(fā)明更具體的描述,其中一些實施例在附圖中示出。然而,應當注意的是,附圖僅示出了本發(fā)明的典型實施例,因此不應被認為是對其范圍的限制,本發(fā)明可以具有其他等效的實施例。圖1是示出了配置為實現(xiàn)本發(fā)明的一個或多個方面的計算機系統(tǒng)的框圖。圖2A-2D示出了根據(jù)本發(fā)明的一個實施例的、用于減少包括在64位計算機程序的循環(huán)中的符號擴展指令的方法步驟的流程圖。具體實施方式在下面的描述中,將闡述大量的具體細節(jié)以提供對本發(fā)明更透徹的理解。然而,本領域的技術人員應該清楚,本發(fā)明可以在沒有一個或多個這些具體細節(jié)的情況下得以實施。系統(tǒng)概述圖1為示出了配置為實現(xiàn)本發(fā)明的一個或多個方面的計算機系統(tǒng)100的框圖。計算機系統(tǒng)100包括經(jīng)由可以包括存儲器橋105的互連路徑通信的中央處理單元(CPU)102和系統(tǒng)存儲器104。存儲器橋105可以是例如北橋芯片,經(jīng)由總線或其他通信路徑106(例如超傳輸(HyperTransport)鏈路)連接到I/O(輸入/輸出)橋107。I/O橋107可以是例如南橋芯片,從一個或多個用戶輸入設備108(例如鍵盤、鼠標)接收用戶輸入并且經(jīng)由通信路徑106和存儲器橋105將該輸入轉發(fā)到CPU102。并行處理子系統(tǒng)112經(jīng)由總線或第二通信路徑113(例如外圍部件互連(PCI)Express、加速圖形端口或超傳輸鏈路)耦連到存儲器橋105;在一個實施例中,并行處理子系統(tǒng)112是將像素傳遞到顯示設備110的圖形子系統(tǒng),該顯示設備110可以是任何傳統(tǒng)的陰極射線管、液晶顯示器、發(fā)光二極管顯示器等等。系統(tǒng)盤114也連接到I/O橋107并可配置為存儲用于由CPU102和并行處理子系統(tǒng)112使用的內(nèi)容和應用和數(shù)據(jù)。系統(tǒng)盤114提供用于應用和數(shù)據(jù)的非易失性存儲并可包括固定的或可移動的硬盤驅動器、閃存設備以及CD-ROM(壓縮光盤只讀存儲器)、DVD-ROM(數(shù)字通用光盤ROM)、藍光、HD-DVD(高清晰度DVD)或其他磁式、光學或固態(tài)存儲設備。交換器116提供I/O橋107與諸如網(wǎng)絡適配器118以及各種插卡120和121的其他部件之間的連接。其他部件(未明確示出),包括通用串行總線(USB)或其他端口連接、壓縮光盤(CD)驅動器、數(shù)字通用光盤(DVD)驅動器、膠片錄制設備及類似部件,也可以連接到I/O橋107。圖1所示的各種通信路徑包括具體命名的通信路徑106和113可以使用任何適合的協(xié)議實現(xiàn),諸如PCIExpress、AGP(加速圖形端口)、超傳輸或者任何其他總線或點到點通信協(xié)議,并且如本領域已知的,不同設備間的連接可使用不同協(xié)議。在一個實施例中,并行處理子系統(tǒng)112包含經(jīng)優(yōu)化用于圖形和視頻處理的電路,包括例如視頻輸出電路,并且構成圖形處理單元(GPU)。在另一個實施例中,并行處理子系統(tǒng)112包含經(jīng)優(yōu)化用于通用處理的電路,同時保留底層(underlying)的計算架構,本文將更詳細地進行描述。在又一個實施例中,可以將并行處理子系統(tǒng)112與一個或多個其他系統(tǒng)元件集成在單個子系統(tǒng)中,諸如結合存儲器橋105、CPU102以及I/O橋107,以形成片上系統(tǒng)(SoC)。在一個實施例中,并行處理子系統(tǒng)112包括一個或多個并行處理單元(PPU),每個并行處理單元耦連到本地并行處理(PP)存儲器。通常,并行處理子系統(tǒng)112包括U個PPU,其中U>=1。在一些實施例中,并行處理子系統(tǒng)112中的一些或所有PPU是具有渲染管線的圖形處理器,其可以配置為實施與下述有關的各種操作:經(jīng)由存儲器橋105和第二通信路徑113從CPU102和/或系統(tǒng)存儲器104所供應的圖形數(shù)據(jù)生成像素數(shù)據(jù),與本地并行處理存儲器(可被用作圖形存儲器,包括例如常規(guī)幀緩沖區(qū)(buffer))交互以存儲和更新像素數(shù)據(jù),傳遞像素數(shù)據(jù)到顯示設備110等等。在一些實施例中,并行處理子系統(tǒng)112可包括一個或多個作為圖形處理器而操作的PPU以及一個或多個用于通用計算的其他PPU。這些PPU可以是同樣的或不同的,并且每個PPU可具有專用并行處理存儲器設備或不具有專用并行處理存儲器設備。應該理解,圖1的系統(tǒng)是示例性的,并且變化和修改都是可能的。連接拓撲,包括橋的數(shù)目和布置、CPU102的數(shù)目以及并行處理子系統(tǒng)112的數(shù)目,可根據(jù)需要修改。例如,在一些實施例中,系統(tǒng)存儲器104直接連接到CPU102而不是通過橋,并且其他設備經(jīng)由存儲器橋105和CPU102與系統(tǒng)存儲器104通信。在其他替代性拓撲中,并行處理子系統(tǒng)112連接到I/O橋107或直接連接到CPU102,而不是連接到存儲器橋105。而在其他實施例中,I/O橋107和存儲器橋105可能被集成到單個芯片上而不是作為一個或多個分立設備存在。大型實施例可以包括兩個或兩個以上的CPU102以及兩個或兩個以上的并行處理子系統(tǒng)112。本文所示的特定部件是可選的;例如,任何數(shù)目的插卡或外圍設備都可能得到支持。在一些實施例中,交換器116被去掉,網(wǎng)絡適配器118和插卡120、121直接連接到I/O橋107。減少包括在64位計算機程序的循環(huán)中的符號擴展指令如本文更詳細所闡述的,本發(fā)明涉及在圖1的計算機系統(tǒng)100上執(zhí)行的編譯器150。編譯器150配置為實現(xiàn)算法以簡化構成計算機程序的中間指令。具體來講,編譯器150配置為識別包括至少一個適格被移動到循環(huán)之外的符號擴展指令的中間代碼中的循環(huán)。循環(huán)以最內(nèi)層循環(huán)優(yōu)先順序處理。下面是編譯器150處理中間代碼的方式的詳細描述。圖2A-2D示出了根據(jù)本發(fā)明的一個實施例的、用于減少包括在64位計算機程序的循環(huán)中的符號擴展指令的方法步驟200的流程圖。雖然結合圖1的系統(tǒng)來描述方法步驟,但本領域的普通技術人員應理解的是,配置為以任何順序實施方法步驟的任何系統(tǒng)均在本發(fā)明的范圍內(nèi)。如圖2A所示,方法200在步驟202開始,其中編譯器150接收包括至少一個循環(huán)的計算機程序的中間代碼。在步驟204,編譯器150初始化具有(鍵)→(值)格式的(v1,<類型>)→(v2)的映射表,其中v2是v1的經(jīng)符號擴展的值并且v2類型是<類型>。“類型”的示例包括int32(即32位整數(shù))和int64(即64位整數(shù))。例如,如果v1是32位整數(shù),那么(v1,int64)→(v2)意思是v2是v1的32位整數(shù)值的64位整數(shù)表示。v2相當于v1的符號擴展并可用來代替這種符號擴展。在步驟206,編譯器150設置當前循環(huán)以最內(nèi)層循環(huán)優(yōu)先順序指向中間代碼的第一循環(huán)。在一個示例中,中間代碼如下所示:在上述示例中,中間代碼的第一循環(huán)是循環(huán)的“主體(body)”并包括6個單獨的指令。因此,在首次經(jīng)過步驟206后,當前循環(huán)指向“主體”循環(huán)。在步驟208,編譯器150確定當前循環(huán)是否包括至少一個“t1=sxt(t2)”形式的符號擴展指令(SEI)。在上述示例中,中間指令“temp1.i64=sxt(i1.i32)”滿足步驟208的標準。在該示例中,指令“temp1.i64=sxt(i1.i32)”防止表達式“4*tmp1.i64”的強度減少。因此,編譯器150的目標是修改在步驟202所接收的中間代碼,使得通過將i1.i32提升到64位值來消除“i1.i32”的符號擴展。如果在步驟208,編譯器150確定當前循環(huán)包括至少一個“t1=sxt(t2)”形式的SEI,那么方法200前進到步驟210。否則,方法200前進到圖2B的步驟218,該步驟如下文所闡述,涉及確定在中間代碼中是否包括可能包括符號擴展指令的附加的循環(huán)。在步驟210,編譯器150設置當前SEI指向當前循環(huán)的第一SEI。以上文示例繼續(xù),在首次經(jīng)過步驟210后當前SEI將指向SEI“temp1.i64=sxt(i1.i32)”。在步驟212,編譯器150確定當前SEI(即“temp1.i64=sxt(i1.i32)”)是否由當前循環(huán)的歸納變量所使用,以及確定當前SEI的t1(即“temp1.i64”)的所有使用是否是仿射的(affine)。例如,上文示例中的代碼“4*temp1.i64”是仿射使用。如果步驟212的結果為真,那么當前SEI候選以消除,并且方法200前進到步驟222,如下所述。否則方法200前進到步驟214,同樣如下所述。在步驟222,編譯器150確定當前SEI的t2操作數(shù)是否是當前循環(huán)中的葉。在一個實施例中,如果t2被定義在當前循環(huán)之外,或如果t2既不是非溢出二進制運算符、phi運算符,也不是轉換運算符(例如符號擴展或零擴展),那么t2視為當前循環(huán)的葉。如果在步驟222,編譯器150確定當前SEI的t2是當前循環(huán)的葉,那么方法222前進回到步驟214,如下所述。否則,方法200前進到步驟224,其中編譯器150將當前SEI推到SEI堆棧上。該堆棧表示要被處理的符號擴展指令的列表并使編譯器150能夠將SEI推到SEI堆棧上以及從SEI堆棧彈出SEI。以上文示例繼續(xù),堆棧成為{“tmp1.i64=sxt(i1.i32)”}并且映射表是{}。在步驟226,編譯器150確定SEI堆棧是否為空。如果在步驟226,編譯器確定SEI堆棧為空,那么方法200前進到步驟214,如下所述。否則,方法200前進到步驟228,其中編譯器150從SEI堆棧彈出臨時SEI。在步驟230,編譯器150確定臨時SEI是否是當前循環(huán)的葉。如果在步驟230,編譯器150確定臨時SEI的t2是當前循環(huán)的葉,那么方法200前進到圖2C的步驟232,如下所述。否則,方法200前進回到步驟226,如上文所述。以上文示例繼續(xù),“i1.i32”被定義在循環(huán)之內(nèi),所以“i1.i32”不視為葉。在步驟232,編譯器150確定是否1)臨時SEI是“t1=sxt(t2)”形式以及2)臨時SEI的t2是“t2=opxy”形式。如果在步驟232編譯器150確定1)臨時SEI是“t1=sxt(t2)”形式,以及2)臨時SEI的t2是“t2=opxy”形式,那么方法200前進到步驟234。否則,方法200前進回到圖2B的步驟226,如上所述。在步驟234,編譯器150確定對于鍵(x,<臨時SEI的t1的類型>)在映射表中是否存在值。以上文示例繼續(xù),t2是“i1.i32=phi(i0.i32:preheader,i2.i32:loopbody)”并且映射表為空。如果在步驟234,編譯器150確定對于鍵(x,<臨時SEI的t1的類型>)在映射表中存在值,那么方法200前進到步驟238,如下所述。否則,方法200前進到步驟236,其中編譯器150會1)將SEI“x’=sxt(x)”推到SEI堆棧上,以及2)在使用臨時SEI的t2中的x之前將x’插入到中間代碼中。在步驟238,編譯器150確定對于鍵(y,<臨時SEI的t1的類型>)在映射表中是否存在值。如果在步驟238,編譯器150確定對于鍵(y,<臨時SEI的t1的類型>)在映射表中存在值,那么方法200前進到步驟242,如下所述。否則,方法200前進到步驟240,其中編譯器150會1)將SEI“y’=sxt(y)”推到SEI堆棧上,2)在使用臨時SEI的t2中的y之前將y’插入到中間代碼中。注意,步驟240的執(zhí)行涉及將符號擴展插入到當前循環(huán)的前置頭代碼中。相應地,方法200前進到步驟242,其中編譯器150在臨時SEI的t2之后將SEI“t2'=opx’y’”插入到中間代碼中,并且更新映射表以包括映射(t2,<類型(t2’)>)→t2’。方法200隨后前進到圖2D的步驟244。以上文示例繼續(xù),SEI堆棧包含{“i0’.i64=sxt(i0.i32)”,“i2’.i64=sxt(i2.i32)”}并且映射表包含{<i1.i64>→i1’}。進一步地,中間代碼成為:如此使得“tmp1.i64”的所有使用都由“i1’.i64”所替換,并且“tmp1.i64=sxt(i1.i32)”被刪除。注意,當在使用前插入新的符號擴展指令時,phi指令被特殊對待。在phi中的使用,諸如“i0.i32:preheader”,被當做針對當前循環(huán)的前置頭塊中的最后指令的使用。在SSA表示中這是顯現(xiàn)在phi指令中的使用的標準解釋。在步驟244,編譯器150在映射表中將鍵(t2,<臨時SEI的t1的類型>)映射到t2’的值。在步驟246,編譯器150在當前循環(huán)中用t2’替換t1的所有出現(xiàn)。在步驟248,編譯器150從當前循環(huán)中移除臨時SEI。方法200隨后返回圖2B的步驟226,其中重復方法步驟228-248直到SEI堆棧為空。以上文示例繼續(xù),因為i0.i32被定義在循環(huán)之外,所以SEI“i0’.i64=sxt(i0.i32)”是葉,并且因此被方法200所忽視??商娲兀琒EI“i2’.i64=sxt(i2.i32)”適格于步驟240的操作。根據(jù)本文所述的技術,修改SEI“i2’.i64=sxt(i2.i32)”將涉及編譯器150在SEI“i2.i32=i1.i32+1”之后插入SEI“i3.i64=i1’.i64+1”、用“i3’.i64”替換“i2’.i64”的所有實例、以及刪除SEI“i2’.i64=sxt(i2.i32)”。相應地,消除所有符號擴展之后的中間代碼是:結果是,{i0,i1,i2}的32位計算提升到{i0’,i1’,i3’}的64位計算。這有利地允許后續(xù)的編譯器150優(yōu)化操作,諸如強度減少和歸納變量消除,以消除冗余的32位計算?,F(xiàn)在回到步驟208,如果編譯器150確定當前循環(huán)不包括至少一個“t1=sxt(t2)”形式的SEI,那么方法200前進到上文所述的圖2B的步驟218?,F(xiàn)在回到步驟212,如果編譯器150確定當前SEI的“t2”不是當前循環(huán)的歸納變量仿射函數(shù),那么方法200前進到步驟214,其中編譯器150確定在當前循環(huán)中是否包括附加的SEI。如果在步驟214,編譯器150確定在當前循環(huán)中包括附加的SEI,那么方法200前進到步驟216,如下文所述。否則,方法200前進到圖2B的步驟218,如上文所述。在步驟216,編譯器150設置當前SEI指向當前循環(huán)的下一個SEI。如本文先前所述,編譯器150配置為以最內(nèi)層循環(huán)優(yōu)先順序來處理循環(huán),這允許當后續(xù)處理封閉循環(huán)時消除被插入到循環(huán)前置頭中的符號擴展。在步驟218,編譯器150確定在中間代碼中是否包括附加的循環(huán)。如果在步驟218,編譯器150確定在中間代碼中包括附加的循環(huán),那么方法200前進到步驟220,如下文所述。否則,根據(jù)本文所描述的技術,由于包括在中間代碼中的每個循環(huán)已由編譯器150所檢查,所以方法200結束。在步驟220,編譯器150將當前循環(huán)設置為包括在中間代碼中的下一個循環(huán)。方法200隨后前進回到步驟208,于是根據(jù)上述描述實行后續(xù)的步驟210-248??偠灾?,本發(fā)明的實施例闡述了用于減少包括在計算機程序的循環(huán)中的SEI的技術。編譯器150接收計算機程序的中間代碼,其中中間代碼包括被包括在循環(huán)結構中的至少一個SEI。根據(jù)上文所述的方法200,編譯器150確定至少一個SEI適格被移動到循環(huán)結構之外、將補充的SEI插入到循環(huán)結構的前置頭中、以及隨后消除循環(huán)中的SEI,這使代碼適格于附加的強度減少機會。本文公開的技術的一個優(yōu)點是所編譯的中間指令由編譯器150對附加的優(yōu)化機會進行自動檢查。通過該方式,計算機程序所包括的、或當運行計算機程序時計算機程序要求處理器所執(zhí)行的指令的總數(shù)可減少,從而增加計算機程序的整體執(zhí)行效率。此外,更少或更有效率的指令致使執(zhí)行計算機程序要求更少的時鐘周期,這與整體功率節(jié)省直接相關。本發(fā)明的一個實施例可實現(xiàn)為與計算機系統(tǒng)一起使用的程序產(chǎn)品。該程序產(chǎn)品的程序定義實施例的各功能(包括本文中描述的方法)并且可以被包含在各種計算機可讀存儲介質(zhì)上。示例性計算機可讀存儲介質(zhì)包括但不限于:(i)不可寫入的存儲介質(zhì)(例如,計算機內(nèi)的只讀存儲器設備,諸如可由光盤只讀存儲器(CD-ROM)驅動器讀取的CD-ROM盤、閃存、只讀存儲器(ROM)芯片或任何類型的固態(tài)非易失性半導體存儲器),在其上永久性地存儲信息;和(ii)可寫入的存儲介質(zhì)(例如,軟盤驅動器或硬盤驅動器內(nèi)的軟盤或者任何類型的固態(tài)隨機存取半導體存儲器),在其上存儲可更改的信息。以上已參照特定實施例對本發(fā)明進行了描述。然而,本領域普通技術人員將理解的是,可對此做出各種修改和變化,而不脫離如所附權利要求中所闡述的本發(fā)明的較寬精神和范圍。因此,前面的描述以及附圖應被視為是示例性的而非限制性的意義。因此,本發(fā)明的實施例的范圍在下面的權利要求中闡述。
當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
双辽市| 军事| 德钦县| 新化县| 洛阳市| 罗江县| 鹰潭市| 大英县| 小金县| 临武县| 遵义县| 永川市| 封开县| 石门县| 通城县| 金湖县| 沧源| 扶沟县| 乌审旗| 彰化市| 石门县| 延安市| 新乡县| 林芝县| 壶关县| 方城县| 漳平市| 绍兴县| 南昌市| 方正县| 麻阳| 江口县| 东乡县| 呼伦贝尔市| 贞丰县| 恭城| 堆龙德庆县| 克拉玛依市| 山东省| 启东市| 哈尔滨市|