專利名稱:軟件應用性能增強的制作方法
軟件應用性能增強其它申請的交叉引用此申請要求于2008年8月13日提交的題目為METHOD AND APPARATUS TO ENHANCE PERFORMANCE OF SOFTWARE APPLICATIONS的美國臨時專利申請號61/188,905的優先權,為了所有目的在此將其并入以供參考。
背景技術:
在計算機系統中,在軟件的性能和效率方面的改進能夠實現新的和改進的應用和功能。在要求更強大的硬件(更強大的硬件進而能夠實現更強大的軟件)的更強大的軟件之間的這種互相促進的交互作用已經成為過去數十年的信息革命的驅動器。在“指令集兼容的”計算的歷史中,較新的各代計算機硬件已經對現有應用提供了相當大的改進,而新的且重新編譯的應用提供了超過硬件改進的另外改進。然而,由于計算機硬件體系結構技術已經成熟,所以對于微處理器廠商而言,通過微體系結構技術給出增大的性能已變得愈加困難。由于技術正擴展到用以在計算的線程內改進指令級并行性的成本效益技術的極限,所以許多業內人士把線程級并行性看作用以繼續性能單調工作的最好技術。因此,制造者已經開始生產在單個半導體“芯片”內包含多個處理器的“多核”CPU。與此相呼應,主要的SW開發者已經開始利用多核處理器的性能潛力要求重新編寫應用。作為這些發展的結果,現有應用可能常常不再期望新的各代計算機硬件在性能方面有相當大的改進。大規模的性能改進通常僅可獲得于具體地以較新的多核處理器為目標的重新編寫的應用。此外,對多線程應用進行編程以利用多處理器體系結構的過程常常是復雜且易于出錯的。
圖;3B是圖示在應用到性能增強的多處理器硬件系統的實施例中的CPU的映射的圖。為了并行計算,對應用的(一個或多個)主線程進行分析。對被認為合格于并行計算的部分,諸如組成部分i,ii,…,m,進行重新配置以便以多個線程的形式在各自的CPU上運行,因此這達到了高度的并行化和改進的性能。圖4是圖示用于從輸入代碼生成并行可執行代碼的過程的實施例的流程圖。在各種實施例中,過程400可以在端用戶的計算機上進行,或者在軟件開發時間在開發者的系統上進行。在各種實施例中,源代碼、匯編代碼、和/或者二進制代碼能夠被用作輸入代碼。 在402,對所述輸入代碼進行靜態分析。如本文所使用的,所述靜態分析指對在該分析期間不被要求是正執行的代碼的分析。靜態分析可以在對系統資源的需求低的時間脫機進行。 在一些實施例中,所述靜態分析對所述輸入代碼進行反匯編,并標識所述輸入碼的數據部分和代碼部分,包括指令、操作、以及數據流和控制流的方面。被標識出的信息中的一些包括被包含在數據段中的數據,被包含在代碼段中的代碼,有助于上述數據的處理的頭信息。數據流和控制流的某些方面,諸如依賴于代碼的行為的信息,可能難以使用靜態分析獲得。因而,在404,對所述輸入代碼進行動態分析以標識數據流和控制流的另外方面。 如本文所使用的,動態分析指在代碼執行時進行的聯機或者運行時分析。在各種實施例中, 執行頻率、熱點和其它簡檔信息、分支目標、存儲器別名信息、以及動態循環計數等等是經由動態分析標識的方面中的一些。此信息可以在運行時經由對代碼的解析或者仿真,和/ 或通過執行測量(instrumented)代碼來收集。在406,基于通過所述靜態分析標識的方面以及通過所述動態過程標識出的另外方面,生成輸入代碼的中間表示(IR)。在408,頂被進一步處理以標識合格于并行執行的部分,并且對該中間表示進行操縱以形成包括并行化部分的經修改的頂。可以使用多種并行化技術。例如,可以使用諸如軟件流水線化之類的技術展開循環,可以插入動態檢查以將數據依賴轉變成控制依賴。在410,頂被發送給代碼生成器,所述代碼生成器基于該頂生成并行化的可執行代碼。在412,存儲該并行化的可執行代碼。圖5是圖示用于從輸入代碼生成并行可執行代碼的過程的另一實施例的流程圖。 在各種實施例中,過程500可以在端用戶的計算機上進行,或在軟件開發時間在開發者的系統上進行。在502,對輸入代碼進行靜態分析以標識該輸入代碼的數據流和控制流的方面。在一些實施例中,任選地實行動態分析以確定該輸入代碼的數據流和控制流的另外方面。在一些實施例中,動態分析被省略。在504,至少部分基于通過靜態分析確定的數據流和控制流的所述方面生成所述輸入代碼的中間表示。如果已經實行了動態分析,則頂也還會至少部分地基于所述另外方面的。在506,對頂進行處理。標識頂中可并行化的部分, 并且生成并行化的可執行代碼。在508,存儲該并行化的可執行代碼,以使得后期可以再次使用它。保持該并行化的可執行代碼和原始輸入代碼之間的映射。在510,響應于執行該輸入代碼的請求,把存儲的并行化的可執行代碼加載到存儲器并執行以代替原始代碼。如下面將更加全面地描述的,在不同實施例中,可以使用多種高速緩沖技術來存儲可執行文件。圖6是圖示靜態分析過程的實施例的流程圖。該過程開始于602,響應于用戶請求、響應于程序調用等等而處于啟動時間。在604,掃描文件系統以獲得可執行文件、任何引用的動態鏈接庫(dynamically linked libraries,DLL)、和/或共享對象(shared object, SO)文件。任選地,標識頻繁使用/最近使用的和/或更新的應用和庫。在606,對于每個文件,打開并讀取該文件。在608,如果可獲得則分析諸如來自先前運行的運行時統計之類的動態數據。在610,對該文件進行反匯編并轉變成靜態生成的中間表示。在612,對頂實行轉換。在一些實施例中,所述轉換涉及分析該代碼并標識所述頂中能夠并行運行的部分。 在一些實施例中,所述轉換涉及添加測量代碼,所述測量代碼將便于對運行時信息的測量, 諸如熱點和其它簡檔信息、分支目標信息、存儲器別名信息、以及動態循環計數信息等等的分析。在一些實施例中,所述轉換涉及修改所述代碼。在614,創建可能的線程,包括檢查器代碼和其它測量,諸如針對要求運行時助手(runtime assistance)的項的向回到運行時的鏈接,諸如針對錯誤恢復。在616,發射 (emit)代碼和注解。如果該應用尚未被并行化,則存儲所述代碼和注解。DLL或者其它庫代碼可以以不同的方式被并行化,這取決于調用代碼。在一些實施例中,針對這些DLL生成多個并行化,且每個拷貝都與調用應用/功能相關聯。圖7是圖示動態分析過程的實施例的流程圖。過程700起始于702,響應于用戶請求、響應于程序調用等等而處于啟動時間。該過程觀察(observe)以獲得程序調用。在 704,發現了調用且所述代碼被截取。在706,確定該程序是否已經被加速。如果存在所存儲的部分或完全并行化的版本,則該程序被認為已經被加速。所述并行化的和/或加強的版本可能來自上面描述的靜態分析過程,或來自先前的動態分析過程。在708,如果該程序已經被加速,則獲取先前存儲的代碼。在710,在適宜時實行優化和鏈接。在712,轉移控制并執行該代碼。在714,在執行期間,在適宜時收集諸如運行時統計之類的動態數據。諸如被添加到該代碼的計數器之類的測量代碼可以提供這樣的運行時統計。存儲所述數據。然而,在716,如果未發現并行化的和/或加強的版本且該程序未被預并行化,則該過程截取該代碼并開始諸如測量之類的最小侵犯性監測以標識熱點。在717,分析以及并入諸如來自先前或當前的執行的運行時統計之類的動態數據。在718,對該程序代碼進行反匯編并轉變成中間表示。在720,分析和轉換所述頂,其中,根據需要插入測量代碼,并且可以對該代碼進行并行化。在722,創建可能的線程。在724,發射可執行代碼和注解,并在適宜時寫入和存儲到非易失性存儲器。在未修改/最低限度的測量代碼和被修改的/并行化的代碼之間建立映射。然后,在712,將控制轉移到被修改的/并行化的代碼,并且收集諸如運行時統計之類的動態數據。如果需要,可以重復過程700。例如,該運行時系統可以指示應當重復該過程并應當重新生成代碼,這是因為所述熱點已經隨時間改變了,或者,如同后面將更詳細地描述的,推測選擇不正確。圖8是圖示實現圖4和5中所描述的過程的性能得以增強的系統的實施例的框圖。在示出的該示例中,所述輸入代碼包括一個或多個源可執行文件1,其通常通過對以高級語言編寫的應用程序的編譯過程來創建。在一些實施例中,所述源可執行文件包括二進制代碼,諸如由編譯器生成的代碼、動態鏈接庫(DLLs)、共享對象文件(SOs)、或組合。在示出的該示例中,所述源可執行文件被安裝在與所述性能增強器相同的系統中。該應用可以包括直接的、顯式的線程化,基于線程庫的間接線程化,或者組合。假設示出的該系統將存儲器組織為多個段,諸如可執行區域,已初始化和未初始化的靜態分配的數據,堆棧和動態分配的數據。當程序被調用(作為用戶動作(諸如鼠標點擊)的直接結果或者其它原因(例如,由另一程序觸發或響應于網絡事件))時,對存儲器空間進行初始分配。操作系統將使用加載器把可執行文件加載到存儲器中,并在必要時重新分配并與其它可執行文件鏈接。控制隨后被轉移給新調用的程序。在示出的該示例中,所述性能增強器包括下列功能組件反匯編器/轉變器5,并行化器7,代碼發射器8,執行管理器9,配置管理器12,以及文件高速緩沖存儲器管理器4。 一些組件的操作可以部分或完全包括在其它組件中。所述組件中的一些是任選的。在接收指向代碼的區域(S卩,用于存儲操作碼的第一位的存儲單元)的指針時,反匯編器/轉變器5對該指令進行反匯編。此過程標識所述輸入代碼中的指令和操作數,并將此信息連同其它全局信息(諸如處理器模式)轉變為中間表示(IR)6。該中間表示表示所述輸入代碼的數據結構和程序信息。可以由編譯器分析和操縱該IR,該編譯器基于所述頂實行優化和轉換。一些編譯器采用多個IR,以使得數據格式隨著時間改變以便于不同的編譯階段。頂通常包括關于要實行的操作的信息、這些操作所依賴的(源)數據以及目標數據。圖9是圖示中間表示的示例的圖。在此示例中,示出了用于計算斐波納契 (Fibonacci)序列的功能的低級虛擬機(Low Level Virtual Machine, LLVM) IR0針于該功
能的源代碼如下
lntfib(intn){
if (n=l) return 0; fi (n=2) return 1; return (fib(n-l>ffib(n-2));
}返回到圖8,從反匯編得到的該頂被并行化器7處理,該并行化器7生成新的IR。 在此示例中,該并行化器類似于現代的、優化的編譯器,其包含最終導致可執行代碼的生成的多個優化“遍次(pass)”。在源輸入已經被轉變為中間表示之后,這些遍次將對所述中間表示進行轉換。每個遍次直接或間接地改進了頂,這為隨后的優化階段準備頂。示例優化包括死代碼消除、常量傳用、循環不變量分析以及循環展開。在一些實施例中,一些遍次可能簡單對頂進行分析并為隨后的遍次創建另外的優化結構。除了多個優化和轉換算法它們自身之外,還存在指導何時或在何種環境下應用這些優化的程式化地編碼判斷(也被稱作啟發式)。例如,如果展開循環將增加代碼大小并超出存儲需求,因此抵消了展開的好處的話,則可能并不希望展開循環。另外,還存在對各種遍次進行排序的較高級別控制。在所述并行化器的一些實施例中,采用多個遍次來標識和提取線程級并行性。這些優化使得能夠在共享公共存儲器的各自CPU上運行的獨立的執行線程得以創建。并行化器可以靜態或動態操作。在一些實施例中,并行化器混合了靜態/脫機分析和動態/運行時分析二者以改進性能。當并行化器正動態操作以實行比簡單的運行時檢查更復雜的優化時,可以改變實行這些操作的地方和方式以使該另外處理的性能影響最小化。在一些實施例中,所述操作和分析在來自于正在運行的應用的單獨的進程或線程中實行。在一些實施例中,所述操作在與該應用相同的進程或線程中實行。在一些實施例中,并行化器可以調用涉及性能增強的線程級并行性的猜測(guess)的優化。在這樣的情況下,所述并行化器被說成用以對并行性進行“推測 (speculate)”。插入代碼以證實該推測正確。例如,所述并行化器推測長運行過程調用將返回結果“0”。推測使得先前需要等待此結果的代碼能夠并行運行。然而,在允許此代碼提交結果之前,有必要驗證前述過程確實真返回結果“0”。在另一示例中,如果循環的多次迭代在不同的線程中執行,則可能有必要確保僅僅提交來自編程者規定數目次迭代的結果。因而,錯誤迭代的影響可能需要被消除或者緩沖。在這些類型的推測并行化中,生成的代碼被構造為依賴于與運行時環境11結合描述的運行時支持并與其緊密工作。可以存在控制推測、數據推測以及存儲器定序推測中的任何或全部。在一些實施例中,所述并行化器把所述推測和存儲器模型視為是事務性的。在一些實施例中,推測在系統中實行,所述系統允許實時或者脫機但仍在目標系統上的重新編譯。在推測的和/或事務性的系統中,有必要檢測沖突并支持數據版本化 (data versioning)。各種實施例利用被分類為“熱切”或“懶慢”的方法。例如,熱切數據版本化方法將采用撤消-日志以把不正確計算的值恢復到它們的先前狀態,而懶慢方法將采用把數據的不同版本寫入到的寫緩沖器。每種方法都有優點和缺點。在靜態編譯器中,尤其是不具備簡檔引導的反饋的編譯器,該編譯器能猜測哪個模式將是最好的并選擇那個選項。實際上,最好的技術常常依賴于在編譯時間不可獲得的運行時信息(諸如實際延遲)。 換句話說,最好的選擇可能是在運行時做出的選擇。此外,由于程序可能經受不同的執行階段(各階段之間具有非常不同的特性),所以可能不存在單個的最好選擇。動態并行化器可以對要采用的技術的最好組合做出初始猜測,隨著時間的推移觀察該程序的行為,并隨著該程序變化改進其選擇以及生成采用產生更好結果的替換技術的新代碼。返回到圖8,代碼發射器8處理并行化的頂以創建二進制編碼的、可運行的指令。 通常在此階段分配寄存器并選擇具體指令。在一些實施例中,除了直接對應于原始源程序的指令之外,可以包括用以執行測量的另外指令。所述測量能夠標識程序特性,諸如代碼被反復調用的熱點、諸如分支目標或存儲器別名信息之類的運行時信息。在一些實施例中,所述代碼發射器操作在來自正運行的所述應用的單獨的進程或線程中被實行。在一些實施例中,所述代碼發射器操作被包含在并行化器7中或執行管理器9中。修改的(例如,測量的和/或并行化的)應用可以包括控制/指令的多個線程、 靜態和/或動態分配的數據、以及用以提供另外的運行時支持的到庫的鉤子(hook)或者鏈接。在具有動態反匯編的和動態生成的代碼的環境中,存儲器中映像(in-memory image) 10,其中,每個代碼塊末尾可以包括返回到控制/管理過程的分支。在諸如此之類的協作的、多線程化的環境中,每個線程都被看作是“輕量”的并希望將計算組織成這樣的線程的工作隊列。所述工作隊列由運行時系統11管理。在應用被安裝并運行的系統上對應用進行并行化的環境中(與在軟件開發時間進行并行化相反),為該應用創建修改的操作環境以便維持單個線程的操作的外部特征 (appearance)和正確性。例如,經修改的應用可以具有同時在多個CPU上運行且需要共享存儲器的多個線程。所述多個線程需要具有對應的資源拷貝,諸如多個“程序計數器”和多個堆棧。這些資源被組織和管理為虛擬機和運行時環境11。運行時資源可以包括線程管理器、存儲器管理器、異常處理程序和通用程序庫和OS設備的新/替換的拷貝。這些中的所有都被用于便于推測的/事務性的操作。在一些實施例中,運行時功能可以是該經修改的應用的存儲器中映像的一部分。當進行在計算上昂貴的優化和轉換并發射代碼時,在一些實施例中,此工作的輸出被保存以供調用該源程序的未來時機使用。例如,在分析之后,創建添加了用以收集簡檔信息的測量代碼的該程序的新版本。下一次運行該程序,添加的測量代碼被用來搜集信息,諸如程序花費了其大量執行時間的“熱點”的位置。另一示例是插入運行時存儲器別名分析。另一示例是該應用的并行化版本,或者具有另外的、最小運行時檢查的多個并行化版本。新的加強的可執行文件被寫到一個或多個文件。在一些實施例中,為了限制用來存儲這些文件的空間量,任選采用文件高速緩沖存儲器管理器4。在一些實施例中,文件高速緩沖存儲器管理器管理保留最頻繁使用的文件的高速緩沖存儲器。在其它實施例中,可以采用不同的管理策略。例如,可以使用最近使用的策略或最頻繁使用的策略的一些組合。保持(一個或多個)源可執行文件和這些文件之間的映射。只要程序被調用且并行化被認為是希望的,就要對此高速緩沖存儲器進行檢察以確定該應用的并行化的(或測量的版本)是否存在。如果有,則把此信息送給執行管理器9,以使得將對應的文件加載到存儲器中并運行以代替原始調用的可執行文件。在一些實施例中,包括任選的執行管理器9以跨越上述多個模塊和多個“靜態”和 “動態”步驟進行協調。在目標系統上在公共管理器下將這些功能鏈接在一起允許根據需要混合和調用該動態和靜態工作。例如,執行管理器可以注意到由于已經下載并安裝了更新所以應用已經改變。因此所述執行管理器會啟動靜態分析。在一些實施例中,執行管理器操作可以被包含在高速緩沖存儲器管理器4中、并行化器7中、或代碼發射器8中。圖10是圖示程序表示以及它們彼此的關系的若干示例的圖。例如,程序可以以源形式(以高級語言或匯編環境編碼)、作為二進制可執行文件的目標形式(已編譯但仍不可執行)存在。系統模塊能夠將多個目標文件鏈接在一起,這創建了更大、更完整的可執行文件。當程序被調用時,其它系統模塊能夠將該程序加載到存儲器中。運行的駐留存儲器應用可以直接或在解釋器內運行。該程序也可以以其中間表示的形式存在于編譯器內,且編譯器的代碼生成器能夠將那個相同的程序轉換成可執行形式,該可執行形式可以被寫入文件,加載到存儲器中,并直接運行或者傳遞給解釋器或運行時以供執行。盡管為了清楚理解的目的,已經對上述實施例進行了詳細描述,但本發明并不限于所提供的細節。存在許多實現本發明的替換方式。這里所公開的實施例是例證性的而并非限制性的。
權利要求
1.一種用于從輸入代碼生成并行化的可執行代碼的系統,包括 一個或多個處理器,其被配置成靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 動態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的另外方面; 至少部分基于通過所述靜態分析標識的所述輸入代碼的數據流和控制流的所述方面以及通過所述動態分析所標識的所述輸入代碼的數據流和控制流的所述另外方面生成所述輸入代碼的中間表示;以及處理所述中間表示以確定所述中間表示的可能合格于并行執行的部分;以及生成并行化的可執行代碼。耦合到所述一個或多個處理器的一個或多個存儲器,其被配置成向所述一個或多個處理器提供指令。
2.如權利要求1所述的系統,其中,所述輸入代碼是二進制代碼。
3.如權利要求1所述的系統,其中,所述靜態分析包括對所述輸入代碼進行反匯編并將所述輸入代碼轉換成靜態生成的中間表示。
4.如權利要求1所述的系統,其中,所述靜態分析包括標識所述靜態中間表示中可能合格于并行執行的部分。
5.如權利要求1所述的系統,其中,所述靜態分析包括插入測量代碼。
6.如權利要求1所述的系統,其中,所述靜態分析包括插入測量代碼;以及所述動態分析包括執行所述測量代碼。
7.如權利要求1所述的系統,其中,所述動態分析包括確定簡檔信息。
8.如權利要求1所述的系統,其中,所述動態分析包括確定熱點信息。
9.如權利要求1所述的系統,其中,所述動態分析包括確定分支目標信息。
10.如權利要求1所述的系統,其中,所述動態分析包括確定存儲器別名信息。
11.如權利要求1所述的系統,其中,所述動態分析包括確定動態循環計數信息。
12.如權利要求1所述的系統,還包括修改所述中間表示以包含并行化的部分;以及基于修改的中間表示生成加速代碼。
13.如權利要求1所述的系統,其中,推測地確定所述中間表示的合格于并行執行的部分。
14.如權利要求1所述的系統,其中推測地確定所述中間表示的合格于并行執行的部分,并插入驗證代碼。
15.一種從輸入代碼生成并行化的可執行代碼的方法,包括靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 動態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的另外方面; 至少部分基于通過所述靜態分析標識的所述輸入代碼的數據流和控制流的所述方面以及通過所述動態分析標識的所述輸入代碼的數據流和控制流的所述另外方面生成所述輸入代碼的中間表示;以及處理所述中間表示以確定所述中間表示的合格于并行執行的部分。
16.一種從輸入代碼生成并行化的可執行代碼的計算機程序產品,所述計算機程序產品被包含在計算機可讀存儲媒體中,并包括用于下列的計算機指令靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 動態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的另外方面; 至少部分基于通過所述靜態分析標識的所述輸入代碼的數據流和控制流的所述方面以及通過所述動態分析標識的所述輸入代碼的數據流和控制流的所述另外方面生成所述輸入代碼的中間表示;處理所述中間表示以確定所述中間表示的合格于并行執行的部分。
17.一種從輸入代碼生成并行化的可執行代碼的系統,包括 一個或多個處理器,其被配置成靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 至少部分基于數據流和控制流的所述方面生成所述輸入代碼的中間表示; 處理所述中間表示以生成并行化的可執行代碼; 存儲所述并行化的可執行代碼;以及響應于執行所述輸入代碼的請求,執行所存儲的并行化的可執行代碼;以及耦合到所述一個或多個處理器的一個或多個存儲器,其被配置成向所述一個或多個處理器提供指令。
18.一種從輸入代碼生成并行化的可執行代碼的方法,包括靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 至少部分基于數據流和控制流的所述方面生成所述輸入代碼的中間表示; 處理所述中間表示以生成并行化的可執行代碼; 存儲所述并行化的可執行代碼;以及響應于執行所述輸入代碼的請求,執行所存儲的并行化的可執行代碼。
19.一種從輸入代碼生成并行化的可執行代碼的計算機程序產品,所述計算機程序產品被包含在計算機可讀存儲媒體中,且包括用于下列的計算機指令靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面; 至少部分基于數據流和控制流的所述方面生成所述輸入代碼的中間表示; 處理所述中間表示以生成并行化的可執行代碼; 存儲所述并行化的可執行代碼;以及響應于執行所述輸入代碼的請求,執行所存儲的并行化的可執行代碼。
全文摘要
從輸入代碼生成并行化的可執行代碼包括靜態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的方面;動態分析所述輸入代碼以確定所述輸入代碼的數據流和控制流的另外方面;至少部分基于通過所述靜態分析標識的所述輸入代碼的數據流和控制流的所述方面,以及通過所述動態分析標識的所述輸入代碼的數據和控制流的所述另外方面,生成所述輸入代碼的中間表示;并處理所述中間表示以確定所述中間表示的合格于并行執行的部分;以及根據所處理的中間表示生成并行化的可執行代碼。
文檔編號G06F15/00GK102165428SQ200980131425
公開日2011年8月24日 申請日期2009年8月13日 優先權日2008年8月13日
發明者I·D·貝夫, J·K·瓊斯, M·D·夏普, R·S·德雷耶 申請人:特蘭斯塞拉公司