TWI446267B - 用於以編譯器為基礎之非葉程式碼之向量化的系統及方法 - Google Patents

用於以編譯器為基礎之非葉程式碼之向量化的系統及方法 Download PDF

Info

Publication number
TWI446267B
TWI446267B TW100134227A TW100134227A TWI446267B TW I446267 B TWI446267 B TW I446267B TW 100134227 A TW100134227 A TW 100134227A TW 100134227 A TW100134227 A TW 100134227A TW I446267 B TWI446267 B TW I446267B
Authority
TW
Taiwan
Prior art keywords
function
call
compiler
dependency
code
Prior art date
Application number
TW100134227A
Other languages
English (en)
Other versions
TW201224933A (en
Inventor
Jeffry E Gonion
Original Assignee
Apple Inc
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
Priority claimed from US12/888,644 external-priority patent/US8621448B2/en
Priority claimed from US12/888,658 external-priority patent/US8949808B2/en
Application filed by Apple Inc filed Critical Apple Inc
Publication of TW201224933A publication Critical patent/TW201224933A/zh
Application granted granted Critical
Publication of TWI446267B publication Critical patent/TWI446267B/zh

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Description

用於以編譯器為基礎之非葉程式碼之向量化的系統及方法
本發明係關於電腦系統,且更特定言之,係關於用於實現軟體應用程式之通用向量化的系統及方法。
典型的軟體開發範例為熟知的。電腦程式設計者用高階程式設計語言(例如,Rasic、C++等)來撰寫原始程式碼。在某些時候,程式設計者使用編譯器將原始程式碼轉變為目的程式碼。在經轉變為可執行程式碼(例如,在連結或其他編譯階段或執行階段處理之後),所得目的程式碼可接著由電腦或計算裝置執行。
電腦現具有多個處理單元且能夠並列地執行指令。為了利用此架構,現代編譯器可試圖「並列化」或「向量化」某些軟體函式以使得替代使單一處理單元順序地一次執行一個指令,多個處理單元可同時執行指令。
在編譯處理程序期間,編譯器分析軟體函式以判定是否存在任何向量化障礙。一個此種障礙為(例如)真實資料相依性之存在。此情況發生在當前指令參考經由執行先前指令所獲得的資料時。在彼種狀況下,後一指令僅可在前一指令之後進行,且因此兩個指令不能並列地執行。另一潛在障礙為函式呼叫之存在。舉例而言,若待編譯之函式呼叫外部函式,則編譯器可能不能夠向量化該呼叫函式。
本發明提供用於實現軟體應用程式之通用向量化的系統 及方法。為此,本文中所揭示之系統及方法提供擴充編譯器之向量化函式之能力之相依性及/或介面的表達。
在一非限制性實施例中,一編譯器可在函式(「被呼叫函式」)之編譯期間檢查該函式內之記憶體及/或資料相依性,且在相依性資料庫(諸如,相依性檔案)中表達彼等相依性。一旦經編譯,則被呼叫函式可成為(例如)程式庫函式或其類似者。在稍後時間,可產生另一函式(「呼叫函式」)以使得其呼叫該被呼叫函式。在呼叫函式之編譯期間,編譯器可存取與被呼叫函式相關聯之相依性檔案且可識別其相依性。基於被呼叫函式之相依性,編譯器可做出關於是否向量化呼叫函式之決定。
或者或另外,編譯器可決定僅向量化呼叫函式之一部分。相比否則將可能向量化之函式,藉由使用相依性檔案所提供之可見度可允許編譯器向量化較高百分比之函式。
舉例而言,相依性檔案之實施允許向量化包括非葉迴圈(亦即,呼叫原始程式碼不可見之外部函式之迴圈)的函式。因為現今絕大多數軟體函式包括一或多個非葉迴圈,所以此等系統及方法可增加可應用於任何應用程式之向量化的量。
在另一非限制性實施例中,編譯器可自單一原始程式碼描述產生函式之純量版本與向量版本兩者。函式之純量版本可使用如由原始程式碼最初指定之純量介面。同時,函式之向量版本可實施至函式之向量介面,從而接受向量參數且產生向量傳回值。
舉例而言,可在與函式相關聯之相依性檔案中曝露向量介面。舉例而言,此替代向量介面之存在允許編譯器自經向量化之迴圈內進行向量函式呼叫,而非自經向量化之迴圈內進行多個經串列化之純量函式呼叫。
本文中所揭示之技術之各種組合亦准許向量化不含有迴圈之函式,此情形與公認的智慧相反但提供眾多優點。特定言之,此等技術可增加軟體應用程式中之總向量化的量。
雖然易受到各種修改及易具有替代形式,但此說明書中所論述之特定實施例在圖式中藉由實例展示且在本文中將詳細描述。然而,應理解,圖式及實施方式不意欲將本發明限於所揭示之特定形式,而相反,其意欲涵蓋屬於如由隨附申請專利範圍所界定之本發明之精神及範疇的所有修改、等效物及替代物。
引言
以下說明書首先論述說明性電腦系統或裝置。說明書亦描述說明性編譯器,該編譯器可經組態以執行及/或產生用於電腦系統之可執行程式碼。接著,說明書呈現用於實現非葉迴圈及全函式向量化之若干種技術。
說明性電腦系統
圖1描繪根據某些實施例之可操作以實施用於實現軟體應用程式之通用向量化之技術的說明性電腦系統。在此非限制性實例中,電腦系統100包括經由I/O介面130耦接至 記憶體120之一或多個處理器110a-110n。電腦系統100亦包括耦接至I/O介面130之網路介面140及儲存介面150。儲存介面150將外部儲存裝置155連接至I/O介面130。此外,網路介面140可將系統100連接至網路(圖中未展示)或連接至另一電腦系統(圖中未展示)。
在一些實施例中,電腦系統100可為包括僅一個處理器110a之單一處理器系統。在其他實施例中,電腦系統100可包括兩個或兩個以上處理器110a-110n。處理器110a-110n可包括能夠執行指令之任何處理器。舉例而言,處理器110a-110n可為通用或嵌入式處理器,其實施任何合適的指令集架構(ISA),諸如x86、PowerPCTM、SPARCTM或MIPSTM ISA。在一實施例中,處理器110a-110n可包括美國專利案第7,617,496號及美國專利案第7,395,419號中所描述之巨集純量(Macroscalar)處理器的各種特徵。
系統記憶體120可經組態以儲存可由處理器110a-110n存取之指令及資料。舉例而言,系統記憶體120可為靜態隨機存取記憶體(SRAM)、同步動態RAM(SDRAM)、非揮發性/快閃型記憶體,或任何其他合適類型之記憶體技術。可將實施以下詳細描述之所要函式或應用程式之程式指令及/或資料的一部分展示為儲存於系統記憶體120內。或者或另外,彼等程式指令及/或資料之一部分可儲存於儲存裝置155中,儲存於一或多個處理器110a-110n內之快取記憶體中,或可經由網路介面140自網路得到。
I/O介面130可操作以管理處理器110a-110n、系統記憶體 120與系統中或附接至系統之任何裝置(包括網路介面140、儲存介面150或其他周邊介面)之間的資料訊務。舉例而言,I/O介面130可將來自一組件之資料或控制信號轉換為適用於另一組件之格式。舉例而言,在一些實施例中,I/O介面130可包括對經由各種類型之周邊匯流排(諸如,周邊組件互連(PCI)匯流排或通用串列匯流排(USB))附接之裝置的支援。又,在一些實施例中,I/O介面130之一些或所有功能性可併入至處理器110a-110n中。
舉例而言,網路介面140經組態以允許在電腦系統100與附接至網路之其他裝置(諸如,其他電腦系統)之間交換資料。舉例而言,網路介面140可支援經由有線或無線通用資料網路、電信/電話網路、儲存區域網路(諸如,光纖通道SAN)及其類似者之通信。
儲存介面150經組態以允許電腦系統100與儲存裝置(諸如,儲存裝置155)介接。儲存介面150可支援標準儲存介面,諸如以下各者之一或多個合適版本:進階技術附接封包介面(ATAPI)標準(其亦可被稱為積體驅動電子(IDE))、小型電腦系統介面(SCSI)標準、IEEE 1394「Firewire(火線)」標準、USB標準,或適合於使大容量儲存裝置與電腦系統100互連之另一標準或專屬介面。舉例而言,儲存裝置155可包括磁性、光學或固態媒體,其可為固定或可抽取的。儲存裝置155亦可對應於硬碟機或磁碟機陣列、CD或DVD機,或以非揮發性記憶體(例如,快閃)為基礎的裝置。
系統記憶體120及儲存裝置155表示經組態以儲存程式指令及資料之電腦可存取或電腦可讀儲存媒體之說明性實施例。在其他實施例中,程式指令及/或資料可經接收、發送或儲存於不同類型之電腦可存取媒體上。大體而言,電腦可存取媒體或儲存媒體可包括任何類型之大容量儲存媒體或記憶體媒體,諸如磁性或光學媒體。電腦可存取媒體或儲存媒體亦可包括任何揮發性或非揮發性媒體,諸如RAM(例如,SDRAM、DDR SDRAM、RDRAM、SRAM等)、ROM或其類似者,而不管是否如系統記憶體120或另一類型之記憶體般包括於電腦系統100中。經由電腦可存取媒體儲存之程式指令及資料可藉由傳輸媒體或信號(諸如,電、電磁或數位信號)傳輸,傳輸媒體或信號(諸如,電、電磁或數位信號)可經由諸如網路及/或無線鏈路之通信媒體傳送,通信媒體(諸如)可經由網路介面140來實施。
通常,電腦系統100可採用桌上型電腦或膝上型電腦之形式。然而,如根據本發明將容易地理解,電腦系統100可為能夠執行軟體之任何合適裝置。舉例而言,電腦系統100可為平板型電腦、電話或其類似者。
說明性編譯器
大體而言,編譯器可對應於經組態以將可用高階程式設計語言(諸如,C、C++或任何其他合適之程式設計語言)表示之原始程式碼轉譯或轉變為目的程式碼的軟體應用程式(例如,電腦可執行指令之一或多個模組)。藉以表達原始程式碼之語言可被稱為原始程式碼語言或簡單地被稱為原 始語言。通常,可用適合於由目標計算架構處理之指令及資料的形式來表示目的程式碼,但在一些實施例中,可對所產生之目的程式碼執行額外處理(例如,連結)以將目的程式碼轉變為機器可執行碼。在各種實施例中,此額外處理可由編譯器或由單獨應用程式執行。
可以機器可讀形式(例如,二進位形式)、以可能需要額外處理以產生機器可讀程式碼之人類可讀形式(例如,組合語言)或以人類可讀形式及機器可讀形式之組合來表示目的程式碼。目的程式碼之目標架構可與藉由處理器110a-110n(編譯器經組態以在其上執行)所實施之ISA相同。然而,在一些例子中,編譯器可經組態以產生用於不同於該編譯器執行所在之ISA之ISA的目的程式碼(「交叉編譯器」)。
圖2描繪根據某些實施例之在由電腦系統100或另一合適電腦系統執行時可產生可執行程式碼之說明性編譯器。編譯器200包括前端220及後端230,該後端230又可包括最佳化器240及程式碼產生器250。如所展示,前端220接收原始程式碼210且後端230產生目的程式碼,諸如純量目的程式碼260、經向量化之目的程式碼270或其組合。編譯器200亦可產生與目的程式碼260及/或270中之一或多者相關聯的相依性資料庫280。
雖然通常用高階程式設計語言來撰寫原始程式碼210,但原始程式碼210可替代地對應於諸如組合語言之機器階層語言。舉例而言,除用較高階程式設計語言撰寫之程式 碼以外,編譯器200可經組態以亦將其最佳化技術應用於組合語言程式碼。又,編譯器200可包括前端220之數個不同的執行個體,其各自經組態以處理用不同之各別語言撰寫之原始程式碼210且產生類似中間表示以供後端230處理。在此等實施例中,編譯器200可有效地充當多語言編譯器。
在一實施例中,前端220可經組態以執行原始程式碼210之初步處理以判定原始程式碼是否詞法及/或語法正確,且執行適合於使原始程式碼210準備好供後端230進一步處理之任何轉變。舉例而言,前端220可經組態以處理存在於原始程式碼210內之任何編譯器指示詞,諸如可導致原始程式碼210之一些部分包括於編譯處理程序中而排除其他部分的條件性編譯指示詞。前端220亦可經不同地組態以將原始程式碼210轉換為符記(例如,根據空白字元及/或由原始語言所定義之其他分隔符號),判定原始程式碼210是否包括原始語言不允許之任何字元或符記,且判定符記之所得串流是否遵守定義原始語言中之語式正確之運算式的語法規則。在不同情形下,前端220可經組態以執行此等處理活動之不同組合,可省略上文所描述之某些動作,或可包括不同動作,此取決於前端220之實施及為前端220之目標之原始語言。舉例而言,若原始語言不提供用於定義編譯器指示詞之語法,則前端220可省略包括掃描原始程式碼210以用於搜尋編譯器指示詞之處理動作。
若前端220在處理原始程式碼210期間遭遇錯誤,則其可 中止處理且報告錯誤(例如,藉由將錯誤資訊寫入至日誌檔案或寫入至顯示器)。否則,在充分分析原始程式碼210之語法及語意內容後,前端220即可將原始程式碼210之中間表示提供至後端230。大體而言,此中間表示可包括一或多個資料結構,該一或多個資料結構表示原始程式碼210之結構及語意內容,諸如語法樹、圖表、符號表或其他合適資料結構。中間表示可經組態以保留識別原始程式碼210之語法及語意特徵之資訊,且亦可包括經由原始程式碼之剖析及分析210所產生之額外註解資訊。舉例而言,中間表示可包括明確地識別原始程式碼210之不同區塊或區段間之控制關係的控制流程圖。此控制流程資訊可由後端230用以判定(例如)可重新配置(例如,藉由最佳化器240)原始程式碼210之功能性部分的方式以改良效能,同時保留原始程式碼210內之必要的執行排序關係。
後端230可大體上經組態以將中間表示轉變為純量程式碼260、經向量化之程式碼270或兩者之組合中的一或多者。具體言之,在所說明之實施例中,最佳化器240可經組態以轉變中間表示以試圖改良所得純量程式碼260或經向量化之程式碼270之一些態樣。舉例而言,最佳化器240可經組態以分析中間表示以識別記憶體或資料相依性。在一些實施例中,最佳化器240可經組態以執行多種其他類型之程式碼最佳化,諸如向量化、迴圈最佳化(例如,迴圈融合、迴圈展開等)、資料流最佳化(例如,共同子運算式去除(common subexpression elimination)、常數摺疊 (constant folding)等)或任何其他合適的最佳化技術。最佳化器240亦可經組態以產生相依性資料庫280。如下文更詳細描述,相依性資料庫280可表達原始程式碼210內之記憶體及/或資料相依性之指示。或者或另外,結合原始程式碼210之向量化,相依性資料庫280可曝露與經向量化之目的程式碼270相關聯的向量介面。
程式碼產生器250可經組態以處理如由最佳化器206轉變之中間表示,以便產生純量程式碼260、經向量化之程式碼270或兩種類型之程式碼之組合。舉例而言,程式碼產生器250可經組態以產生由目標架構之ISA所定義的經向量化之機器指令,以使得藉由實施目標架構之處理器(例如,處理器110a-110n中之一者或不同處理器)之所產生指令的執行可實施由原始程式碼210所指定之功能性行為。在一實施例中,程式碼產生器250亦可經組態以產生對應於原始程式碼210中可能尚未固有但可藉由最佳化器240在最佳化處理程序期間添加之運算的指令。
在其他實施例中,可將編譯器200分割為比彼等所展示組件多、少之組件或與所展示組件不同的組件。舉例而言,編譯器200可包括連結器(圖中未展示),連結器經組態以將一或多個目的檔案或程式庫作為輸入,且組合該一或多個目的檔案或程式庫以產生單一通常可執行之檔案。或者,連結器可為與編譯器200分離之實體。如上文所提到,編譯器200之組件中之任一者及藉此執行之方法或技術(包括以下關於圖3至圖6描述之彼等方法或技術)中之任 一者可部分或完全地實施為儲存於合適電腦可存取儲存媒體內之軟體程式碼。
原始程式碼210可表示(例如)軟體函式或演算法。所得目的程式碼260及/或270可為(例如)可由其他函式呼叫之程式庫或外部函式。以下更詳細論述由編譯器200在運算期間且(詳言之)在其向量化運算期間所使用之說明性技術。
非葉迴圈之向量化
許多現代電腦具有藉由同時執行兩個或兩個以上不同運算來執行計算工作負載之一些類型之並列處理的能力。舉例而言,超純量處理器可允許電腦試圖同時執行多個獨立指令。大體上被稱為「向量計算」之另一技術(可將其視為並列計算之特殊狀況)允許電腦試圖執行同時對多個資料項目進行運算之單一指令。向量計算之各種實例可見於現可用於各種處理器中之單指令多資料(SIMD)指令集中,包括(例如)IBM之用於PowerPCTM_處理器之AltiVecTM及SPETM擴充指令集以及Intel之MMXTM及SSETM擴充指令集之變體。此等SIMD指令為可由向量化編譯器作為目標之向量指令的實例,但其他類型之向量指令或運算(包括可變長度向量運算、預測向量運算、對向量及純量/立即值(immediate)之組合進行運算之向量運算)亦為可能且預期的。
大體而言,將原始程式碼轉變為經向量化之目的程式碼之處理程序可被稱為「向量化」。當使用編譯器執行時(與此相對比,例如,用手向量化原始程式碼),向量化可 被稱為「編譯器自動向量化」。一種特定類型之自動向量化為迴圈自動向量化。迴圈自動向量化可將在多個資料項目上反覆之程序性迴圈轉換為能夠在單獨處理單元(例如,圖1中之電腦系統100之處理器110a-110n,或處理器內之單獨功能性單元)內同時處理多個資料項目之程式碼。舉例而言,為了將兩個數值陣列A[]B[]相加起來,程序性迴圈可反覆通過該等陣列,從而在每一反覆期間使一對陣列元素相加。當編譯此迴圈時,向量化編譯器可利用目標處理器實施能夠同時處理固定或可變數目個向量元素之向量運算的事實。舉例而言,編譯器可自動向量化陣列相加迴圈以使得在每一反覆同時使陣列A[]B[]之多個元素相加,從而減少完成相加所需之反覆的數目。典型程式在此等迴圈內花費其執行時間之顯著量。因而,迴圈之自動向量化可在無程式設計者介入的情況下產生效能改良。
在一些實施例中,編譯器自動向量化限於葉迴圈,亦即,不呼叫其他函式之迴圈。非葉迴圈(亦即,呼叫其他函式之迴圈)之向量化一般非常困難,此係因為外部函式呼叫之副作用通常為不透明的,尤其在其原始程式碼不可用於程序間分析時,諸如程式庫之狀況。為了達成說明之目的,考慮以下迴圈:
為了向量化此迴圈,編譯器200可判定函式foo()是否與陣列A[]互動(例如,讀取或寫入)。此處,存在三種可能性:(1)函式foo()不與A[]互動;(2)函式foo()確實與A[]互動;或(3)函式foo()可能與A[]互動(例如,取決於編譯階段或執行階段條件,foo()可能與或可能不與A[]互動)。函式foo()可能與A[]互動之狀況呈現類似於函式foo()實際上與A[]互動之狀況的問題。在foo()A[]之間不存在互動的狀況下,則以下可向量化程式碼等效於以上迴圈:
此實例展示:在向量化非葉迴圈之處理程序中,編譯器200將受益於知曉函式存取之記憶體及/或彼記憶體是否經讀取及/或寫入。因為大多數迴圈在其內通常含有函式呼叫,所以為了達成高度向量化,向量化非葉迴圈及由其呼叫之函式為較佳的。為了實現此層級之向量化,本文中所描述之技術及系統之各種實施例增加跨越先前可能已編譯之程式庫及模組之相依性及潛在相依性的編譯階段可見度。舉例而言,此資訊可在獨立於最初在何時(或在何處)編譯程式庫或模組而編譯呼叫函式時可用。因此,本文中所描述之某些技術建立說明性編譯器架構以產生此可見度,且探索由其實現之向量化之類型。
相依性資料庫
當編譯呼叫外部函式之程式碼時,可能需要判定外部函 式之介面(例如,外部函式採用之參數之數目及/或類型,及/或其傳回之結果之數目及/或類型)。舉例而言,此介面資訊可用於判定呼叫程式碼是否已正確地實施外部函式。外部可呼叫函式通常可在標頭檔案中曝露其介面定義。然而,此等標頭檔案可能不向呼叫函式曝露並非外部函式之介面之部分但仍影響程式碼向量化的變數之細節。舉例而言,在上文所說明之迴圈中,for迴圈之向量化可取決於函式foo()與陣列A[]互動之方式。然而,因為foo()不將A[]作為參數,所以對應於foo()之標頭檔案可能未向編譯器200充分地指示此相依性。
本文中亦可被稱為「持續相依性資料庫」之相依性資料庫可描述程式庫中之外部可呼叫函式之相依性。亦即,相依性資料庫可向呼叫函式曝露僅自被呼叫函式之介面未必顯而易見之被呼叫函式的各種相依性。當編譯呼叫程式庫之函式時,可存取此資料庫。大體而言,相依性資料庫可持續地儲存可呼叫程式碼之相依性之指示,使得相依性跨越編譯器調用而可見。舉例而言,在一些實施例中,相依性資料庫可實施為相依性檔案(類似於標頭檔案),其包括指示各種相依性之人類可讀及/或機器可讀內容。在其他實施例中,可使用其他技術來實施相依性資料庫,諸如藉由使用以表為基礎的關係資料庫、半結構化資料(例如,使用可延伸性標記語言(XML)格式化)或任何其他合適技術。為簡化解釋,以下論述參考使用相依性檔案之實施例。然而,應注意,此僅為相依性資料庫之非限制性實 例。
在一實施例中,編譯器200在包括相應標頭檔案(例如,stdlib.h)後即自動地存取相依性檔案(若其存在)。此機制可允許向量化編譯器(諸如,巨集純量編譯器)編譯現有程式碼而無修改,同時具有知曉外部程式庫之相依性之優點。編譯器200可接著在編譯程式庫時自動地產生相依性檔案。
含於相依性檔案中之資訊可形成應用程式編譯器介面(ACI),其提供編譯器200可用以理解函式之約束的資訊。具體言之,相依性檔案可表達關於通常不在呼叫函式之範疇內之變數的資訊。舉例而言,相依性檔案中所表達之變數可包括並非被呼叫函式之參數的資料項目(亦即,此等變數可能未由被呼叫函式之程式設計介面定義為被呼叫函式之參數)。舉例而言,經由使用相依性檔案,呼叫函式可意識到被呼叫函式是否讀取或寫入函式靜態或檔案靜態變數。相依性檔案亦可允許編譯器200區分共用相同名稱但具有不同範疇之變數。
作為一非限制性實例,當編譯程式庫stdlib時,編譯器一般僅將產生目的檔案stdlib.o。藉由使用本文中所描述之技術,編譯器200亦可(例如)在編譯階段產生相依性檔案stdlib.d。相依性檔案stdlib.d曝露與stdlib.h中所定義之公用函式相關聯的記憶體相依性。包括來自原始程式碼之stdlib.h之其他程式可觸發編譯器200在相應位置中搜尋相關聯之相依性檔案stdlib.d。此相依性檔案可與stdlib.hstdlib.o一起分散及安裝。在一實施中,相依性檔案之缺乏將意謂無關於程式庫之額外資訊可用,此情形可為舊式程式庫之預設狀態且將不會引起任何編譯錯誤。
相依性資料庫可藉由在編譯呼叫程式庫函式之程式碼時以編譯器200可見之方式曝露先前編譯之程式庫函式(或程式中之任何函式)之資料相依性特性來實現非葉迴圈之向量化。可在不揭露程式庫之原始程式碼的情況下使此資訊可用。
在一些實施例中,可在程式庫之編譯階段產生相依性資訊。舉例而言,對於經編譯之每一函式,編譯器200可記下對函式靜態變數、檔案靜態變數、全域變數及/或傳遞至正經編譯之函式中之指標的存取之類型。編譯器200可接著記錄已讀取或寫入哪些符號,且以可在參考該程式庫之其他程式碼之編譯階段存取及使用之相依性檔案的形式匯出此資訊。
作為另一非限制性實例,若在檔案foo.c中定義函式foo()且在標頭檔案foo.h中定義其介面,則在foo.c之編譯階段,函式foo()之記憶體相依性特性可儲存至相依性檔案foo.hd中。(應注意,可使用用於相依性檔案之任何合適的命名慣例)。使用函式foo()之呼叫函式可包括標頭檔案foo.h,但不可存取檔案foo.c。在呼叫函式之編譯期間參考foo.h時,編譯器200可自動地搜尋相依性檔案foo.hd以查看其是否存在。因為相依性檔案foo.hd之存在為可選的,所以此檔案之缺乏可暗示檔案foo.h中所定義之函式之相依性特性 未知,因此建議編譯器200在向量化呼叫函式時應作出悲觀假設。然而,若相依性檔案存在,則編譯器200可使用此檔案中之相依性資訊以在向量化呼叫函式期間使用含於相依性檔案中之相依性特性進行較準確且積極的假設。
參看圖3,描繪表示根據某些實施例之在相依性檔案中表達相依性之方法的流程圖。在區塊300中,編譯器200接收待編譯之函式。舉例而言,編譯器200可在處理用於編譯之原始程式碼時(諸如,在編譯包括函式之程式庫期間)接收該函式。在區塊310中,編譯器200分析該函式且識別該函式內的經表達之相依性。此經表達之相依性可為(例如)與並非被呼叫函式之參數之資料項目相關聯的記憶體或資料相依性。更大體而言,關於特定資料項目之函式的經表達之相依性可指示函式是僅讀取特定資料項目,僅寫入特定資料項目,抑或讀取特定資料項目與寫入特定資料項目兩者。在各種實施例中,函式之分析可包括諸如執行函式之詞法、語法及/或語意分析之活動。分析亦可包括產生剖析樹、符號表、中間程式碼表示及/或指示正經編譯之程式碼之運算及/或資料參考之一些態樣的任何其他合適資料結構或表示。
在區塊320中,編譯器200將經表達之相依性之指示儲存於與函式相關聯之相依性資料庫中。舉例而言,在函式之分析期間,編譯器200可識別由函式所使用的對於彼函式未必為區域或私用的且因此能夠由函式外部之程式碼讀取或寫入的變數。此等變數可為編譯器200可識別的經表達 之相依性之實例,且編譯器200可將此等變數之指示儲存於相依性資料庫內。(應注意,在一些實施例中,編譯器200亦可識別及指示對於函式為區域或私用之相依性)。在各種實施例中,經表達之相依性之指示可包括識別經表達之相依性之資訊,諸如所取決於之變數之名稱。該指示亦可包括特性化經表達之相依性之資訊,諸如關於函式是否讀取或寫入變數之資訊及/或關於變數之資料類型或範疇(例如,變數是否為全域、私用、靜態等)之資訊。如根據本發明將容易地顯而易見,可以任何合適格式(諸如,可延伸性標記語言(XML)或其類似者)產生或更新相依性檔案。此外,在一些實施例中,替代肯定方式或除肯定方式以外,亦可以否定方式來指示相依性。舉例而言,除指示確實存在之彼等經表達之相依性以外或替代指示確實存在之彼等經表達之相依性,相依性檔案亦可明確地指示給定變數不取決於外部程式碼。
舉例而言,考慮以下實例,其中將編譯func1.c
在此種狀況下,func1.c呼叫以下展示之外部函式foo1.c
僅為達成說明之目的而再現被呼叫函式foo1.c之原始程式碼。應理解,只要對於foo1.c而言存在相依性資料庫(在此實例中,相依性檔案),則其原始程式碼在呼叫函式func1.c之編譯期間便無需可用。在此實例中,儲存於可已在編譯檔案foo1.c時產生之相依性檔案foo1.hd中的經表達之相依性資訊可表達函式靜態變數「e」經讀取及寫入兩者的事實。因而,以下展示相應相依性檔案之一非限制性實例:
在檔案func1.c之編譯階段,包括標頭檔案foo1.h可使編譯器200讀取相依性檔案foo1.hd。此資訊通知編譯器被呼叫函式foo1()的經表達之相依性:亦即,彼靜態變數「e」經讀取及寫入。此亦允許編譯器200偵測如下情形:即使全域變數「A」及「F」用於呼叫函式func1()中,全域變數「A」及「F」仍不由被呼叫函式foo1()參考。此知識允許 編譯器200向量化函式func1()中之迴圈,此係因為其可判定並列性將不會引起不正確操作。在此種狀況下,對於正經處理之向量中之每一元素,func1()中之迴圈將呼叫foo1()一次。
若函式foo1()寫入至全域「A」,則編譯器200可不向量化func1()中之迴圈,或其可使用該資訊以僅向量化函式之一部分。在此例子中,編譯器可(例如)將串列化對函式foo1()之呼叫與對「A」之記憶體參考,同時允許迴圈之剩餘部分以並列方式執行。
參看圖4,描繪表示向量化函式之方法之實施例的流程圖。在區塊400中,編譯器200識別呼叫函式。在一非限制性實施例中,呼叫函式可包括非葉迴圈,在該種狀況下,呼叫函式可包括對外部或被呼叫函式之呼叫。參考剛才給出之程式碼實例,編譯器200可處理func1.c原始程式碼,且識別func1()函式作為呼叫函式,其包括呼叫foo1()函式之非葉for迴圈。
在區塊410中,編譯器200可試圖存取與被呼叫函式相關聯之相依性資料庫。在一些例子中,可(例如)經由命令列參數、嵌入於原始程式碼內之編譯器指示詞或經由另一合適技術向編譯器200明確地指示相依性資料庫(例如,相依性檔案)。在其他例子中,編譯器200可試圖根據命名慣例自其他資料推斷相依性檔案之名稱。舉例而言,若標頭檔案包括於原始程式碼內,則編譯器200可搜尋自標頭檔案之名稱導出的相依性檔案。在一些實施例中,編譯器200 可基於被呼叫函式之名稱搜尋相依性檔案。
若相依性資料庫存在,則其可指示被呼叫函式內的經表達之相依性。此經表達之相依性可為(例如)與並非被呼叫函式之參數之資料項目相關聯的記憶體或資料相依性,如上文所論述。在一些例子中,編譯器200可檢查數個不同的命名慣例以判定相依性檔案是否存在。
在區塊420中,編譯器200接著至少部分地基於經表達之相依性(或相依性之缺乏)判定呼叫函式是否與被呼叫函式互動。舉例而言,在存取與函式foo1()相關聯之相依性檔案後,編譯器200即可判定foo1()取決於變數「e」而非變數「A」或「F」。因此,編譯器200可判定,至少關於變數「e」,呼叫函式func1()確實與被呼叫函式foo1()互動。
在區塊430中,取決於呼叫函式是否與被呼叫函式互動之判定,編譯器200可判定是否向量化呼叫函式之至少一部分。舉例而言,基於上文所論述的經表達之相依性資訊,編譯器200可試圖藉由產生同時對多個資料項目(例如,陣列元素)及/或多個迴圈反覆進行運算之向量程式碼來向量化呼叫函式func1()
在各種實施例中,相依性資料庫可表達對編譯器200判定是否向量化函式有用之各種類型之資訊。實例包括追蹤對資料物件之讀取及寫入、指標、指向資料物件(pointed-to object)、指向物件內之已知位移(offset)、至指向物件中之未知位移(其可有效地構成對整個物件之參考)、物件(指向物件與資料物件兩者,其可使用在論述中之變數實現執 行階段相依性分析)內之變數位移,及至具有至較高層級物件中之未知位移之物件中的已知位移(例如,當參考未知數目個已知位移但保持未參考其他位移時)。
已知位移資訊可使編譯器200能夠在不產生額外相依性檢查指令之情況下進行向量化,而變數位移資訊可用以產生在執行階段分析變數相依性之相依性檢查指令,其可允許達成增加之向量並列性,同時仍維持程式正確性。
如上文所解釋,相依性資料庫可表達關於對編譯器200在向量化呼叫函式時有用的被呼叫函式之資訊。就此而言,相依性資料庫可儲存諸如記憶體存取之類型、定址模式及/或額外限定詞之資訊。
在一些實施例中,藉由函式進行之記憶體存取大體上屬於以下兩種類型:讀取及寫入。因此,如上文給出之實例中所展示,相依性資料庫可明確地儲存資料項目是否經讀取或寫入之指示。
定址模式描述如由呼叫函式查看到之被呼叫函式內之記憶體存取。一些實施例可定義三種定址模式:常數、變數及未知,但替代實施例為可能且預期的。此等三種定址模式中之每一者可分別藉由以下情形來判定:定址是可由編譯器在編譯階段,藉由呼叫函式在執行階段抑或藉由被呼叫函式在執行階段建立。另外,一些實施例可定義定址模式之兩個正交限定詞:公用及私用。此等限定詞指定相關聯變數是否為外部模組可見。
根據一些實施例,常數定址描述可在編譯階段自模組外 解析之定址。此定址包括對可在編譯階段解析之命名變數、命名結構內之命名結構元素或陣列索引的參考。舉例而言,g(命名變數)、str.g(命名結構內之命名結構元素)、h[5](由常數標以索引之陣列)及str[5].h(由常數標以索引之結構之命名陣列內的命名結構元素)表示常數定址之實例。此等實例可表示靜態或全域變數。(自動儲存區通常為暫時的,例如,在進入模組後即分配且在模組之退出後即解除分配,且因此在模組外大體上不可見)。以下實例說明使用常數定址之函式之相依性:
在一些實施例中,變數定址描述並非常數但亦不由被呼叫函式修改之定址。因此,其可由呼叫函式在執行階段評估。實例包括對指向物件及可由呼叫函式觀察到定址之陣列的參考。考慮以下函式:
此函式將以下相依性匯出至相依性檔案,從而宣告函式寫入A[g]且讀取A[x],兩者皆為變數定址之陣列:
在此實例中,若每呼叫迴圈之反覆僅呼叫函式assignA()一次,則相依性檢查(其亦可被稱為危障檢查(hazard checking))可為不必要的。被呼叫函式assignA()可判定gx是否重疊,且可(例如)使用巨集純量技術相應地分割向量。
考慮外部迴圈每反覆調用assignA()兩次之情形:
儘管危障可存在於g1x之間或g2y之間,但此等相依性與函式之單一調用有關。在此特定例子中,呼叫迴圈可僅在其可自相依性檔案中之資訊辨識的g1y之間及g2x之間檢查潛在危障。
在一些實施例中,未知定址類似於如上文所描述之變數定址,但通常應用於執行階段定址不可由呼叫函式評估之情形。此可發生在(例如)被呼叫函式以呼叫函式使用來自相依性檔案之資訊而不可見之方式修改位址變數之值的情形中。
額外限定詞「公用」及「私用」可指定連結器是否匯出符號以允許由呼叫函式檢驗變數。舉例而言,將在上文給出之倒數第二個實例中的對A[]之參考指定為「私用」,此係因為A[]經宣告為不被匯出至呼叫assignA()之函式的檔案靜態變數。在此實例中,編譯器200可自相依性資訊判定assignA()函式定址A[]之方式,但可能不能夠產生實 際上讀取A[]之值的程式碼。
全函式向量化
如上文詳細描述,編譯器自動向量化可用以按可能對程式設計者或其他使用者透明之方式來自未經向量化之原始程式碼產生經向量化之程式碼。此編譯器自動向量化可在幾乎無程式設計者介入的情況下使原始程式碼能夠利用由向量計算硬體所提供之效能改良。
然而,若將要有效地向量化非葉函式(亦即,呼叫其他函式之函式),則可能需要提供將向量介面而非可在原始程式碼中表示之純量介面曝露至呼叫函式的被呼叫函式之版本。
此外,應用程式開發者可能希望將應用程式之目標定為多種計算平台,並非所有計算平台可提供向量資源。舉例而言,處理器系列之行動版本可省略向量運算以減小晶粒大小及功率消耗,而同一處理器系列之桌上型版本可經開發以強調處理能力勝過功率消耗。在此情形中,為了在行動處理器上執行,應用程式可能需要使用僅純量函式來編譯,而當在桌上型處理器上執行時,應用程式可使用純量或向量函式。然而,如同上文所描述之自動向量化,可能需要允許應用程式在向量及非向量平台上有效地執行,同時減少或消除程式設計者介入。
因此,當向量化函式時,根據本文中所描述之一些實施例之編譯器可自單一原始程式碼描述產生函式之純量版本與向量版本兩者。該函式可為(例如)程式庫函式,但更具 體言之,其可對應於任何可呼叫程序或方法。在一些實施例中,函式之純量版本可使用如由原始程式碼最初指定之純量介面。同時,函式之向量版本可實施至函式之向量介面,從而接受向量參數及/或產生向量傳回值。藉由產生函式之純量版本與向量版本兩者,編譯器可使程式碼能夠在編譯階段或執行階段被更靈活地適於可用資源。此外,藉由產生被呼叫函式的經向量化之版本且將所得向量介面曝露至呼叫函式,編譯器可促進呼叫函式之向量化,因此自葉函式向上階層性地傳播向量化之機會。
可(例如)在與函式相關聯之相依性資料庫(諸如,相依性檔案)中表達向量介面。舉例而言,考慮以下函式殼層,其中已省略函式之內部細節:
此函式之純量介面可表示為(例如,在相依性檔案內):int foo(int A)
此表示反映,根據此版本,foo()採用純量參數且傳回純量結果。
經向量化以同時對多個資料項目執行運算之同一函式(例如)可成為:
因而,此函式之向量介面可表示為(例如,在相依性檔案內):Vector foo(Vector A)
不同於先前表示,此表示指示foo()之此版本採用向量參數且傳回向量結果。
參看圖5,描繪表示全函式向量化方法之實施例的流程圖。在區塊500中,編譯器200接收待編譯之函式。在區塊510中,編譯器200可編譯該函式之純量版本。在區塊520中,編譯器200可編譯該函式之向量版本。且在區塊530中,編譯器200可在相依性資料庫中表達與函式之向量版本相關聯的向量介面。
此替代向量介面之存在允許編譯器200自經向量化之迴圈內進行向量函式呼叫,而非自經向量化之迴圈內進行多個經串列化之純量函式呼叫。舉例而言,考慮呼叫外部函式foo()之呼叫函式內的以下迴圈:
foo()僅具有純量介面,則向量化此迴圈之機會可限於(例如)指派之向量化。然而,foo()之向量版本之存在可增加迴圈向量化之機會。舉例而言,以上迴圈之經向量化之版本可呼叫使用向量參數之foo()且可接收向量結果,從而實現更多同時執行且減少迴圈內之串列化。此外,不同於先前方法,此技術准許不含有迴圈之函式之向量化。此情 形可增加應用程式中之總向量化之量。
可向量化函式之兩個版本中之迴圈。大體而言,「水平」向量化可指代將迴圈之反覆映射至向量之相應元素的向量化類型。「垂直」向量化可指代如下向量化類型:可保留迴圈之反覆性質(亦即,與如水平向量化中之映射至向量元素相對),但用向量變數替換純量變數以使得相比程式碼之純量版本,每一反覆同時對更多資料進行運算。
可使用巨集純量技術水平地向量化函式之純量版本中之迴圈,而可水平或垂直地向量化函式之向量版本中之迴圈。此情形可增加應用程式中之向量化之機會。除向量化函式呼叫之效能及效率益處以外,此技術亦可增加在應用程式中垂直地向量化之迴圈之數目,因此減小在水平地向量化迴圈時所引起之額外耗用。
參看圖6,描繪表示使用經向量化之函式之方法的實施例的流程圖。在區塊600中,編譯器200識別呼叫被呼叫函式之呼叫函式。舉例而言,呼叫函式可包括呼叫經預編譯之程式庫內之函式的迴圈。在區塊610中,編譯器200存取與被呼叫函式相關聯之相依性資料庫。在區塊620中,編譯器200檢查相依性資料庫以判定被呼叫函式之向量變體是否可用。在一實施中,當向量版本可用時,在區塊630中,編譯器200編譯呼叫函式以利用被呼叫函式之向量變體。若向量版本不可用,則編譯器200編譯呼叫函式以利用純量版本(例如,藉由反覆地呼叫函式之純量版本)。
舉例而言,再次考慮以下迴圈:
當向量化此迴圈時,編譯器可檢查與foo()相關聯之相依性資料庫以判定與foo()相關聯之向量介面是否存在。若foo()之向量介面不存在,則編譯器200可(例如)藉由向量化指派同時使函式呼叫保持處於純量格式來僅部分地向量化迴圈。
另一方面,若foo()具有表達於其相依性資料庫中之經向量化之介面,則在一些例子中,編譯器200可整體地向量化迴圈(例如,藉由將指派與函式呼叫兩者替換或以其他方式轉變為向量運算)。
當編譯器檢查foo()之相依性資料庫以判定是否存在被呼叫函式之經向量化之介面時,編譯器可另外或替代地檢查與被呼叫函式相關聯之任何記憶體相依性,其可表達於與foo()相關聯之同一(或另一)相依性資料庫中。
在一些實施中,可獨立地追蹤陣列之每一維度之定址以最小化不確定性。大體而言,此概念可應用於所有彙總資料類型(諸如,結構及陣列)。以下實例更詳細地說明諸如編譯器200之編譯器(例如)可使用相依性資料庫資訊以實現向量化且可在可能時代替純量版本而使用函式之向量版本的方式(應注意,在其他實施例中,可獨立於判定向量函式介面是否存在來使用相依性資料庫,且可獨立於判定相依性資料庫是否存在來使用向量函式介面)。
在此實例中,函式bar()將匯出相依性(例如,經由在編譯函式bar()時由編譯器200所產生之相依性檔案,如上文所論述),從而指示其寫入至p.ptr[],且自p.bj讀取:
應注意,在此特定狀況下,可能沒有必要將對參數之參 考識別為「公用」或「私用」。又,可能沒有必要宣告函式自pj讀取,此係因為至少在此實例中,可假設函式使用其自有參數。myStruct之類型定義可包括於相依性資料庫中以將其曝露至呼叫foo()之函式,但可未必經由標頭檔案包括而曝露至myStruct之定義。
在編譯期間,編譯器200可編譯函式bar()而不向量化該函式bar(),此係因為其中不存在要向量化之迴圈。在進行此步驟中,可產生具有以下介面之bar()之純量版本:int bar(myStruct*p,int j)
在此實例中,bar()可將指向結構之指標之單一執行個體及單一整數作為參數,且傳回單一整數作為結果。因此,bar()之此版本之輸入及輸出為純量。
然而,編譯器200亦可編譯具有亦可在相依性資料庫中匯出之以下介面的向量函式:Vector bar(Vector p,Vector j,Vector pred)
在此實例中,述詞向量pred指定哪些向量元素應由此函式處理。舉例而言,假設向量包括經定義數目個元素,則述詞向量可含有具有相同經定義數目個位元之向量,每一位元對應於各別元素。每一位元可充當布林述詞,其判定是否應處理其相應向量元素(例如,若述詞位元為「1」,則為「是」,且若述詞位元為「0」,則為「否」,或若述詞位元為「0」,則為「是」,且若述詞位元為「1」,則為「否」)。述詞允許呼叫函式進行條件函式呼叫,且若其不終止於向量長度邊界,則注意迴圈之尾端。應注 意,其他實施例可使用不同類型之述詞格式(諸如,非布林述詞)。
又,在此實例中,向量p為指向結構之指標的向量,但在此實例中該等指標皆指向同一執行個體。向量j為簡單整數向量。編譯器可自純量函式宣告推斷此類型資訊。
函式bar()之一可能向量變體針對輸入向量之每一元素計算p.b+j,且將此等結果寫入至p.ptr之適當陣列索引中。函式bar()之一可能向量變體亦基於p.bj之比較來傳回結果向量。在此特定實例中,編譯器垂直地向量化函式。亦即,因為bar()不含有迴圈,所以不存在待轉變成向量元素之迴圈反覆(如同水平向量化中之狀況)。實情為,bar()之經向量化之版本可同時對向量輸入之不同元素進行運算。
foo()之編譯期間,編譯器200可讀取關於函式bar()(其可能未必位於同一原始程式檔中)之相依性資訊,且判定被呼叫函式bar()不具有對g.a之相依性,即使呼叫函式將指標傳遞至結構g亦如此。因為其具有此資訊,所以編譯器200可水平地向量化函式foo()中之迴圈。此外,編譯器200可針對所處理之每一向量對bar()之向量變體進行單一函式呼叫,而非在迴圈之每一反覆中呼叫純量變體。最後,編譯器200可產生具有向量介面之foo()之向量變體。在此特定狀況下,由於不可分析全範圍之x之相依性,因此不可應用垂直向量化。可應用迴圈之水平向量化,且其含於在傳遞至函式foo()之向量變體之向量元素上反覆的另一迴圈內。
在此等假設下,函式foo()可匯出以下相依性:
(@符號表示未知定址)。因為函式bar()匯出相依性「write p.ptr[p.b+j]」,所以編譯器200可告知將結構要素ptr[]作為x之函式來寫入。因此,編譯器200可向foo()之呼叫者報告寫入至之索引未知,此係因為該索引不可由foo()之呼叫者判定。
額外實施技術
此章節描述可用以實施非葉向量化及全函式向量化之非限制性編譯器技術。以下描述基於巨集純量編譯器技術,但一般熟習此項技術者根據本發明將認識到,可使用其他編譯器技術。
先前實例說明定址可包括數學運算式。只要運算式不涉及函式呼叫且僅含有呼叫函式可見之項,則大體上係如此情形。此可包括間接定址,諸如當查找表用於計算至其他陣列中之索引時。
間接定址為組態編譯器及連結器以匯出靜態陣列作為公用可幫助向量化更多迴圈的一情形。考慮以下實例:
針對foo()所產生之相依性可取決於編譯器及連結器是否經組態以按公用方式匯出靜態符號而不同。在以下之實例中,第一相依性檔案表達私用靜態變數且第二相依性檔案表達公用靜態變數:
應注意,A之類型宣告可在將其以公用方式匯出時在相依性檔案中為必要的。當靜態變數為私用的時,B[]之定址未知,此係因為不可自函式外判定B[]之定址。由於危障檢查為不可能的,因此不可執行bar()中之迴圈之向量化。然而,當工具經組態以按公用方式匯出靜態變數時,編譯器可發出讀取A[x]之內容之指令,且檢查B[A[x]]B[x]之間的危障,因此實現迴圈之向量化。
自然地,當以公用方式匯出且在外部定址靜態變數時,出現名稱衝突之機會。為了幫助避免此等衝突,靜態變數可藉由宣告該等靜態變數之函式及檔案來進行名稱重整(mangle)。
一些危障涉及有條件地發生之記憶體操作,或涉及基於條件計算而可能不同的定址。為了支援呼叫涉及條件相依性之函式之迴圈的向量化,可提供一機制來表達條件影響相依性之方式。
舉例而言,考慮以下程式碼:if(A[x]<c)d=B[x];
可在相依性資料庫中將此程式碼表達為:
條件運算式亦可存在於位址之計算中。舉例而言,考慮以下程式碼:
可在相依性資料庫中將此程式碼表達為:
或者,可將以上的後一條件運算式表達為:read public B[A[x]<c?x:x+c];
在一些狀況下,未知項可逐漸產生(creep)於相依性運算式中。在此種狀況下,一說明性實例可為:A[x]<c?read public B[x]:read public B[@];
此運算式可在條件為真之情況下通知編譯器對B之特定相依性,且在條件為假之情況下通知編譯器對B之未知相依性。
逐漸產生於條件運算式中之未知項可引起表現為似乎條件為真與假兩者之無條件相依性。舉例而言:A[x]<B[@]?read public f:read public g;
可表達為:read public f;read public g;及:read public A[x>@?x:x+y];
可表達為:read public A[x];read public A[x+y];
因為呼叫函式通常不能夠評估未知條件,所以呼叫函式可作出存取至A[]中之兩個可能索引之保守假設。
在一些實施中,亦可在相依性資料庫中表達循環相依性。舉例而言,考慮以下函式:if(A[x]>b)b=A[x]
在一實施中,此函式可表達為:
在將指標或參考傳遞至函式(亦被稱為「藉由參考來傳遞」)的情況下,函式有可能修改其呼叫參數。此情形不同於由值所傳遞之參數之修改,此係(例如)因為藉由參考所傳遞之參數之修改可影響呼叫函式之運算。可以與記錄靜態及全域儲存區之修改相同的方式記錄藉由參考所傳遞之參數之修改。可將由值所傳遞之參數之修改視為區域自動儲存區之修改。在一些例子中,因為由值所傳遞之參數之修改對於呼叫函式為不可見的,所以可能不記錄該等修改。
在一些實施中,可在軟體推測對向量化呼叫迴圈將為必要的狀況下以推測方式呼叫符合一組準則之函式。因此,可在相依性檔案中表達推測安全指示符,且推測安全指示符可充當可以推測方式安全地呼叫相應程式碼之指示。在一非限制性實例中,能夠以推測方式被呼叫之向量函式可屬於以下兩種類別中之一者:類型A及類型B。類型A函式可為具有本文中所描述之常規向量介面之向量函式。舉例而言,可在類型A函式符合以下準則時以推測方式呼叫類型A函式而無有害的副作用。首先,除區域自動非陣列儲存區之外,該函式不存取任何記憶體。其次,該函式不呼叫亦非類型A函式之任何其他函式。類型A函式之實例可為超越函式或其他反覆收斂演算法。
除由原始程式碼所指定之任何傳回值以外,類型B函式亦可傳回指示處理了哪些元素之述詞向量。在一實施例中,用於以推測方式呼叫類型B函式之準則可如下。首 先,自非區域儲存區或區域陣列儲存區之任何讀取使用首次故障(first-faulting)讀取指令。其次,函式不寫入至非區域儲存區或靜態區域儲存區。第三,函式不呼叫既非類型A函式亦非類型B函式之任何函式。
自迴圈呼叫類型A函式可類似於呼叫非推測性函式。通常,當以推測方式呼叫類型A函式時,就呼叫迴圈而言,無特殊動作為必要的。然而,呼叫類型B函式可要求呼叫迴圈檢查傳回向量以便判定處理了哪些元素,且作為回應來調整呼叫迴圈之行為。
編譯器(諸如,編譯器200)可選擇使類型B向量函式之所有呼叫者調整其行為以適應實際上已處理之數個元素,而不管軟體推測是否用於呼叫迴圈中。或者,編譯器200可針對每一類型B函式產生兩個向量函式;一個推測性向量函式及一個非推測性向量函式。用於類型B迴圈之準則可大體上經設計以確保限定之彼等迴圈為少且小的,且因此對此方法之程式碼大小影響可忽略。
類型A及類型B向量函式可由其在相依性資料庫中之宣告來識別,如下文所展示。在一實施中,指定符之缺乏暗示可不以推測方式呼叫函式。
對於向量化編譯器,混淆有時可成問題。雖然巨集純量架構經由執行階段混淆分析來解決問題,但存在對此方法之額外耗用。巨集純量程式中之額外耗用影響阿姆達爾(Amdahl)定律中之串列分量,此可限制較寬向量之益處。此外,與外部或靜態變數混淆可影響跨越函式呼叫之行為。因此,在一實施中,執行編譯階段混淆分析且將混淆指示符匯出至相依性檔案。
舉例而言,一方法可為將混淆事件分成兩種類別,諸如傳入混淆及傳出混淆。自被呼叫函式之觀點,傳入混淆可參考進入函式中之位址(諸如,作為參數傳遞進入之彼等位址)、自外部變數讀取或由函式藉由採用外部變數之位址所計算的位址。同時,傳出混淆可參考函式外傳之指標。此等可為傳回值,亦即,函式寫入至外部變數或解除參考指標中之值。
此外,可追蹤至少兩種類型之混淆。「複本混淆」可指示指標可為另一指標之複本,且可混淆指標可能會混淆之任何事項。「點混淆」可指示指標有可能會影響另一變數。相依性檔案中之混淆資訊為混淆可能存在之肯定表達。舉例而言,當編譯器簡單地歸因於混淆資訊之缺乏而不可告知兩個指標是否參考同一記憶體時,不需要使用該資訊。
變數之混淆之宣告可類似於傳回值之混淆之宣告。舉例而言,考慮以下函式:
在一實施中,此函式可表達以下相依性:
為清晰起見,上述內容區分點與複本,但在替代語法中有可能組合此等兩種概念。如同其他相依性資訊,混淆資訊通常經由呼叫函式鏈來向上傳播。
由函式傳回之值亦可(例如)經由傳回值本身或經由藉由修改由參考傳遞之變數所傳回的資訊而導致混淆。傳回值及資訊亦可在相依性檔案中追蹤。舉例而言,考慮以下函式:
在一實施中,此函式可匯出以下相依性:
相依性宣告可通知呼叫迴圈由foo()傳回之指標可為傳遞進入之指標的複本。此情形允許呼叫迴圈採取措施以確保迴圈之正確操作,而不管出現之混淆。此外,此知識亦可使編譯器能夠在面對不符合ANSI-C之程式碼時更好地充分利用ANSI混淆規則。
作為另一考慮事項,指標之強制轉型(casting)可影響位址計算。舉例而言,考慮以下函式:
在一實施中,此函式可匯出以下相依性:
歸因於在編譯階段並不知曉將呼叫何函式或被呼叫函式是否支援向量介面的事實,一般可不向量化經由函式指標之呼叫。經由指標呼叫其他函式之函式可能不匯出相依性資訊,此可為對指向函式之相依性之不確定性的反映。此情形可使編譯器將此等函式視為具有未知相依性之純量函式。
在一實施中,版本設定方案允許在任何時間使用最佳做 法來表達相依性。舉例而言,一實施例可准許與由較舊編譯器所產生之相依性檔案之回溯相容性,而另一實施例可准許使較舊編譯器亦能夠讀取由較新編譯器所產生之檔案之雙向相容性。在回溯相容性為僅有要求的狀況下,相依性檔案之版本指定符用以通知較舊編譯器給定檔案不可讀取且應忽略。
可如下實施雙向相容性。舉例而言,假設編譯器版本1不支援陣列索引之計算,但編譯器版本2支援陣列索引之計算。可藉由版本1編譯器將至B[x+y]之寫入表達為:
另一方面,版本2編譯器可另外使用版本2語法匯出相同函式:
藉由此方法,不僅版本2編譯器可讀取版本1檔案,而且可允許版本2宣告取代版本1宣告。版本1編譯器將知曉忽略大於版本1之任何宣告,從而給出如其能夠理解般多的相依性資訊。隨著編譯器技術的成熟,此為顯著能力。
大體而言,若要求開發者對軟體進行改變以實現向量化,則相對少的程式碼可成為向量化的。為了解決此問題,本文中所描述之技術提供在不要求開發者修改其原始程式碼的情況下執行大規模向量化之能力。
儘管已以相當多的細節描述了以上實施例,但在充分瞭解說明書後,眾多變化及修改對於熟習此項技術者即將變得顯而易見。意欲將以下申請專利範圍解譯為包含所有此等變化及修改。
100‧‧‧電腦系統
110a‧‧‧處理器
110b‧‧‧處理
110n‧‧‧處理器
120‧‧‧系統記憶體
130‧‧‧I/O介面
140‧‧‧網路介面
150‧‧‧儲存介面
155‧‧‧儲存裝置
200‧‧‧編譯器
210‧‧‧原始程式碼
220‧‧‧前端
230‧‧‧後端
240‧‧‧最佳化器
250‧‧‧程式碼產生器
260‧‧‧純量目的程式碼
270‧‧‧經向量化之目的程式碼
280‧‧‧相依性資料庫
圖1為說明根據某些實施例之可操作以實施用於實現軟體應用程式之通用向量化的技術之電腦系統的方塊圖。
圖2為說明根據某些實施例之在由電腦系統執行時可產生可執行程式碼之編譯器的方塊圖。
圖3展示說明根據某些實施例之在相依性資料庫中表達相依性之方法的流程圖。
圖4展示說明根據某些實施例之向量化一函式之方法的流程圖。
圖5展示說明根據某些實施例之全函式向量化方法的流程圖。
圖6展示說明根據某些實施例之使用經向量化之函式的方法的流程圖。

Claims (20)

  1. 一種用於以編譯器為基礎之程式碼之向量化的方法,其包含:藉由一或多個電腦執行以下步驟:在編譯包括一呼叫函式之原始程式碼的一程序期間,識別該呼叫函式,該呼叫函式包括對先前編譯的一被呼叫函式之一呼叫;存取與該被呼叫函式相關聯之一持續相依性資料庫以擷取一經表達之相依性,其中在先前編譯的該被呼叫函式之編譯期間,產生且持續儲存該經表達之相依性至該持續相依性資料庫,其中該經表達之相依性指示先前編譯的該被呼叫函式是僅讀取一資料項目,僅寫入該資料項目,抑或讀取該資料項目與寫入該資料項目兩者;及至少部分地基於該經表達之相依性且不存取先前編譯的該被呼叫函式之原始程式碼來產生該呼叫函式是否與先前編譯的該被呼叫函式互動的一判定。
  2. 如請求項1之方法,其中對先前編譯的該被呼叫函式之該呼叫出現於該呼叫函式之一迴圈內。
  3. 如請求項1之方法,其中該執行進一步包括:自該持續相依性資料庫判定先前編譯的該被呼叫函式之一向量版本存在;及在該呼叫函式內,將對先前編譯的該被呼叫函式之一純量版本之一呼叫轉變為對先前編譯的該被呼叫函式之 該向量版本之一呼叫。
  4. 如請求項1之方法,其中該執行進一步包括基於由該持續相依性資料庫所指示之以下項目中之一或多者來判定是否向量化該呼叫函式之至少一部分:變數是否由該呼叫函式讀取或寫入;該變數對於該呼叫函式是否為公用或私用;或與該變數相關聯之一定址模式。
  5. 如請求項1之方法,其中該執行進一步包括:編譯對應於一被呼叫函式之原始程式碼;在編譯期間,識別該被呼叫函式對該資料項目之一經表達之相依性,其中該經表達之相依性指示該函式是僅讀取該資料項目,僅寫入該資料項目,抑或讀取該資料項目與寫入該資料項目兩者;及將該經表達之相依性之一指示儲存於該持續相依性資料庫中。
  6. 如請求項5之方法,其中儲存該經表達之相依性之該指示包括除儲存該變數之一名稱以外,亦將以下各者中之一或多者之一指示儲存於該持續相依性資料庫中:該變數對於該被呼叫函式是否為公用或私用;或與該變數相關聯之一定址模式。
  7. 如請求項5之方法,其中該執行進一步包括:產生具有一向量介面之該被呼叫函式之一向量版本;及將該向量介面之一指示儲存於該持續相依性資料庫中。
  8. 如請求項5之方法,其中該執行進一步包括在該被呼叫函式之編譯階段產生該持續相依性資料庫。
  9. 如請求項5之方法,其中儲存該指示包含表達以下各者中之一或多者:與該被呼叫函式內之該資料項目相關聯的一定址模式;與該被呼叫函式內之該資料項目相關聯的一公用或私用限定詞;與該被呼叫函式相關聯之一推測安全指示符;或與該被呼叫函式內之該資料項目相關聯的一混淆指示符。
  10. 如請求項5之方法,其中儲存該指示包含表達以下各者中之一或多者:該被呼叫函式是否讀取或寫入至一指向物件內之一已知位移的一指示;該被呼叫函式是否讀取或寫入至一物件內之一變數位移的一指示;或該被呼叫函式是否讀取或寫入至一物件內之一未知位移的一指示。
  11. 如請求項1或請求項5之方法,其中該資料項目並非經由該函式之程式設計介面而傳遞至該被呼叫函式中之一參數。
  12. 如請求項1之方法,其中該執行進一步包括:至少部分地基於該判定來向量化該呼叫函式內之程式碼。
  13. 如請求項12之方法,其中向量化該呼叫函式內之程式碼進一步包括:至少部分地基於該判定來向量化該呼叫函式內之一迴圈。
  14. 如請求項12之方法,其中向量化該呼叫函式內之程式碼進一步包括:修改該呼叫以參考該被呼叫函式之一向量版本。
  15. 如請求項1之方法,其中該等操作進一步包括: 取決於該呼叫函式是否與先前編譯的該被呼叫函式互動之該判定,至少部分地基於該經表達之相依性來判定是否向量化該呼叫函式之至少一部分;及回應於判定向量化該呼叫函式之至少一部分,產生在執行時引起同時對該呼叫函式內所參考之多個資料項目執行一向量運算的向量程式碼。
  16. 如請求項15之方法,其中儘管先前編譯的該被呼叫函式之原始程式碼不可用,但該判定操作判定向量化該呼叫函式之至少一部分。
  17. 如請求項1之方法,其中該呼叫函式包含一非葉迴圈,該非葉迴圈包括對該被呼叫函式之該呼叫。
  18. 如請求項17之方法,其中該執行進一步包括:向量化該非葉迴圈之一第一部分;及串列化該非葉迴圈之一第二部分。
  19. 一種用於以編譯器為基礎之程式碼之向量化的電腦可讀儲存媒體,該電腦可讀儲存媒體具有儲存於其中之程式指令,該等程式指令回應於藉由一電腦系統之執行而使該電腦系統執行實施如請求項1至18中任一項之方法的操作。
  20. 一種用於以編譯器為基礎之程式碼之向量化的系統,其包含:一或多個記憶體,其在操作期間儲存指令;及一或多個處理器,其在操作期間自該一或多個記憶體擷取指令且執行該等指令以使該系統執行實施如請求項1至18中任一項之方法的操作。
TW100134227A 2010-09-23 2011-09-22 用於以編譯器為基礎之非葉程式碼之向量化的系統及方法 TWI446267B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/888,644 US8621448B2 (en) 2010-09-23 2010-09-23 Systems and methods for compiler-based vectorization of non-leaf code
US12/888,658 US8949808B2 (en) 2010-09-23 2010-09-23 Systems and methods for compiler-based full-function vectorization
PCT/US2011/050713 WO2012039937A2 (en) 2010-09-23 2011-09-07 Systems and methods for compiler-based vectorization of non-leaf code

Publications (2)

Publication Number Publication Date
TW201224933A TW201224933A (en) 2012-06-16
TWI446267B true TWI446267B (zh) 2014-07-21

Family

ID=44937720

Family Applications (1)

Application Number Title Priority Date Filing Date
TW100134227A TWI446267B (zh) 2010-09-23 2011-09-22 用於以編譯器為基礎之非葉程式碼之向量化的系統及方法

Country Status (9)

Country Link
KR (1) KR101573586B1 (zh)
CN (1) CN103119561B (zh)
AU (1) AU2011305837B2 (zh)
BR (1) BR112013008640A2 (zh)
DE (1) DE112011103190T5 (zh)
GB (1) GB2484000A (zh)
MX (1) MX2013003339A (zh)
TW (1) TWI446267B (zh)
WO (1) WO2012039937A2 (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9298456B2 (en) * 2012-08-21 2016-03-29 Apple Inc. Mechanism for performing speculative predicated instructions
US9817663B2 (en) 2013-03-19 2017-11-14 Apple Inc. Enhanced Macroscalar predicate operations
US9348589B2 (en) 2013-03-19 2016-05-24 Apple Inc. Enhanced predicate registers having predicates corresponding to element widths
US9830134B2 (en) * 2015-06-15 2017-11-28 Qualcomm Incorporated Generating object code from intermediate code that includes hierarchical sub-routine information
CN106371838B (zh) * 2016-08-31 2019-10-18 福建联迪商用设备有限公司 一种维护软件包依赖关系的方法及系统
CN108733432B (zh) * 2017-04-14 2021-12-21 创新先进技术有限公司 编程环境下私有方法的实现方法、调用方法及其装置
US10379825B2 (en) * 2017-05-22 2019-08-13 Ab Initio Technology Llc Automated dependency analyzer for heterogeneously programmed data processing system
WO2019089918A1 (en) * 2017-11-03 2019-05-09 Coherent Logix, Inc. Programming flow for multi-processor system
CN109240666B (zh) * 2018-06-22 2020-08-25 北京大学 基于调用栈和依赖路径的函数调用代码生成方法及系统
US11809871B2 (en) * 2018-09-17 2023-11-07 Raytheon Company Dynamic fragmented address space layout randomization
US11366648B2 (en) * 2020-05-28 2022-06-21 Red Hat, Inc. Compiling monoglot function compositions into a single entity
CN112214221B (zh) * 2020-10-10 2023-04-28 上海上讯信息技术股份有限公司 一种用于Linux系统构建的方法与设备
CN113342319B (zh) * 2021-05-24 2024-03-22 重庆长安汽车股份有限公司 一种can故障诊断的软件代码自动生成的方法及系统
CN113536316B (zh) * 2021-06-17 2023-08-11 深圳开源互联网安全技术有限公司 组件依赖信息的检测方法及装置

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09198254A (ja) * 1996-01-17 1997-07-31 Nec Ic Microcomput Syst Ltd コンパイラの最適化装置及びその方法
JP2002073333A (ja) * 2000-08-25 2002-03-12 Hitachi Ltd 手続き呼び出し先のデータ依存の解析表示方法
JP2004246776A (ja) * 2003-02-17 2004-09-02 Ricoh Co Ltd 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム
US7617496B2 (en) 2004-04-23 2009-11-10 Apple Inc. Macroscalar processor architecture
US7395419B1 (en) 2004-04-23 2008-07-01 Apple Inc. Macroscalar processor architecture
US7506331B2 (en) 2004-08-30 2009-03-17 International Business Machines Corporation Method and apparatus for determining the profitability of expanding unpipelined instructions
JP2009129179A (ja) * 2007-11-22 2009-06-11 Toshiba Corp プログラム並列化支援装置およびプログラム並列化支援方法
US8255884B2 (en) * 2008-06-06 2012-08-28 International Business Machines Corporation Optimized scalar promotion with load and splat SIMD instructions
US8418161B2 (en) * 2008-11-24 2013-04-09 International Business Machines Corporation System and method for loading a called class file table with data indicating a highest version of a class file
CN101477472B (zh) * 2009-01-08 2011-11-16 上海交通大学 动态二进制翻译器中热路径的多核多线程构建方法

Also Published As

Publication number Publication date
CN103119561A (zh) 2013-05-22
DE112011103190T5 (de) 2013-06-27
TW201224933A (en) 2012-06-16
AU2011305837A1 (en) 2013-03-28
KR20130096738A (ko) 2013-08-30
WO2012039937A2 (en) 2012-03-29
GB201116429D0 (en) 2011-11-02
AU2011305837B2 (en) 2015-05-14
WO2012039937A3 (en) 2012-09-20
MX2013003339A (es) 2013-06-24
KR101573586B1 (ko) 2015-12-01
GB2484000A (en) 2012-03-28
BR112013008640A2 (pt) 2016-06-21
CN103119561B (zh) 2016-03-09

Similar Documents

Publication Publication Date Title
TWI446267B (zh) 用於以編譯器為基礎之非葉程式碼之向量化的系統及方法
US8621448B2 (en) Systems and methods for compiler-based vectorization of non-leaf code
US8949808B2 (en) Systems and methods for compiler-based full-function vectorization
US9529574B2 (en) Auto multi-threading in macroscalar compilers
US9798528B2 (en) Software solution for cooperative memory-side and processor-side data prefetching
US7856627B2 (en) Method of SIMD-ization through data reshaping, padding, and alignment
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US20090150890A1 (en) Strand-based computing hardware and dynamically optimizing strandware for a high performance microprocessor system
US9009689B2 (en) Speculative compilation to generate advice messages
US8161465B2 (en) Method and apparatus for performing conditional compilation
US20090217020A1 (en) Commit Groups for Strand-Based Computing
Noonan et al. Polymorphic type inference for machine code
US20190079805A1 (en) Execution node selection method and information processing apparatus
US20090307674A1 (en) Improving data locality and parallelism by code replication and array contraction
Schardl et al. Tapir: Embedding recursive fork-join parallelism into llvm’s intermediate representation
Gruber et al. Bringing compiling databases to RISC architectures
CN112130848B (zh) 一种面向便笺式存储器的带宽感知循环分块优化方法、编译系统、设备及存储介质
Schommer et al. Embedded program annotations for WCET analysis
Barua et al. OMPSan: static verification of OpenMP’s data mapping constructs
Larsen et al. Compiler driven code comments and refactoring
Chatelet et al. automemcpy: a framework for automatic generation of fundamental memory operations
Zhou Guided automatic binary parallelisation
Prabhu Just in time compilation for high performance computing
Liu Safe and Efficient Concurrency for Modern Programming Languages
Jammer Characterization and translation of OpenMP use cases to MPI using LLVM

Legal Events

Date Code Title Description
MM4A Annulment or lapse of patent due to non-payment of fees