相關(guān)申請(qǐng)的交叉引用
本申請(qǐng)要求于2015年2月2日提交的美國(guó)臨時(shí)專利申請(qǐng)序列號(hào)62/110,738的優(yōu)先權(quán),其全部公開內(nèi)容通過引用并入本文。
背景技術(shù):
跨模塊優(yōu)化(cmo)(其通常意指過程間優(yōu)化(ipo))是使得編譯器能夠優(yōu)化用戶程序的最有效方式之一。傳統(tǒng)上,使用稱為鏈接時(shí)間優(yōu)化(lto)的技術(shù)實(shí)現(xiàn)cmo。lto是編譯模型,其在鏈接時(shí)啟用跨模塊優(yōu)化和整個(gè)程序分析(顧名思義)。然而,lto受到幾個(gè)限制,使其不適合用于非常大的應(yīng)用。這樣的限制包括例如:(1)lto需要大量的存儲(chǔ)器來執(zhí)行鏈接步驟;(2)鏈接步驟是連續(xù)的,并且大大減慢了整體編譯;和(3)lto不能輕易地與大型分布式構(gòu)建系統(tǒng)集成。
用于實(shí)現(xiàn)cmo的其它現(xiàn)有技術(shù)被稱為輕量級(jí)ipo(lipo),其比lto更具可擴(kuò)展性。然而,lipo受到自己的限制,并且在能夠進(jìn)一步提高lipo的性能方面已經(jīng)達(dá)到了上限。與lipo相關(guān)聯(lián)的事務(wù)的一些示例包括:(1)lipo需要簡(jiǎn)檔(profile)反饋,并且默認(rèn)不能啟用;(2)lipo對(duì)構(gòu)建系統(tǒng)非常侵入(例如,需要復(fù)雜的構(gòu)建系統(tǒng)支持來部署它);以及(3)lipo使用粗略粒度導(dǎo)入方法,其大大限制了cmo的潛力。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明內(nèi)容以簡(jiǎn)化形式介紹了概念的選擇,以提供對(duì)本公開的某些方面的基本理解。本發(fā)明內(nèi)容不是對(duì)本公開的廣泛概述,并且不旨在識(shí)別本公開的關(guān)鍵或重要要素或描繪本公開的范圍。本發(fā)明內(nèi)容只是將本公開的一些概念呈現(xiàn)為下面提供的具體實(shí)施方式的前序。
本公開一般涉及用于源代碼編譯的方法和系統(tǒng)。更具體地,本公開的方面涉及用于實(shí)現(xiàn)ipo的新的架構(gòu)。
如將在本文中更詳細(xì)地描述的,本公開的ipo架構(gòu)被設(shè)計(jì)為擴(kuò)展到非常大的程序,在其可以處理的源模塊的數(shù)量方面幾乎沒有限制,非???,并且針對(duì)默認(rèn)編譯模式(例如,默認(rèn)開啟)。此外,本文所述的ipo架構(gòu)設(shè)計(jì)為對(duì)單個(gè)機(jī)器并行構(gòu)建和大型分布式構(gòu)建系統(tǒng)都友好,并允許以最少的開銷進(jìn)行非常深入的優(yōu)化。
本公開的一個(gè)實(shí)施例涉及一種用于過程間優(yōu)化的方法,包括:為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件;為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù);在每個(gè)中間表示文件的單獨(dú)部分中存儲(chǔ)用于對(duì)應(yīng)的源代碼模塊的所生成的函數(shù)索引和函數(shù)摘要數(shù)據(jù);使用組合函數(shù)映射生成所生成的中間表示文件的精簡(jiǎn)檔案;以及對(duì)多個(gè)源代碼模塊執(zhí)行跨模塊優(yōu)化。
在另一個(gè)實(shí)施例中,在用于過程間優(yōu)化的方法中執(zhí)行跨模塊優(yōu)化包括使用組合函數(shù)映射執(zhí)行快速函數(shù)導(dǎo)入。
在另一個(gè)實(shí)施例中,在用于過程間優(yōu)化的方法中執(zhí)行跨模塊優(yōu)化包括使用來自一個(gè)或多個(gè)其它模塊的調(diào)試信息的需求驅(qū)動(dòng)的導(dǎo)入。
本公開的另一個(gè)實(shí)施例涉及一種計(jì)算機(jī)實(shí)現(xiàn)的方法,包括對(duì)多個(gè)源代碼模塊執(zhí)行跨模塊優(yōu)化,其中跨模塊優(yōu)化以模塊粒度并行,使用組合函數(shù)映射執(zhí)行快速函數(shù)導(dǎo)入,并使用來自其它模塊的調(diào)試信息的需求驅(qū)動(dòng)的導(dǎo)入。
在另一個(gè)實(shí)施例中,該方法還包括為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件。
在另一個(gè)實(shí)施例中,該方法還包括為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù)。
還在另一個(gè)實(shí)施例中,該方法還包括:為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件;為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù);在每個(gè)中間表示文件的單獨(dú)部分中存儲(chǔ)用于對(duì)應(yīng)的源代碼模塊的所生成的函數(shù)索引和函數(shù)摘要數(shù)據(jù);以及使用組合函數(shù)映射生成所生成的中間表示文件的精簡(jiǎn)檔案。
本公開的另一實(shí)施例涉及一種用于過程間優(yōu)化的系統(tǒng),包括至少一個(gè)處理器和耦合到至少一個(gè)處理器的非暫時(shí)性計(jì)算機(jī)可讀介質(zhì),具有存儲(chǔ)在其上的指令,所述指令當(dāng)由至少一個(gè)處理器執(zhí)行時(shí)使至少一個(gè)處理器:為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件;為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù);在每個(gè)中間表示文件的單獨(dú)部分中存儲(chǔ)用于對(duì)應(yīng)的源代碼模塊的所生成的函數(shù)索引和函數(shù)摘要數(shù)據(jù);使用組合函數(shù)映射生成所生成的中間表示文件的精簡(jiǎn)檔案;和對(duì)多個(gè)源代碼模塊執(zhí)行跨模塊優(yōu)化。
在另一個(gè)實(shí)施例中,用于進(jìn)程間優(yōu)化的系統(tǒng)中的至少一個(gè)處理器進(jìn)一步使使用組合函數(shù)映射執(zhí)行快速函數(shù)導(dǎo)入。
在另一個(gè)實(shí)施例中,用于過程間優(yōu)化的系統(tǒng)中的至少一個(gè)處理器進(jìn)一步使使用來自一個(gè)或多個(gè)其它模塊的調(diào)試信息的需求驅(qū)動(dòng)的導(dǎo)入。
本公開的另一個(gè)實(shí)施例涉及一種系統(tǒng),包括至少一個(gè)處理器和耦合到至少一個(gè)處理器的非暫時(shí)性計(jì)算機(jī)可讀介質(zhì),其具有存儲(chǔ)在其上的指令,所述指令當(dāng)由至少一個(gè)處理器執(zhí)行時(shí),使至少一個(gè)處理器:對(duì)多個(gè)源代碼模塊執(zhí)行跨模塊優(yōu)化,其中跨模塊優(yōu)化以模塊粒度并行,使用組合函數(shù)映射執(zhí)行快速函數(shù)導(dǎo)入,并且使用來自其它模塊的調(diào)試信息的需求驅(qū)動(dòng)的導(dǎo)入。
在另一個(gè)實(shí)施例中,系統(tǒng)中的至少一個(gè)處理器進(jìn)一步使:為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件。
在另一個(gè)實(shí)施例中,系統(tǒng)中的至少一個(gè)處理器進(jìn)一步使:為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù)。
在另一個(gè)實(shí)施例中,系統(tǒng)中的至少一個(gè)處理器進(jìn)一步使:為多個(gè)源代碼模塊中的每一個(gè)生成中間表示文件;為多個(gè)源代碼模塊中的每一個(gè)生成函數(shù)索引和函數(shù)摘要數(shù)據(jù);在每個(gè)中間表示文件的單獨(dú)部分中存儲(chǔ)用于對(duì)應(yīng)的源代碼模塊的所生成函數(shù)索引和函數(shù)摘要數(shù)據(jù);并且使用組合函數(shù)映射生成所生成的中間表示文件的精簡(jiǎn)檔案。
本文公開的一些或全部處理器和存儲(chǔ)器系統(tǒng)的實(shí)施例還可以被配置為執(zhí)行上述公開的方法實(shí)施例中的一些或全部。上面公開的方法中的一些或全部的實(shí)施例也可以被表示為在暫時(shí)性或非暫時(shí)性的處理器可讀存儲(chǔ)介質(zhì)(諸如光學(xué)或磁存儲(chǔ)器)上體現(xiàn)的指令,或者表示為經(jīng)由通信網(wǎng)絡(luò)(諸如互聯(lián)網(wǎng)或電話連接)提供給處理器或數(shù)據(jù)處理裝置的傳播信號(hào)。
從下面給出的具體實(shí)施方式中,本公開的方法和系統(tǒng)的適用性的其它范圍將變得顯而易見。然而,應(yīng)當(dāng)理解的是,具體實(shí)施方式和具體示例雖然指出了方法和系統(tǒng)的實(shí)施例,但是僅以說明的方式給出,因?yàn)樵诒疚墓_的概念的精神和范圍內(nèi)的各種改變和修改對(duì)于本領(lǐng)域技術(shù)人員來說根據(jù)該具體實(shí)施方式將變得顯而易見。
附圖說明
結(jié)合所附權(quán)利要求和附圖對(duì)以下具體實(shí)施方式的研究,本公開的這些和其它目的、特征和特性對(duì)于本領(lǐng)域技術(shù)人員將變得更加顯而易見,所有這些都形成本說明書的一部分。在附圖中:
圖1是圖示出根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的ipo系統(tǒng)中的示例階段的流程圖。
圖2是圖示出根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的示例ir生成過程的流程圖。
圖3是圖示出根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的使用惰性函數(shù)導(dǎo)入的示例ipo過程的流程圖。
圖4是圖示出根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的用于迭代惰性函數(shù)導(dǎo)入的示例方法的流程圖。
圖5是圖示出根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的布置用于創(chuàng)建跨模塊優(yōu)化的示例計(jì)算裝置的框圖。
本文提供的標(biāo)題僅為方便起見,并不一定影響本公開要求保護(hù)的范圍或含義。
在附圖中,相同的附圖標(biāo)記和任何縮略語識(shí)別具有相同或相似結(jié)構(gòu)或功能的元件或動(dòng)作,以便于理解和方便。在下面的具體實(shí)施方式的過程中將詳細(xì)描述附圖。
具體實(shí)施方式
現(xiàn)在將描述本公開的方法和系統(tǒng)的各種示例和實(shí)施例。以下描述提供了對(duì)這些示例的透徹理解和實(shí)現(xiàn)描述的具體細(xì)節(jié)。然而,相關(guān)領(lǐng)域技術(shù)人員將理解,可以在沒有這些細(xì)節(jié)的許多的情況下實(shí)踐本文描述的一個(gè)或多個(gè)實(shí)施例。類似地,相關(guān)領(lǐng)域的技術(shù)人員還將理解,本公開的一個(gè)或多個(gè)實(shí)施例可以包括本文中未詳細(xì)描述的其它特征。此外,一些眾所周知的結(jié)構(gòu)或功能可能在下面不能被顯示或描述,以避免不必要地模糊相關(guān)描述。
跨模塊優(yōu)化(cmo)(其通常意指過程間優(yōu)化(ipo))是使得編譯器能夠優(yōu)化用戶程序的最有效方法之一。默認(rèn)情況下,編譯器在單個(gè)模塊模式下運(yùn)行。在這種模式下,編譯器的優(yōu)化能力受到程序員建立的人造源模塊邊界的限制。
已經(jīng)提出了幾個(gè)現(xiàn)有的機(jī)制來解決這個(gè)問題,包括例如鏈接時(shí)間優(yōu)化(lto)和輕量級(jí)過程間優(yōu)化(lipo)。然而,這種現(xiàn)有手段受到限制,使得它們不適合默認(rèn)開啟。如將在下面更詳細(xì)描述的,本公開的新cmo架構(gòu)(其在本文中有時(shí)可能稱為“thinlto”)被設(shè)計(jì)為解決lto和lipo兩者的缺點(diǎn)和限制,并且成為新的鏈接-時(shí)間-優(yōu)化標(biāo)準(zhǔn)。
存在thinlto的許多特征,其提供了相對(duì)于現(xiàn)有手段的各種優(yōu)點(diǎn)。例如,本公開的方法和系統(tǒng)解決了cmo可擴(kuò)展性問題,這些問題困擾著實(shí)施cmo的現(xiàn)有手段。在默認(rèn)情況下,thinlto還將編譯過程中的串行(例如,不可并行化,從而遇到瓶頸)部分中花費(fèi)的時(shí)間減少到絕對(duì)最小值。i/o操作也被最小化,因?yàn)槔缈梢韵诙虚g表示(ir)序列化。例如,使用傳統(tǒng)cmo,在過程間分析之后,為了在不同的分區(qū)中發(fā)生轉(zhuǎn)換,編譯器需要讀入ir文件,進(jìn)行轉(zhuǎn)換所需的函數(shù)的克隆(例如,內(nèi)聯(lián)轉(zhuǎn)換),并將重新分區(qū)的ir寫回磁盤。此序列化步驟非常i/o敏感,并在本文呈現(xiàn)的方法和系統(tǒng)中被消除。
使用thinlto,需求驅(qū)動(dòng)和基于摘要的精細(xì)粒度導(dǎo)入最大化cmo的潛力,這使得cmo盡可能有用。thinlto還提供全局索引,其使得能夠快速函數(shù)導(dǎo)入;并行一些性能關(guān)鍵但昂貴的過程間分析和轉(zhuǎn)換;利用需求驅(qū)動(dòng)的惰性導(dǎo)入將調(diào)試構(gòu)建的存儲(chǔ)器消耗最小化的調(diào)試信息;并允許輕松集成第三方分布式構(gòu)建系統(tǒng)。此外,thinlto還可以使用ipo服務(wù)器實(shí)現(xiàn),從而消除對(duì)串行步驟的需要。
本公開的新ipo(例如,cmo)架構(gòu)結(jié)合了lipo和傳統(tǒng)lto的許多最佳特征,還包括基本變化和/或增加。雖然thinlto中包含的這些基本變化/增加提供了許多相對(duì)于現(xiàn)有手段的優(yōu)點(diǎn),但在每個(gè)中包括的某些概念之間仍然存在一些相似之處。下面描述在本公開中使用的常用術(shù)語的一些示例。
過程間優(yōu)化(ipo)。ipo通常意指cmo,這意味著跨模塊優(yōu)化。
主要模塊。在lipo和thinlto中使用的概念。它定義為模塊,其中內(nèi)部定義的函數(shù)的外線副本(out-of-linecopy)將被發(fā)出。在主模塊中定義的全局變量也將在數(shù)據(jù)空間中“擁有”存儲(chǔ)。
輔助模塊。在lipo和thinlto中使用的概念。它是由主模塊導(dǎo)入的模塊。除了少數(shù)例外以外,在其中定義的函數(shù)本體將在cmo(內(nèi)聯(lián))之后被丟棄。
輔助函數(shù)。lipo和thinlto概念。它是在輔助模塊中定義的函數(shù)。這些函數(shù)具有特殊聯(lián)系。
函數(shù)導(dǎo)入。thinlto概念。它是指將所需函數(shù)從其它模塊快速加載到主模塊的過程。
靜態(tài)促進(jìn)。lipo、thinlto和基于分區(qū)的lto中的概念。靜態(tài)促進(jìn)是指當(dāng)引用跨模塊或分區(qū)邊界時(shí),將文件靜態(tài)變量和函數(shù)促進(jìn)到外部的過程。
精簡(jiǎn)檔案。包含對(duì)檔案的成員文件的原始副本的符號(hào)索引和引用的檔案。精簡(jiǎn)檔案避免了本地構(gòu)建系統(tǒng)或遠(yuǎn)程緩存中不必要的文件副本。例如,當(dāng)創(chuàng)建檔案/函數(shù)映射時(shí),不制作ir文件的副本。相反,檔案只引用原始的ir文件。
中間表示(ir)。中級(jí)程序表示術(shù)語。應(yīng)當(dāng)注意,中間表示有時(shí)可以被稱為中間語言(il)。然而,為了清楚起見,在描述本公開的各種特征和實(shí)施例時(shí),僅引用ir。
鏈接器插件。由傳統(tǒng)lto和thinlto使用的組件。插件是對(duì)真實(shí)的鏈接器的可加載模塊,用于處理具有不是最終可重定位目標(biāo)的格式的中間文件。
在以下部分中,將首先詳細(xì)描述傳統(tǒng)lto和lipo,以便理解其缺點(diǎn)和限制,并且隨后是根據(jù)本公開的一個(gè)或多個(gè)實(shí)施例的thinlto的詳細(xì)描述。
傳統(tǒng)lto
lto是編譯模型,其在鏈接時(shí)間啟用跨模塊優(yōu)化和整個(gè)程序分析(顧名思義)。在常規(guī)編譯期間,編譯器生成具有程序ir(中間表示)的位碼文件,而不是生成真實(shí)的可重定位的目標(biāo)文件。這些文件在鏈接時(shí)間由鏈接器插件收集和合并。編譯器的ipa和代碼生成器組件由插件調(diào)用以使用cmo生成真實(shí)的目標(biāo)文件。然后將真實(shí)的目標(biāo)文件傳遞給真實(shí)的鏈接器以生成目標(biāo)可執(zhí)行庫(kù)或共享庫(kù)。存在傳統(tǒng)(例如,常規(guī)的、經(jīng)典的)lto模型的幾種不同的變化,包括例如以下:
(i)完全整體模型:在該模型中,lto鏈接階段進(jìn)行所有工作,而不進(jìn)行任何并行化。該工作包括所有ipa分析和轉(zhuǎn)換,以及函數(shù)級(jí)優(yōu)化和代碼生成。例如,llvm(其是編譯器基礎(chǔ)架構(gòu),其設(shè)計(jì)為一組具有明確定義接口的可重用庫(kù))的當(dāng)前的lto采用了完全整體模型。作為另一個(gè)示例,當(dāng)-fwhopr未指定時(shí),較舊版本的gcc(gnu編譯器集合)的lto也使用完全整體模型。更新版本的gcc刪除-fwhopr選項(xiàng),并將whopr模式設(shè)置為默認(rèn)。使用選項(xiàng)-flto-partition=none,整體模型仍然可以在gcc中開啟。
(ii)具有線程級(jí)并行性的整體模型:該模型類似于上述(i)中所述的完全整體模型,其主要區(qū)別在于使用線程級(jí)并行性來完成函數(shù)級(jí)優(yōu)化/代碼生成。
(iii)串行ipo+并行be:在該模型中,lto鏈接步驟執(zhí)行所有ipa分析和轉(zhuǎn)換(包括內(nèi)聯(lián)轉(zhuǎn)換)。在串行步驟之后,將調(diào)用進(jìn)程級(jí)并行構(gòu)建,以在模塊級(jí)別上執(zhí)行優(yōu)化/代碼生成。
(iv)具有分區(qū)的lto:在該模型中,在串行鏈接步驟中執(zhí)行基于摘要的ipa分析。也可以使用此模型完成ipa內(nèi)聯(lián)(該模型僅生成內(nèi)聯(lián)決定,但推遲轉(zhuǎn)換到以后)。在ipa分析之后,可以執(zhí)行調(diào)用圖劃分。目標(biāo)是將調(diào)用圖節(jié)點(diǎn)劃分為平衡子圖,使得跨分區(qū)邊緣權(quán)重最小化。每個(gè)分區(qū)由不同的子進(jìn)程處理,以執(zhí)行過程內(nèi)轉(zhuǎn)換和機(jī)器代碼生成。子進(jìn)程可以同時(shí)大量產(chǎn)生。分區(qū)的大小不能太大也不能太小。如果它太大,則大型分區(qū)的后端編譯將具有高的存儲(chǔ)器壓力,并且整個(gè)構(gòu)建時(shí)間將在其上遇到瓶頸。另一方面,如果分區(qū)太小,則cmo的效果將大大降低,或者如果跨分區(qū)節(jié)點(diǎn)復(fù)制完成,則將引起嚴(yán)重的序列化開銷。例如,gcc的lto使用這樣的模型。默認(rèn)模式將執(zhí)行平衡分區(qū)。分區(qū)的數(shù)量是動(dòng)態(tài)的,但默認(rèn)它將在平均值32周圍。每個(gè)分區(qū)也應(yīng)該大于參數(shù)指定的最小大小。
除了如上所述的完全整體模型(i)之外,所有其它現(xiàn)有的lto模型都嘗試通過使用一些級(jí)別的并行性來提高可擴(kuò)展性。然而,它們都是想要被設(shè)計(jì)用于以單個(gè)多核機(jī)器構(gòu)建,它不適合大型分布式構(gòu)建系統(tǒng)。此外,即使通過基于分區(qū)的模式做出最大的努力,在串行鏈接步驟中完成的編譯工作可以仍然是重要的。
關(guān)于線程級(jí)并行性要注意的是,雖然它可以加快lto的編譯,但是它也可以加快在沒有l(wèi)to的情況下的基線編譯。對(duì)于非lto編譯,解析不能容易并行化,因此使用非lto編譯的線程可能不會(huì)同樣有效。非lto編譯也通常使用進(jìn)程級(jí)并行性。因此,盲目地增加線程級(jí)并行性可以使系統(tǒng)過載。
不管-g是否被指定,gcc的ir攜帶所有類型信息的開銷。這是gcc的ir大小遠(yuǎn)遠(yuǎn)大于llvm的原因之一。然而,使用-g,llvmir大小可以比沒有大10x倍,這將是在整體模式下或使用大型分區(qū)構(gòu)建大型應(yīng)用的重要限制因素。
值得注意的是,傳統(tǒng)的lto技術(shù)已經(jīng)使用了很長(zhǎng)時(shí)間。早期編譯器使用稱為預(yù)鏈接器的整體組件來執(zhí)行跨模塊優(yōu)化。預(yù)鏈接器產(chǎn)生組合的.o文件,然后將其饋送到實(shí)際鏈接器以生成最終的可執(zhí)行/共享庫(kù)。早期llvm以同樣的方式實(shí)施了lto。
首先實(shí)現(xiàn)可擴(kuò)展lto的早期現(xiàn)有編譯器引入了兩個(gè)創(chuàng)新。一個(gè)創(chuàng)新是鏈接器插件,而另一個(gè)是完全并行的后端。鏈接器插件的引入允許lto使用最小更改與現(xiàn)有的構(gòu)建系統(tǒng)無縫集成。它還啟用需要真正的鏈接器的反饋的整個(gè)程序功能。除了插件更改之外,llvm的lto在經(jīng)過十多年的演變(存在在llvm中進(jìn)行g(shù)cc類型分區(qū)的最近的努力)之后仍然保持整體。
輕量級(jí)ipo(lipo)
lipo代表輕量級(jí)ipo。lipo是與反饋指導(dǎo)優(yōu)化(fdo)緊密耦合并且基于lto需要簡(jiǎn)檔反饋以便有效的觀察的跨模塊優(yōu)化技術(shù)。在該編譯模型中,程序插裝運(yùn)行增加了一個(gè)附加步驟:輕量級(jí)動(dòng)態(tài)ipa(dyn-ipa)。在此附加步驟中,基于從直接和間接調(diào)用簡(jiǎn)檔計(jì)數(shù)器構(gòu)建的動(dòng)態(tài)調(diào)用圖執(zhí)行粗略粒度內(nèi)聯(lián)分析,并且將分析結(jié)果作為模塊組記錄在簡(jiǎn)檔數(shù)據(jù)中。
使用lipo,在優(yōu)化構(gòu)建(簡(jiǎn)檔使用通路)中,沒有串行鏈接插件步驟,如在傳統(tǒng)的lto中所做的那樣。在lipo模型中,一個(gè)源模塊可以作為所謂的輔助模塊包括在多個(gè)模塊組中。因此,簡(jiǎn)檔使用編譯可以作為任何常規(guī)的o2構(gòu)建而完全并行化。它也自然地與任何分布式構(gòu)建系統(tǒng)一起工作以充分探索構(gòu)建并行性。lipo可以與開啟的完整的調(diào)試信息一起使用,這對(duì)于使用峰值優(yōu)化構(gòu)建的生產(chǎn)二進(jìn)制文件很重要。
lipo的限制
現(xiàn)有的lipo技術(shù)受到若干限制和復(fù)雜性的影響,包括例如以下:
(i)lipo被限制為僅使用簡(jiǎn)檔反饋構(gòu)建(盡管當(dāng)與fdo一起使用時(shí),lto可能更有效);
(ii)基于解析器的多模塊編譯不能處理中間語言分組;
(iii)基于解析器的多模塊編譯實(shí)現(xiàn)起來是復(fù)雜和棘手的(例如,隔離解析上下文);
(iv)由于存儲(chǔ)器約束,模塊分組大小受到限制。對(duì)于大型c++程序,c++模塊包含數(shù)千個(gè)函數(shù)并不罕見。對(duì)于進(jìn)行粗略粒度內(nèi)聯(lián)分析和模塊分組的lipodyn-ipa通路來說相當(dāng)困難的是,提出最優(yōu)啟發(fā)式來選擇給定約束條件的最佳輔助模塊。模塊分組略有不同也可以導(dǎo)致不平凡的性能波動(dòng);
(v)需要教導(dǎo)分布式構(gòu)建系統(tǒng)關(guān)于由lipo引入的附加的源依賴性,以將正確的文件集合發(fā)送到構(gòu)建節(jié)點(diǎn);
(vi)對(duì)于傳統(tǒng)的生成文件(makefile),對(duì)生成的源文件的新引入的依賴性可以導(dǎo)致構(gòu)建錯(cuò)誤;和
(vii)需要更多分布式構(gòu)建前端支持,以便處理陳舊的簡(jiǎn)檔。
thinlto的概述
如上所述,傳統(tǒng)的lto和lipo都遭受各種限制,并且不適用于開箱/一般使用。因此,本公開的實(shí)施例提供了新的lto機(jī)制(“thinlto”),以克服與傳統(tǒng)lto和lipo相關(guān)聯(lián)的限制和問題。如下面將要詳細(xì)描述的那樣,thinlto被設(shè)計(jì)為使用相同的原理維護(hù)lipo的許多最佳部分,但沒有任何lipo的固有缺陷。與其中在訓(xùn)練運(yùn)行時(shí)進(jìn)行模塊組決定的lipo中不同的是,thinlto在編譯時(shí)進(jìn)行決定,但是處于便于大規(guī)模并行化的惰性模式。使用thinlto,串行鏈接器插件階段被設(shè)計(jì)為非常精簡(jiǎn)和快速。此外,根據(jù)至少一個(gè)實(shí)施例,默認(rèn)該步驟僅進(jìn)行最小的準(zhǔn)備工作,以便稍后啟用執(zhí)行并行惰性導(dǎo)入。
thinlto設(shè)計(jì)目標(biāo)和特性
根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例,本公開的跨模塊優(yōu)化方法、系統(tǒng)和架構(gòu)基于以下目的和特征中的一個(gè)或多個(gè)來設(shè)計(jì):
(i)thinlto可以在不依賴于簡(jiǎn)檔反饋的情況下操作。
(ii)默認(rèn)thinlto被設(shè)計(jì)為精益和平均,并且不依賴具有大存儲(chǔ)器配置的機(jī)器。thinlto可能與傳統(tǒng)o2一樣易于使用和可擴(kuò)展。
(iii)lto的串行部分盡可能精簡(jiǎn)(根據(jù)amdahl定律),以使大量并行性有效。這意味著,例如,默認(rèn)可以修剪在此步驟中不嚴(yán)格需要的任何操作。io操作可能最小,并且大多數(shù)計(jì)算可能會(huì)延遲到并行階段。
(iv)thinlto被設(shè)計(jì)為以最小的存儲(chǔ)器和編譯時(shí)間開銷來最大化跨模塊內(nèi)聯(lián)優(yōu)點(diǎn)??梢钥蛇x地使用附加標(biāo)志或更高的優(yōu)化級(jí)別開啟具有不同成本的基于摘要的整個(gè)程序分析。
(v)使用開啟的簡(jiǎn)檔反饋,串行步驟可以被完全消除。
(vi)并行化粒度可以保持在源模塊級(jí)別并且按需導(dǎo)入粒度保持在功能級(jí)別。對(duì)于分布式構(gòu)建,粒度不應(yīng)太大(例如,較低的并行性)或太小(例如,高設(shè)置成本,缺少導(dǎo)入共享,代碼復(fù)制成本等)。
(vii)thinlto被設(shè)計(jì)為對(duì)單個(gè)機(jī)器并行構(gòu)建和大規(guī)模分布式構(gòu)建都是友好的。
(viii)thinlto啟用簡(jiǎn)單的編譯時(shí)間和運(yùn)行時(shí)錯(cuò)誤分類和調(diào)試(例如,允許非lto目標(biāo)文件的輕松混合和匹配)。
根據(jù)至少一個(gè)實(shí)施例,類似于傳統(tǒng)lto構(gòu)建,thinlto是三階段編譯(除了thinlto+fdo之外,其可以被簡(jiǎn)化為1階段,如將在下面更詳細(xì)描述的)。然而,thinlto中每個(gè)階段執(zhí)行的任務(wù)與傳統(tǒng)lto中每個(gè)階段執(zhí)行的任務(wù)不同。與傳統(tǒng)lto相比,thinlto的設(shè)計(jì)解決了并行性并提高了整體可擴(kuò)展性。
以下部分提供關(guān)于thinlto的基本設(shè)計(jì)(例如,用于單個(gè)機(jī)器構(gòu)建)的附加細(xì)節(jié),并且還描述可以針對(duì)不同場(chǎng)景(包括例如分布式構(gòu)建、fdo等等)的thinlto的幾個(gè)變體。
用于單個(gè)機(jī)器并行構(gòu)建的thinlto
圖1圖示出了根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的thinlto中的示例三階段編譯100。圖1所示的階段中的每一個(gè)將在下面更詳細(xì)地描述。
階段i:使用函數(shù)索引和摘要的ir生成
根據(jù)本公開的一個(gè)或多個(gè)實(shí)施例,在第一階段(例如,圖1所示的示例編譯100中的110)中,編譯器可以產(chǎn)生ir位碼文件而不是真正的可重定位目標(biāo)。此外,編譯器還可以生成以下并將其存儲(chǔ)在ir文件的單獨(dú)部分中:
(1)函數(shù)本體索引。它基本上是函數(shù)符號(hào)表,其從函數(shù)id映射到ir文件中的它們的本體偏移。這樣允許在以后快速檢索和惰性導(dǎo)入。
(2)函數(shù)摘要數(shù)據(jù)。摘要數(shù)據(jù)用于協(xié)助在階段3編譯中完成的函數(shù)導(dǎo)入決定。函數(shù)摘要數(shù)據(jù)可以包括但不限于以下:(a)核心函數(shù)屬性,諸如大小、序言/尾聲成本、分支數(shù),具有malloc調(diào)用等;和(b)傳遞函數(shù)(如果有的話),其中在內(nèi)聯(lián)之后傳遞函數(shù)將參數(shù)值/值范圍映射到潛在成本節(jié)省。
圖2圖示出了根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的用于跨模塊優(yōu)化方法、系統(tǒng)和架構(gòu)的階段1的示例編譯流水線200。示例階段1編譯器命令行可能是:
${cc}-o2-c-fthin-lto-osource.osource.cc
階段2:超精簡(jiǎn)鏈接器插件層
根據(jù)本公開的至少一個(gè)實(shí)施例,默認(rèn)在thinlto的第二階段(例如,圖1所示的示例編譯100中的120)可以僅進(jìn)行最小量的工作。在thinlto中,插件只需要使用組合的函數(shù)映射從階段1生成所生成的ir文件的精簡(jiǎn)檔案。因此,存儲(chǔ)器使用將非常小,并且i/o將被最小化。此外,可以執(zhí)行以下示例技術(shù)以減少總函數(shù)索引大小:
(1)“comdat”消除。例如,在最終索引中只拾取一個(gè)comdat副本。在其中存在簡(jiǎn)檔數(shù)據(jù)的情況下,可以拾取外線副本。
(2)如果不可能/冷函數(shù)不能帶來其它益處(例如,減小尺寸),則跳過所有不可能/冷函數(shù)(例如,由用戶或簡(jiǎn)檔數(shù)據(jù)標(biāo)記的)。應(yīng)該指出的是,除非調(diào)用點(diǎn)信息可用來做出更精確的估計(jì),否則這種技術(shù)可能應(yīng)該被限制于很小的函數(shù))。
(3)跳過沒有良好的內(nèi)聯(lián)優(yōu)點(diǎn)的非常大的函數(shù)。
根據(jù)至少一個(gè)實(shí)施例,可以可選地執(zhí)行更多重量級(jí)的基于摘要的ipa通路。但是,默認(rèn)此類通路可能無法開啟。這種附加通路的設(shè)計(jì)細(xì)節(jié)超出了本公開的范圍。
使用默認(rèn)thinlto模式,鏈接器插件步驟基本上是階段1的同步點(diǎn),之后階段3可以開始共享ir。應(yīng)當(dāng)注意,可以完全擺脫同步步驟??梢匀绾螌?shí)現(xiàn)這一點(diǎn)的一個(gè)示例是通過連續(xù)預(yù)先計(jì)算ir的構(gòu)建服務(wù)器。因此,編譯器構(gòu)建可以從數(shù)據(jù)庫(kù)中簡(jiǎn)單地獲取函數(shù)本體。如果缺少,可以對(duì)構(gòu)建服務(wù)器進(jìn)行按需請(qǐng)求。
在階段2結(jié)束處,插件將并行調(diào)用后端驅(qū)動(dòng)程序。對(duì)于每個(gè)后端驅(qū)動(dòng)程序調(diào)用,它將從階段1傳遞未修改的ir文件以及具有復(fù)合函數(shù)本體索引的精簡(jiǎn)檔案文件。用于調(diào)用鏈接器插件的示例命令行可能是:
${cc}-fthin-lto=./${some_dir}/prog_thin_arch.asourcel.osource2.o…-oa.out
在上述示例命令行中,sourcex.o文件是具有在階段1中產(chǎn)生的函數(shù)映射和摘要數(shù)據(jù)的ir文件。鏈接器插件將在階段2中產(chǎn)生prog_thin_arch.a文件。在其中重量級(jí)ipa通路開啟的情況下,ipa分析結(jié)果也可能存儲(chǔ)在檔案文件中。
以下是ld插件的示例并行后端驅(qū)動(dòng)程序調(diào)用命令行:
${be_driver}-fthin-lto-use=./${some_dir}/prog_thin_arch.asource1.o-osource1_real.o....
以下提供關(guān)于該示例命令行發(fā)生的附加細(xì)節(jié)。
階段3:使用惰性函數(shù)導(dǎo)入的完全并行化需求驅(qū)動(dòng)的ipo
根據(jù)本公開的一個(gè)或多個(gè)實(shí)施例,thinlto的第三階段(例如,圖1所示的示例編譯100中的130)中的編譯流水線可以包括圖3所示的示例框。
thinlto的第三階段300中的框305可以包括迭代惰性函數(shù)導(dǎo)入。在該步驟中,其附加細(xì)節(jié)在圖4中圖示出,只有來自精簡(jiǎn)檔案中的輔助模塊的可能需要的輔助函數(shù)才能導(dǎo)入主模塊。應(yīng)該注意的是,這不同于lipo,在lipo中輔助模塊中的所有函數(shù)都被強(qiáng)制同時(shí)導(dǎo)入。關(guān)于可以在框305處執(zhí)行的迭代惰性函數(shù)導(dǎo)入的進(jìn)一步細(xì)節(jié)在下面參照?qǐng)D4提供。
圖4圖示出了根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例的迭代惰性函數(shù)導(dǎo)入的示例過程400。
在框405處,可以確定(例如,識(shí)別、定位等)模塊中對(duì)外部非庫(kù)函數(shù)的所有調(diào)用點(diǎn)。
在框410處,對(duì)于在框405處確定的每個(gè)調(diào)用點(diǎn),可以讀取調(diào)用點(diǎn)的函數(shù)摘要數(shù)據(jù),并且進(jìn)行關(guān)于所估計(jì)的導(dǎo)入益處確定。根據(jù)本公開的至少一個(gè)實(shí)施例,如果導(dǎo)入該點(diǎn)被確定為有益的(例如,為該點(diǎn)確定的估計(jì)的導(dǎo)入益處>0),則該點(diǎn)可以被放置在優(yōu)先隊(duì)列中。
在框415處,可以進(jìn)行關(guān)于優(yōu)先隊(duì)列是否為空或已經(jīng)達(dá)到了優(yōu)先隊(duì)列的限制的確定。
如果在框415處確定優(yōu)先隊(duì)列為空或者已經(jīng)達(dá)到了優(yōu)先隊(duì)列的限制,則函數(shù)導(dǎo)入完成,并且該過程可以移動(dòng)到框440。
在框440處,一旦迭代函數(shù)導(dǎo)入完成(例如,如在框415處所確定的),導(dǎo)入的函數(shù)的類型信息可以被惰性地導(dǎo)入。
另一方面,如果在框415處確定優(yōu)先隊(duì)列不為空并且尚未達(dá)到優(yōu)先隊(duì)列的限制,則迭代過程可以在框420處繼續(xù),其中,來自優(yōu)先隊(duì)列的頂部條目可能被彈出。
在框425處,全局函數(shù)索引中的函數(shù)的條目可以用于在對(duì)應(yīng)的模塊中定位并加載函數(shù)的ir。
在框430處,如果存在用于函數(shù)的簡(jiǎn)檔,并且簡(jiǎn)檔尚未處于加載的函數(shù)ir中,則可以將簡(jiǎn)檔注釋到在框425處加載的函數(shù)ir上。
在框435處,可以從框425處加載的函數(shù)ir收集(例如,獲得,確定等)新的非庫(kù)外部調(diào)用點(diǎn)。如果確定任何新的非庫(kù)外部調(diào)用點(diǎn)是導(dǎo)入有益的(例如,基于調(diào)用點(diǎn)的函數(shù)摘要和調(diào)用點(diǎn)分析),則可以將它們添加到優(yōu)先隊(duì)列。
返回到圖3所示的示例過程300,框310可以包括全局符號(hào)鏈接(跨模塊)和靜態(tài)促進(jìn)。顯式標(biāo)記為“未導(dǎo)入”的冷模塊不需要這樣做。
框315可以包括從輔助導(dǎo)入和合并的惰性調(diào)試信息。在此步驟中,僅將導(dǎo)入的函數(shù)所需的調(diào)試die(或其元數(shù)據(jù))合并(例如統(tǒng)一)到主模塊中。應(yīng)當(dāng)注意,根據(jù)本公開的一個(gè)或多個(gè)實(shí)施例,可以在thinlto的第三階段300(函數(shù)導(dǎo)入)期間迭代地執(zhí)行框310(全局符號(hào)鏈接和靜態(tài)促進(jìn))和框315(調(diào)試導(dǎo)入)中的任一個(gè)或兩個(gè)。
框320可以包括在擴(kuò)展主模塊上的過程間分析通路。
thinlto的第三階段300中的框325可以包括后期全局優(yōu)化、機(jī)器特定優(yōu)化和代碼生成。
應(yīng)當(dāng)理解,從其它模塊導(dǎo)入的所有函數(shù)是根據(jù)lipo定義的輔助函數(shù)。它們可以在內(nèi)聯(lián)轉(zhuǎn)換后被安全地丟棄,除非副本變?yōu)楸镜鼗虿荒鼙WC被其它模塊定義的情況。
thinlto惰性調(diào)試信息導(dǎo)入
調(diào)試信息消耗大量的存儲(chǔ)器,并且統(tǒng)一/合并許多類型可能是昂貴的。如果主模塊從m個(gè)不同的模塊中導(dǎo)入n個(gè)函數(shù),則從所有m個(gè)模塊導(dǎo)入調(diào)試信息可能是非常昂貴的。根據(jù)本公開的一個(gè)或多個(gè)實(shí)施例,處理該問題的一種方式是通過以需求驅(qū)動(dòng)的方式導(dǎo)入調(diào)試信息條目。這樣的手段可以包括例如針對(duì)每個(gè)導(dǎo)入的函數(shù)的ir步行(walk),計(jì)算可傳引用的調(diào)試信息實(shí)體的集合,并將它們合并到主模塊中。
將階段2和階段3構(gòu)建分割成兩個(gè)通路
為了利用構(gòu)建并行性,階段1編譯通常在其自身的通路中完成(例如,經(jīng)由編譯器選項(xiàng)-c和每個(gè)源文件的獨(dú)立構(gòu)建動(dòng)作)。然而,根據(jù)本公開的至少一個(gè)實(shí)施例,默認(rèn)thinlto的階段2和階段3的步驟可以在合并通路中完成,其中鏈接器插件驅(qū)動(dòng)后端動(dòng)作的并行構(gòu)建。
對(duì)于thinlto,還存在不同的構(gòu)建模式:在鏈接器插件步驟中,在創(chuàng)建精簡(jiǎn)檔案文件之后,鏈接器插件可以選擇創(chuàng)建后端動(dòng)作文件(例如,通常是gnumakefile),并且停止通過使后端驅(qū)動(dòng)程序參與來編譯替代恢復(fù)編譯。用戶然后可以直接使用生成的makefile來調(diào)用“make”。例如:
通路1:
${cc}-fthin-lto-csource1.cc
${cc}-fthin-lto-csource2.cc
通路2:#(生成generated.mk并且停止而不調(diào)用be)
${cc}-fthin-lto=./thin_arch.a-fthin-lto-twopass=./generated.mksource1.ccsource2.c
通路3:#(由用戶顯式調(diào)用)
make-j10-f./generated.mk
上述模式給予用戶輕松地將thinlto構(gòu)建與其定制的構(gòu)建系統(tǒng)整合用于遠(yuǎn)程編譯的靈活性。
用于分布式構(gòu)建系統(tǒng)的thinlto
根據(jù)本公開的至少一個(gè)實(shí)施例,階段1thinlto可以完全受到任何分布式構(gòu)建系統(tǒng)提供的完全并行性的影響。雖然鏈接器插件是串行步驟,但是thinlto將其縮小到絕對(duì)最小值。然而,在構(gòu)建的更昂貴的步驟期間,階段3(例如,鏈接器插件)需要與任何分布式構(gòu)建系統(tǒng)一起工作,而不將構(gòu)建系統(tǒng)特定知識(shí)嵌入到編譯器本身中。
使用本公開的thinlto設(shè)計(jì)和架構(gòu),可以容易地解決該問題。例如,上述的2通路編譯可以用來解決這個(gè)問題。在鏈接器插件生成makefile之后,構(gòu)建系統(tǒng)特定的變換工具可以用于將makefile變換為目標(biāo)構(gòu)建文件格式。然后可以將此構(gòu)建文件饋送到分布式構(gòu)建前端以執(zhí)行。
使用簡(jiǎn)檔反饋構(gòu)建(fdo/afdo)
thinlto使用自動(dòng)反饋指導(dǎo)優(yōu)化(afdo)甚至使用陳舊的簡(jiǎn)檔透明地工作。使用基于儀器的fdo,使用thinlto的簡(jiǎn)檔使用編譯可以像傳統(tǒng)的o2或lipo構(gòu)建一樣簡(jiǎn)化為單階段編譯。想法是可以在簡(jiǎn)檔生成通路中生成并在簡(jiǎn)檔使用步驟中重新使用精簡(jiǎn)檔案。
應(yīng)當(dāng)注意,根據(jù)本文所述的一個(gè)或多個(gè)實(shí)施例,對(duì)于具有簡(jiǎn)檔反饋的thinlto,模塊級(jí)摘要可以消除對(duì)大部分冷模塊進(jìn)行函數(shù)導(dǎo)入的需要。使用簡(jiǎn)檔指導(dǎo),函數(shù)級(jí)導(dǎo)入也可以更有選擇性和更快速。
根據(jù)本公開的至少一個(gè)實(shí)施例,以下描述可以實(shí)現(xiàn)與thinlto相似的跨模塊內(nèi)聯(lián)中的有效性的ipo基礎(chǔ)架構(gòu)的一個(gè)可能的替代設(shè)計(jì)的示例。
(1)在鏈接器插件步驟中,執(zhí)行l(wèi)ipo風(fēng)格粗略粒度內(nèi)聯(lián)分析。內(nèi)聯(lián)分析基于摘要數(shù)據(jù)(例如,主要是調(diào)用圖);
(2)替代進(jìn)行完整的內(nèi)聯(lián)決定(例如,如在gcc中所做的那樣),該通路僅決定需要完成什么分組以啟用有用的cmo;
(3)可以基于原始源模塊邊界對(duì)函數(shù)進(jìn)行分區(qū);
(4)基于上述內(nèi)聯(lián)分析,可以將啟用cm內(nèi)聯(lián)所需的函數(shù)克隆到目標(biāo)源模塊中。函數(shù)克隆本質(zhì)上是thinlto中的輔助函數(shù)導(dǎo)入,但在鏈接器插件階段完成。
與thinlto相比,上述示例替代設(shè)計(jì)具有一些缺點(diǎn),包括例如以下:
(i)在編譯流水線的瓶頸中增加了內(nèi)聯(lián)分析,從而降低了使用并行化最大可能的速度因子;
(ii)輔助函數(shù)導(dǎo)入步驟也被添加到序列化步驟。即使可以應(yīng)用線程級(jí)并行性,其也限于單個(gè)機(jī)器;
(iii)摘要數(shù)據(jù)的大小對(duì)于程序大小仍然是線性的,并且因此可能在將來某個(gè)時(shí)刻達(dá)到構(gòu)建機(jī)器限制;
(iv)調(diào)試信息處理問題。為了支持惰性/按需調(diào)試類型導(dǎo)入,編譯器需要在序列化步驟中遍歷大多數(shù)模塊的ir。
圖5是根據(jù)本文描述的一個(gè)或多個(gè)實(shí)施例的被布置用于創(chuàng)建跨模塊優(yōu)化的示例性計(jì)算機(jī)(500)的高級(jí)框圖。在非常基本的配置(501)中,計(jì)算裝置(500)通常包括一個(gè)或多個(gè)處理器(510)和系統(tǒng)存儲(chǔ)器(520)。存儲(chǔ)器總線(530)可以用于處理器(510)和系統(tǒng)存儲(chǔ)器(520)之間的通信。
根據(jù)期望的配置,處理器(510)可以是任何類型的,包括但不限于微處理器(μp)、微控制器(μc)、數(shù)字信號(hào)處理器(dsp)或其任何組合。處理器(510)可以包括一級(jí)或多級(jí)緩存,諸如一級(jí)緩存(511)和二級(jí)緩存(512),處理器核心(513)和寄存器(514)。處理器核心(513)可以包括算術(shù)邏輯單元(alu)、浮點(diǎn)單元(fpu)、數(shù)字信號(hào)處理核心(dsp核心)或其任何組合。存儲(chǔ)器控制器(516)也可以與處理器(510)一起使用,或者在一些實(shí)現(xiàn)中,存儲(chǔ)器控制器(515)可以是處理器(510)的內(nèi)部部分。
根據(jù)期望的配置,系統(tǒng)存儲(chǔ)器(520)可以是任何類型的,包括但不限于易失性存儲(chǔ)器(諸如ram)、非易失性存儲(chǔ)器(諸如rom,閃速存儲(chǔ)器等)或其任何的組合。系統(tǒng)存儲(chǔ)器(520)通常包括操作系統(tǒng)(521)、一個(gè)或多個(gè)應(yīng)用(522)和程序數(shù)據(jù)(524)。應(yīng)用(522)可以包括用于為應(yīng)用創(chuàng)建跨模塊優(yōu)化的方法和架構(gòu)(523)。程序數(shù)據(jù)(524)可以包括存儲(chǔ)指令,所述指令當(dāng)由一個(gè)或多個(gè)處理設(shè)備執(zhí)行時(shí)實(shí)現(xiàn)用于代碼優(yōu)化的方法和架構(gòu)(523)。根據(jù)至少一些實(shí)施例,應(yīng)用(522)可以被布置成與操作系統(tǒng)(521)上的程序數(shù)據(jù)(524)一起操作。
計(jì)算裝置(500)可以具有附加特征或功能,以及用于促進(jìn)基本配置(501)和任何所需裝置和接口之間的通信的附加接口。
系統(tǒng)存儲(chǔ)器(520)是計(jì)算機(jī)存儲(chǔ)介質(zhì)的示例。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于ram、rom、eeprom、閃速存儲(chǔ)器或其它存儲(chǔ)器技術(shù)、cd-rom、數(shù)字通用盤(dvd)或其它光學(xué)存儲(chǔ)器、磁帶盒、磁帶、磁盤存儲(chǔ)器或其它磁存儲(chǔ)裝置或可用于存儲(chǔ)所需信息并且可被計(jì)算裝置500訪問的任何其它介質(zhì)。任何這樣的計(jì)算機(jī)存儲(chǔ)介質(zhì)可以是裝置(500)的一部分。
計(jì)算裝置(500)可以被實(shí)現(xiàn)為小型便攜式(或移動(dòng))電子裝置(諸如蜂窩電話、智能電話、個(gè)人數(shù)據(jù)助理(pda)、個(gè)人媒體播放器裝置、平板電腦(平板)、無線web收看裝置、個(gè)人耳機(jī)裝置、應(yīng)用專用裝置或包括上述任何功能的混合裝置)的一部分。計(jì)算裝置(500)還可以實(shí)現(xiàn)為包括膝上型計(jì)算機(jī)和非膝上型計(jì)算機(jī)配置的個(gè)人計(jì)算機(jī)。
前面的具體實(shí)施方式已經(jīng)通過使用框圖、流程圖和/或示例來闡述了設(shè)備和/或過程的各種實(shí)施例。只要這些框圖、流程圖和/或示例包含一個(gè)或多個(gè)功能和/或操作,本領(lǐng)域技術(shù)人員將會(huì)理解,可以通過各種硬件、軟件、固件或其虛擬任何組合單獨(dú)地和/或共同地實(shí)現(xiàn)這些框圖、流程圖或示例內(nèi)的每個(gè)功能和/或操作。根據(jù)至少一個(gè)實(shí)施例,本文描述的主題的幾個(gè)部分可以經(jīng)由專用集成電路(asic)、現(xiàn)場(chǎng)可編程門陣列(fpga)、數(shù)字信號(hào)處理器(dsp)或其它集成格式來實(shí)現(xiàn)。然而,本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,本文公開的實(shí)施例的某些方面可以全部或部分在集成電路中等同地實(shí)現(xiàn),作為在一個(gè)或多個(gè)計(jì)算機(jī)上運(yùn)行的一個(gè)或多個(gè)計(jì)算機(jī)程序,作為在一個(gè)或多個(gè)處理器上運(yùn)行的一個(gè)或多個(gè)程序,作為固件或其虛擬任何組合,并且設(shè)計(jì)電路和/或編寫軟件和/或固件的代碼本領(lǐng)域技術(shù)人員將根據(jù)本公開已知。此外,本領(lǐng)域技術(shù)人員將理解,本文描述的主題的機(jī)制能夠作為多種形式的程序產(chǎn)品分發(fā),并且本文描述的主題的說明性實(shí)施例應(yīng)用而不考慮用于實(shí)際執(zhí)行分發(fā)的非暫時(shí)性信號(hào)承載介質(zhì)的具體類型。非暫時(shí)性信號(hào)承載介質(zhì)的示例包括但不限于以下:可記錄型介質(zhì),諸如軟盤、硬盤驅(qū)動(dòng)器、壓縮盤(cd)、數(shù)字視頻盤(dvd)、數(shù)字磁帶、計(jì)算機(jī)存儲(chǔ)器等;以及傳輸類型介質(zhì),諸如數(shù)字和/或模擬通信介質(zhì)。(例如,光纖電纜、波導(dǎo)、有線通信鏈路、無線通信鏈路等)。
關(guān)于本文使用基本上任何復(fù)數(shù)和/或單數(shù)術(shù)語,本領(lǐng)域技術(shù)人員可以從復(fù)數(shù)轉(zhuǎn)變?yōu)閱螖?shù)形式和/或從單數(shù)轉(zhuǎn)變?yōu)閺?fù)數(shù)形式以適合于上下文和/或應(yīng)用。為了清楚起見,可以在此明確闡述各種單數(shù)/復(fù)數(shù)排列。
因此,已經(jīng)描述了主題的特定實(shí)施例。其它實(shí)施例在所附權(quán)利要求的范圍內(nèi)。在一些情況下,權(quán)利要求中所述的動(dòng)作可以以不同的順序執(zhí)行并且仍然實(shí)現(xiàn)期望的結(jié)果。此外,附圖中所描繪的過程不一定需要所示的特定順序或次序來實(shí)現(xiàn)期望的結(jié)果。在某些實(shí)現(xiàn)中,多任務(wù)和并行處理可能是有利的。