背景技術(shù):
稀疏數(shù)據(jù)結(jié)構(gòu)(諸如圖和稀疏矩陣)上的高性能計算(hpc)在例如包含機器學(xué)習(xí)、計算科學(xué)、物理模型模擬、web搜索以及知識發(fā)現(xiàn)的廣泛領(lǐng)域中正在變得越來越重要。傳統(tǒng)高性能計算應(yīng)用一般涉及規(guī)則和密集數(shù)據(jù)結(jié)構(gòu);然而,稀疏計算具有某些獨一無二的挑戰(zhàn)。例如,稀疏計算通常比密集計算具有低得多的計算密度,并且因此,其性能經(jīng)常受存儲帶寬的限制。此外,存儲器存取模式和并行度的量變化很大,例如取決于輸入數(shù)據(jù)的特定稀疏度模式,這使優(yōu)化復(fù)雜化了,因為某些優(yōu)化信息經(jīng)常是未知的先驗。
系統(tǒng)可修改輸入數(shù)據(jù)集以獲得高數(shù)據(jù)局部性,以便處理那些挑戰(zhàn)。例如,系統(tǒng)可采用重新排序,其置換矩陣的行和/或列以便集群彼此附近的非零項。例如,系統(tǒng)可重新排序稀疏矩陣100以生成帶狀矩陣102,其中非零項104在彼此附近群集,如圖1a-b所示的。通過這么做,系統(tǒng)增大了具體存儲器讀取涉及更多非零項(即空間局部性)的機會,并且可導(dǎo)致比沒有重新排序在高速緩存當(dāng)中更多的再用(即時間局部性)。已經(jīng)開發(fā)并實現(xiàn)了各種重新排序算法,例如包含廣度優(yōu)先搜索(bfs)、反向cuthill-mckee(rcm)、自回避行走(saw)、metis劃分器和king's算法。具體地說,bfs及其更精細(xì)版本rcm由于其較小的復(fù)雜性和較大的效率而被頻繁用于優(yōu)化稀疏矩陣向量乘法(spmv)中的高速緩存局部性。
附圖說明
本文描述的概念在附圖中作為示例而非作為限制圖示。為了圖示的簡潔和清晰起見,在附圖中圖示的元件不一定按比例繪制。視情況而定,附圖標(biāo)記在圖之間已經(jīng)被重復(fù)了以指示對應(yīng)或類似元件。
圖1a是稀疏矩陣的至少一個實施例的簡化圖解;
圖1b是重新排序的稀疏矩陣的至少一個實施例的簡化圖解;
圖2是用于稀疏矩陣的自動重新排序的計算裝置的至少一個實施例的簡化框圖;
圖3是圖2的計算裝置的環(huán)境的至少一個實施例的簡化框圖;
圖4a是程序代碼段的至少一個實施例;
圖4b-4c是圖4a的程序代碼段的重新排序版本的實施例;
圖5是可由圖2的計算裝置執(zhí)行的用于稀疏矩陣的自動重新排序的方法的至少一個實施例的簡化流程圖;
圖6是可由圖2的計算裝置執(zhí)行的用于執(zhí)行相互依賴的陣列(array)分析的方法的至少一個實施例的簡化流程圖;
圖7a是表達式(expression)樹的至少一個實施例的簡化圖解;
圖7b是根據(jù)圖7a的表達式樹生成的表達式子樹的集合的至少一個實施例的簡化圖解;
圖8是可由圖2的計算裝置執(zhí)行的用于執(zhí)行雙向數(shù)據(jù)流分析的方法的至少一個實施例的簡化流程圖;
圖9是來自應(yīng)用雙向分析以便發(fā)現(xiàn)可重新排序陣列的結(jié)果的至少一個實施例的部分表;
圖10是代碼區(qū)域中程序代碼的簡化框圖;
圖11是來自向圖10的程序代碼應(yīng)用沒有優(yōu)化的雙向分析的結(jié)果的至少一個實施例的部分表;
圖12是基于圖11的沒有優(yōu)化的雙向分析的結(jié)果的圖10的程序代碼的重新排序版本的簡化框圖;
圖13是來自基于活性向圖10的程序代碼應(yīng)用沒有優(yōu)化的雙向分析的結(jié)果的至少一個實施例的部分表;
圖14是基于圖13的基于活性的具有優(yōu)化的雙向分析的結(jié)果的圖10的程序代碼的重新排序版本的簡化框圖;
圖15是來自基于執(zhí)行頻率向圖10的程序代碼應(yīng)用具有優(yōu)化的雙向分析的結(jié)果的至少一個實施例的部分表;
圖16是基于圖15的基于執(zhí)行頻率的具有優(yōu)化的雙向分析的結(jié)果的圖10的程序代碼的重新排序版本的簡化框圖。
具體實施方式
雖然本公開的概念易受到各種修改和備選形式,但其特定實施例已經(jīng)在附圖中作為示例示出,并且將在本文中詳細(xì)描述。然而,應(yīng)該理解,沒有意圖將本公開的概念局限于所公開的具體形式,而是相反,本發(fā)明要覆蓋與本公開和所附權(quán)利要求書一致的所有修改、等效方案和備選。
在說明書中提到“一個實施例”、“實施例”、“圖示實施例”等指示所描述的實施例可包含具體特征、結(jié)構(gòu)或特性,但每一個實施例可以或者可以不必需包含該具體特征、結(jié)構(gòu)或特性。而且,此類短語不一定是指同一實施例。進一步說,當(dāng)具體特征、結(jié)構(gòu)或特性結(jié)合實施例進行描述時,認(rèn)為它在本領(lǐng)域技術(shù)人員的認(rèn)知之內(nèi),以結(jié)合其它實施例實現(xiàn)此類特征、結(jié)構(gòu)或特性,不管是否明確描述了。此外,應(yīng)該認(rèn)識到,包含在以“a、b和c中的至少一個”的形式的列表中的術(shù)語可意味著(a);(b);(c);(a和b);(b和c);(a和c)或(a,b和c)。類似地,包含在以“a、b或c中的至少一個”形式的列表中的術(shù)語可意味著(a);(b);(c);(a和b);(b和c);(a和c)或(a,b和c)。
所公開的實施例在一些情況下可用硬件、固件、軟件或它們的任何組合來實現(xiàn)。所公開的實施例也可實現(xiàn)為由一個或多個暫時性或非暫時性機器可讀(例如計算機可讀)存儲介質(zhì)攜帶或存儲在其上的指令,其可由一個或多個處理器讀取和執(zhí)行。機器可讀存儲介質(zhì)可實施為用于存儲或傳輸由機器(例如易失性或非易失性存儲器、媒體盤或其它媒體裝置)可讀形式的信息的任何存儲裝置、機制或其它物理結(jié)構(gòu)。
在附圖中,一些結(jié)構(gòu)或方法特征可按特定布置和/或排序示出。然而,應(yīng)該認(rèn)識到,可能不需要此類特定布置和/或排序。而是,在一些實施例中,此類特征可按與在說明性附圖中示出的不同的方式和/或次序布置。此外,在具體附圖中包含結(jié)構(gòu)或方法特征不打算暗示此類特征在所有實施例中都需要,并且在一些實施例中,可能不被包含或者可與其它特征組合。
現(xiàn)在參考圖2,示出了用于稀疏矩陣的自動重新排序的計算裝置200。如下面所詳細(xì)描述的,計算裝置200配置成將本文描述的一個或多個算法自動應(yīng)用于任意重新排序函數(shù)(例如用于加速稀疏內(nèi)核的執(zhí)行)以自動確定重新排序是否對任意函數(shù)都可應(yīng)用/可準(zhǔn)許,并且如果是,則施加一個或多個算法,無需改變一個或多個基礎(chǔ)表達式的語義。應(yīng)該認(rèn)識到,此類自動重新排序技術(shù)甚至可改進專家編程人員的能力和/或效率,例如通過消除或減少對于人工重新排序優(yōu)化的需要,其經(jīng)常是易錯的并且耗時的過程。在說明性實施例中,計算裝置200通過如下方式確定重新排序的可行性:確認(rèn)所關(guān)注的具體代碼區(qū)域中的語句是分布性的,并且如果是這樣,則識別在代碼區(qū)域之前、之后和/或之內(nèi)的要重新排序和/或反向重新排序的一個或多個陣列(例如多維矩陣和/或一維向量),使得代碼區(qū)域外部的代碼不受重新排序影響。
計算裝置200可被實施為能夠執(zhí)行本文描述的功能的任何類型計算裝置或系統(tǒng)。例如,在一些實施例中,計算裝置200可被實施為桌上型計算機、膝上型計算機、平板計算機、筆記本、上網(wǎng)本、ultrabook?、智能電話、蜂窩電話、可穿戴計算裝置、個人數(shù)字助理、移動因特網(wǎng)裝置、智能裝置、服務(wù)器、路由器、交換機、混合裝置和/或任何其它計算/通信裝置。如圖2中所示,說明性計算裝置200包含處理器210、輸入/輸出("i/o")子系統(tǒng)212、存儲器214、數(shù)據(jù)存儲裝置216、通信電路118和一個或多個外圍裝置220。當(dāng)然,在其它實施例中,計算裝置200可包含其它或附加組件,諸如通常在典型計算裝置(例如各種輸入/輸出裝置和/或其它組件)中發(fā)現(xiàn)的那些。此外,在一些實施例中,說明性組件的一個或多個可結(jié)合在另一組件中,或以其它方式形成另一組件的一部分。例如,在一些實施例中,存儲器214或其部分可被結(jié)合在處理器210中。
處理器210可被實施為能夠執(zhí)行本文描述的功能的任何類型處理器。例如,處理器210可實施為單核或多核處理器(一個或多個)、數(shù)字信號處理器、微控制器或其它處理器或處理/控制電路。類似地,存儲器214可實施為能夠執(zhí)行本文描述的功能的任何類型易失性或非易失性存儲器或數(shù)據(jù)存儲裝置。在操作中,存儲器214可存儲在計算裝置200操作期間使用的各種數(shù)據(jù)和軟件,諸如操作系統(tǒng)、應(yīng)用、程序、庫以及驅(qū)動程序。存儲器214以通信方式經(jīng)由i/o子系統(tǒng)212耦合到處理器210,i/o子系統(tǒng)可實施為電路和/或組件以促進與計算裝置200的處理器210、存儲器214和/或其它組件的輸入/輸出操作。例如,i/o子系統(tǒng)212可實施為或以其它方式包含存儲器控制器集線器、輸入/輸出控制集線器、固件裝置、通信鏈路(即,點對點鏈路、總線鏈路、導(dǎo)線、電纜、光導(dǎo)、印刷電路板跡線等)和/或其它組件和子系統(tǒng)以促進輸入/輸出操作。在一些實施例中,i/o子系統(tǒng)212可形成片上系統(tǒng)(soc)的一部分,并與計算裝置200的處理器210、存儲器214和其它組件一起結(jié)合在單個集成電路芯片上。
數(shù)據(jù)存儲裝置216可實施為配置用于數(shù)據(jù)的短期存儲或長期存儲的任何類型裝置(一個或多個),諸如例如存儲器件和電路、存儲卡、硬盤驅(qū)動器、固態(tài)驅(qū)動器或其它數(shù)據(jù)存儲裝置。數(shù)據(jù)存儲裝置216和/或存儲器214可在如本文所描述的計算裝置200的操作期間存儲各種數(shù)據(jù)。
通信電路218可實施為能夠?qū)崿F(xiàn)通過網(wǎng)絡(luò)在計算裝置200與其它移動裝置之間通信的任何通信電路、裝置或它們的集成。例如,在一些實施例中,計算裝置200可從遠程計算裝置接收用戶程序、要重新排序的第一陣列(far)的身份和/或用于執(zhí)行本文描述的函數(shù)的其它有用數(shù)據(jù)。通信電路218可配置成使用任一個或多個通信技術(shù)(例如無線或有線通信)以及關(guān)聯(lián)的協(xié)議(例如以太網(wǎng)、bluetooth?、wi-fi?、wimax、lte、5g等)來實現(xiàn)此類通信。
外圍裝置220可包含任何數(shù)量的傳統(tǒng)外圍裝置或接口裝置,諸如揚聲器、麥克風(fēng)、附加存儲裝置等。包含在外圍裝置220中的具體裝置例如可取決于計算裝置200的類型和/或預(yù)期用途。
現(xiàn)在參考圖3,在使用中,計算裝置200建立用于稀疏矩陣的自動重新排序的環(huán)境300。說明性環(huán)境300包含區(qū)域標(biāo)識模塊302、分布性分析模塊304、活性分析模塊306、相互依賴的陣列分析模塊308、可重新排序陣列發(fā)現(xiàn)模塊310和代碼變換模塊312。環(huán)境300的各種模塊可實施為硬件、軟件、固件或它們的組合。例如,環(huán)境300的各種模塊、邏輯和其它組件可形成處理器210或計算裝置200的其它硬件組件的一部分,或者以其它方式由其建立。像這樣,在一些實施例中,環(huán)境300的一個或多個模塊可實施為電路或電氣裝置的集合(例如標(biāo)識電路302、分布性分析電路304、活性分析電路306、相互依賴的陣列分析電路308、可重新排序陣列發(fā)現(xiàn)電路310和/或代碼變換電路312)。應(yīng)該認(rèn)識到,在此類實施例中,標(biāo)識電路302、分布性分析電路304、活性分析電路306、相互依賴的陣列分析電路308、可重新排序陣列發(fā)現(xiàn)電路310和/或代碼變換電路312中的一個或多個可形成處理器210、i/o子系統(tǒng)212、存儲器214、數(shù)據(jù)存儲裝置216、通信電路218和/或外圍裝置220中的一個或多個的一部分。此外,在一些實施例中,說明性模塊的一個或多個可形成另一模塊的一部分,和/或說明性模塊的一個或多個可彼此獨立。如圖3所示的,在一些實施例中,環(huán)境300的各種模塊的一個或多個可形成計算裝置200的編譯器314的一部分,或由其執(zhí)行。
如本文所描述的,計算裝置200配置成例如向程序的代碼區(qū)域施加重新排序變換以便改進程序的執(zhí)行時間。區(qū)域標(biāo)識模塊302配置成識別要分析的代碼區(qū)域以便重新排序。應(yīng)該認(rèn)識到,代碼區(qū)域可以是任意表達式、塊、語句、語句/指令的集合/序列和/或程序的另一部分。例如,在一些實施例中,代碼區(qū)域可包含順序語句、循環(huán)語句(例如“for”、“repeat...until”、“while”等)、流控制語句(例如,“if...else”、“goto”、“break”、“exit”等)和/或其它語句。更確切地說,在一些實施例中,區(qū)域標(biāo)識模塊302選擇不包含流語句作為代碼區(qū)域的線性循環(huán)區(qū)域。另外,在一些實施例中,區(qū)域標(biāo)識模塊302可選擇其中程序花費了大量其執(zhí)行時間(例如至少持續(xù)閾值時間段、至少持續(xù)閾值數(shù)量的時鐘周期和/或以其它方式確定的)的代碼區(qū)域。為了便于論述,取決于具體語境,在說明書通篇可互換使用術(shù)語“表達式”、“塊”和/或“語句”。
應(yīng)該認(rèn)識到,重新排序變換可通過在代碼區(qū)域內(nèi)使用之前對一些陣列重新排序來影響代碼區(qū)域。此外,可在代碼區(qū)域之后使用的陣列可被反向重新排序(即,可施加重新排序的反向運算以將重新排序的陣列返回到其初始狀態(tài)),以確保代碼區(qū)域外部的程序代碼不受影響。另外,如果代碼區(qū)域包含流控制語句,則一個或多個陣列可沿代碼區(qū)域中的各種路徑排序和/或視情況而定反向重新排序以考慮到此類語句。在代碼區(qū)域是線性循環(huán)區(qū)域的一些實施例中,重新排序可僅發(fā)生在代碼區(qū)域外部。
圖4a中示出了程序代碼400的部分的示范實施例。如所示的,通用代碼區(qū)域400包含由區(qū)域標(biāo)識模塊302識別的代碼區(qū)域402以及所識別的代碼區(qū)402外部的“print(x)”語句。應(yīng)該認(rèn)識到,代碼區(qū)域402包含外部循環(huán)語句以及外部循環(huán)語句內(nèi)的各種操作語句。如本文所描述的,在代碼區(qū)域中使用的變量/陣列的一個或多個可被重新排序,其影響在程序代碼400中呈現(xiàn)的語句/指令。例如,在一些實施例中,重新排序可涉及在代碼區(qū)域402內(nèi)插入“reorder()”語句和/或“reverse_reorder()”語句(如圖4b所示的)(例如,除了將此類語句插入在代碼區(qū)域402外部)以生成程序代碼400的修改版本。在其它實施例中,重新排序可僅涉及將此類重新排序語句插入在代碼區(qū)域402(例如線性循環(huán)區(qū)域)外部(如圖4c中所示的)(例如緊接在代碼區(qū)域402之前和之后)以生成程序代碼400的修改版本。
分布性分析模塊304配置成確定在所識別的代碼區(qū)域中定義的表達式的一個或多個(例如每個)的分布性。也就是,分布性分析模塊304可掃描代碼區(qū)域中的所有表達式,并且確定重新排序是否在每個表達式上都是分布性的。在說明性實施例中,定義重新排序r可根據(jù):如果x是矩陣(即相似性變換),則
在一些實施例中,沒有流控制語句的代碼區(qū)域可被共同解釋為單個表達式。如果重新排序在具體代碼區(qū)域中的所有表達式上都是分布性的,則應(yīng)該認(rèn)識到,重新排序在作為說明性實施例中的共同表達式的整個區(qū)域上也是分布性的。像這樣,為了對代碼區(qū)域的結(jié)果重新排序,計算裝置200可對到代碼區(qū)域的輸入重新排序,無需修改區(qū)域內(nèi)部的代碼。在代碼區(qū)域的確包含流控制語句的實施例中,輸入的一個或多個可能是有條件的,并且因此,那些輸入的重新排序可能也是有條件的(例如參見圖4b)。
應(yīng)該認(rèn)識到,一些常見的陣列相關(guān)表達式經(jīng)常是分布性的。例如,表達式
活性分析模塊306配置成確定在代碼區(qū)域內(nèi)一個或多個位置的一個或多個(例如每個)變量/陣列的活性(即,變量/陣列是活的還是死的)。例如,在一些實施例中,活性分析模塊306可以確定在代碼區(qū)域中的每個語句/表達式之前和/或之后的每個變量的活性。在說明性實施例中,變量/陣列被視為在程序代碼中的具體編程點是活的,如果有可能該變量在將來(即在那個編程點之后)將被使用的話。應(yīng)該認(rèn)識到,計算裝置200(例如編譯器314)可利用用于確定變量活性的任何適合的技術(shù)、算法和/或機制。
相互依賴的陣列分析模塊308配置成分析具體表達式以構(gòu)造或者以其它方式確定表達式的相互依賴的陣列/變量的集群。在說明性實施例中,陣列的集合被視為彼此相互依賴的,如果那些陣列中的任何陣列的重新排序都會使其它陣列的重新排序成為必要的話。例如,如果表達式
可重新排序陣列發(fā)現(xiàn)模塊310配置成對所識別的代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析,以便發(fā)現(xiàn)代碼區(qū)域中的可重新排序陣列。如下所述,在一些實施例中,可重新排序陣列發(fā)現(xiàn)模塊310可基于后向傳送函數(shù)(transferfunction)通過代碼區(qū)域中的一個或多個表達式迭代地執(zhí)行可重新排序陣列的后向傳播,并基于前向傳送函數(shù)執(zhí)行前向傳播。例如,在一些實施例中,可重新排序陣列發(fā)現(xiàn)模塊310可識別具有數(shù)據(jù)局部性的可通過重新排序變換改進的稀疏陣列,并且通過雙向流分析來分析/傳播該陣列(例如以確定要重新排序的其它陣列)。在一些實施例中,此類陣列可以是與已知對代碼區(qū)域重要的一些運算(例如稀疏矩陣向量乘法(spmv))相關(guān)的前一個或幾個稀疏陣列。在另一實施例中,可重新排序陣列發(fā)現(xiàn)模塊310可從用戶接收要重新排序的第一陣列(far)(例如,經(jīng)由代碼區(qū)域的用戶注釋以便由編譯器314分析)。
代碼變換模塊312配置成重新排序和/或反向重新排序代碼區(qū)域中和/或程序代碼中的代碼區(qū)域周邊(例如緊接在代碼區(qū)域之前或之后)內(nèi)的一個或多個陣列。在說明性實施例中,應(yīng)該認(rèn)識到,代碼變換模塊312確定要重新排序和/或反向排序的具體陣列以及在程序代碼中的具體位置(在其處基于可重新排序陣列發(fā)現(xiàn)模塊310的雙向流分析執(zhí)行此類操作)。另外,應(yīng)該認(rèn)識到,代碼變換模塊312可取決于具體實施例采用任何適合的重新排序算法,并且可利用任何適合的算法、技術(shù)和/或機制來實際實現(xiàn)程序代碼的變換。
現(xiàn)在參考圖5,在使用中,計算裝置200可執(zhí)行用于稀疏矩陣的自動重新排序的方法500(例如沒有用戶定向和/干預(yù))。說明性方法500開始于框502,其中計算裝置200接收包含可重新排序的一個或多個稀疏矩陣的程序(例如程序代碼)。更確切地說,在一些實施例中,程序代碼可由計算裝置200的編譯器314檢索。在框504,計算裝置200識別要分析的程序代碼的代碼區(qū)域以便重新排序陣列。如上所述,代碼區(qū)域可以是程序代碼的任何任意部分;然而,在一些實施例中,所識別/選擇的代碼區(qū)域是線性循環(huán)區(qū)域或程序代碼的另一部分,在其處存在大量執(zhí)行時間的。
在框506,計算裝置200執(zhí)行程序代碼的代碼區(qū)域的分布性分析以便確定在所識別的代碼區(qū)域中定義的表達式的一個或多個(例如每個)的分布性。相應(yīng)地,在框508,計算裝置200可識別代碼區(qū)域中的具體表達式,并且在框510,確定表達式上重新排序算法的分布性。例如,計算裝置200可掃描代碼區(qū)域中的所有表達式,并且確定重新排序是否在每一個表達式上都是分布性的。如上所述,在說明性實施例中,如果其語義保持不變,則表達式
如果計算裝置200在框512確定代碼區(qū)域中的表達式的一個或多個是非分布性的,則方法500終止。然而,如果計算裝置200確定重新排序在代碼區(qū)域中的每一個表達式上都是分布性的,并且因此在總體代碼區(qū)域上是分布性的,則在框514,計算裝置200對代碼區(qū)域執(zhí)行活性分析以確定在代碼區(qū)域內(nèi)的各種編程點的陣列的一個或多個(例如每個)的活性。例如,在一些實施例中,計算裝置200確定在代碼區(qū)域中的每個語句/表達式之前和之后陣列是“活的”還是“死的”。如上面所指示的,計算裝置200(例如編譯器314)可采用用于確定變量活性的任何適合的技術(shù)、算法和/或機制。另外,盡管活性分析在圖5中被顯示為在分布性分析之后,但在一些實施例中,活性分析可在分布性分析之前執(zhí)行。
在框516,計算裝置200對代碼區(qū)域中的一個或多個(例如每個)表達式執(zhí)行相互依賴的陣列分析,以對于那些表達式中的每個,確定表達式的哪些陣列/變量是彼此相互依賴的,并基于該確定生成適當(dāng)集群。換言之,計算裝置200確定表達式陣列的重新排序是否會使表達式其它陣列的重新排序成為必要。例如,如上面所指示的,如果代碼區(qū)域包含語句
現(xiàn)在參考圖6,說明性方法600開始于框602,其中計算裝置200識別并選擇代碼區(qū)域的語句/表達式用于分析。作為示例,代碼區(qū)域可包含由計算裝置200選擇的表達式
在框606,如果可能的話,計算裝置200將表達式樹分成多個子樹702。在這么做時,在框608,計算裝置200可確定表達式樹的內(nèi)部節(jié)點的結(jié)果類型。在說明性實施例中,如果內(nèi)部節(jié)點的結(jié)果類型是數(shù)字,則該節(jié)點與其父節(jié)點之間的邊緣被打破,以將表達式樹分成兩個子樹。如果內(nèi)部節(jié)點是函數(shù),則在一些實施例中,可分析函數(shù)的源代碼以確定其結(jié)果類型。在其它實施例中,計算裝置200可依靠函數(shù)的元數(shù)據(jù)(從計算裝置200的用戶接收的)來確定相互依賴的陣列分析的結(jié)果類型。在說明性實施例中,表達式樹和/或子樹被分解,直到原始表達式樹不能被分成更小的子樹。在涉及表達式樹700的示范實施例中,
在圖6的框610,計算裝置200生成或確定每個生成的表達式子樹的相互依賴的陣列的集合/集群。具體地說,在說明性實施例中,具體子樹中的每個陣列/變量都被包含在與該具體子樹關(guān)聯(lián)的結(jié)合/集群中。例如,在圖7a-b的示范實施例中,第一子樹702的陣列/變量
回頭參考圖5,在框518,計算裝置200對所識別的代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析,以便發(fā)現(xiàn)代碼區(qū)域中的可重新排序陣列。如下所描述的,應(yīng)該認(rèn)識到,計算裝置200可利用前向和后向傳播函數(shù)、前向和后向傳送函數(shù)和/或其它函數(shù),以便例如基于所提供的要重新排序的第一陣列(far)來發(fā)現(xiàn)可重新排序陣列。例如,可根據(jù)
例如,基于上面描述的示范表達式
作為示例,在此類實施例中,應(yīng)該認(rèn)識到,
在說明性實施例中,可根據(jù)
可根據(jù)
在一些實施例中,計算裝置200可執(zhí)行方法800以執(zhí)行雙向數(shù)據(jù)流分析,如圖8中所示的。在一些實施例中,雙向數(shù)據(jù)流分析工作在控制流圖(cfg)上,其中每個塊b都是語句/表達式。說明性方法800開始于框802,其中計算裝置200初始化代碼區(qū)域中的語句/表達式的輸入和輸出集/狀態(tài)。為了這么做,在代碼區(qū)域外部的任何語句/表達式的輸入和輸出集可首先被初始化成空集。此外,在說明性實施例中,對于每個區(qū)域條目,輸出集都被初始化成要重新排序的第一陣列(far)。如上面所指示的,far可由計算裝置200的用戶提供,或以其它方式由編譯器314確定。對于代碼區(qū)域中的其它語句,輸出集可被初始化成全集。在一些實施例中,代碼區(qū)域中的語句的輸入集不初始化,因為他們可在隨后的步驟中自動例示。更正式地說,在一些實施例中,代碼區(qū)域外部的所有語句b都可根據(jù)
在框804,計算裝置200預(yù)先調(diào)節(jié)代碼區(qū)域中語句的輸入和輸出集。為了這么做,在框806,計算裝置200可向語句應(yīng)用前向傳送函數(shù)。像這樣,應(yīng)該認(rèn)識到,對于每個語句b,輸入集
在一些實施例中,在框808,計算裝置200可選擇傳送函數(shù)優(yōu)化(例如對于后向傳送函數(shù))。具體地說,在說明性實施例中,計算裝置200可沒有優(yōu)化、具有基于陣列活性的優(yōu)化或者具有基于代碼區(qū)域中各種表達式的執(zhí)行頻率的優(yōu)化,而應(yīng)用后向傳送函數(shù)。
在框810,計算裝置200向代碼區(qū)域中的語句應(yīng)用后向傳送函數(shù)。為了這么做,在框812,計算裝置200可基于選擇的優(yōu)化應(yīng)用后向傳送函數(shù)。在說明性實施例中,后向傳送函數(shù)可通過添加陣列(在其每個后繼前面可重新排序)來擴大
在框814,計算裝置200向代碼區(qū)域中的語句應(yīng)用前向傳送函數(shù)。應(yīng)該認(rèn)識到,對于前向傳送函數(shù)的應(yīng)用類似于上面相對于預(yù)先調(diào)節(jié)所描述的;然而,
回頭參考圖5,在框520,計算裝置200基于所發(fā)現(xiàn)的可重新排序陣列變換程序代碼。具體地說,計算裝置200配置成重新排序和/或反向重新排序代碼區(qū)域中和/或程序代碼中的代碼區(qū)域周邊(例如緊接在代碼區(qū)域之前或之后)內(nèi)的一個或多個陣列。如上面所指示的,計算裝置200可利用任何適合的技術(shù)來實現(xiàn)程序代碼本身的變換。在一些實施例中,對于代碼區(qū)域中的任何語句b1,如果存在從語句b1到隨后語句b2的邊緣(例如在控制流圖(cfg)中),其中b2例如是cfg中的另一塊,則對于每個變量/陣列
應(yīng)該認(rèn)識到,在一些實施例中,方法400、500、600和/或800中的任一個或多個可被實施為存儲在計算機可讀媒體上的各種指令,它們可由處理器210和/或計算裝置200的其它組件執(zhí)行以使計算裝置200執(zhí)行相應(yīng)方法400、500、600和/或800。計算機可讀媒體可被實施為能夠由計算裝置200讀取的任何類型媒體,包含但不限于存儲器214、數(shù)據(jù)存儲裝置216、計算裝置200的其它存儲器或數(shù)據(jù)存儲裝置、由計算裝置200的外圍裝置220可讀的便攜式媒體和/或其它媒體。
部分表900描繪了來自向僅包含兩個語句/塊:
現(xiàn)在參考圖10,示出了描繪來自程序代碼的識別的代碼區(qū)域的控制流圖1000。如所示的,圖100包含描繪程序代碼的各種語句的多個塊b1-b13。在說明性實施例中,所識別的代碼區(qū)域包含塊b1-b12,而塊b13在代碼區(qū)域外部。應(yīng)該認(rèn)識到,圖11-16描繪了來自應(yīng)用各種雙向流分析算法(即具有和沒有優(yōu)化)的結(jié)果以及結(jié)果變換的程序代碼。應(yīng)該進一步認(rèn)識到,盡管來自應(yīng)用一種雙向流分析算法(即具有優(yōu)化)的結(jié)果變換代碼可被視為來自另一雙向流分析算法(例如沒有優(yōu)化)的結(jié)果變換代碼中的提升/移動一些語句的后果,但用本文描述的技術(shù)可能沒有必要這么做。在一些實施例中,可僅基于對應(yīng)雙向流分析算法的結(jié)果,生成每個結(jié)果變換的代碼。
在圖11中示出來自向圖10的程序代碼應(yīng)用雙向分析(沒有優(yōu)化)的結(jié)果的部分表1100。應(yīng)該認(rèn)識到,部分表1100(以及下面描述的表1300和1500)僅包含本文描述的初始化、預(yù)先調(diào)節(jié)和第一后向通過階段。然而,實際上,可基于本文描述的技術(shù)完成整個表。如在與表1100對應(yīng)的圖12的控制流圖1200中所示出的,變換程序代碼以重新排序和反向重新排序在代碼區(qū)域內(nèi)各種編程點的變量/陣列(例如p、x、r和i)。
如上面所描述的,在一些實施例中,可優(yōu)化雙向流分析以考慮變量活性。在圖13的表1300中部分示出了應(yīng)用具有此類優(yōu)化的雙向流分析的結(jié)果,且在圖14的控制流圖1400中示出了對應(yīng)變換的程序代碼。如上面示出和描述的,與“部分死的”變量(例如a、p、r和i)關(guān)聯(lián)的重新排序函數(shù)從代碼區(qū)域內(nèi)移動到代碼區(qū)域之前以便更有效執(zhí)行。在又其它實施例中,可優(yōu)化雙向流分析以考慮如上所述的執(zhí)行頻率。在圖15的表1500中部分示出了應(yīng)用具有此類優(yōu)化的雙向流分析的結(jié)果,而在圖16的控制流圖1600中描繪了對應(yīng)變換的程序代碼。如上面示出和描述的,在程序代碼或者更確切地說代碼區(qū)域(例如循環(huán))的頻繁執(zhí)行區(qū)域內(nèi)出現(xiàn)的重新排序函數(shù)可被移動到循環(huán)外部(例如在循環(huán)和/或代碼區(qū)域前面)以改進執(zhí)行。然而,在此類實施例中,可能有必要(例如在程序代碼中存在條件語句的情形下)將附加反向重新排序函數(shù)放在代碼區(qū)域內(nèi)。例如,在說明性實施例中,在語句b2與b13之間包含反向重新排序函數(shù),以確保到緊跟代碼區(qū)域的“print(x)”語句的陣列/變量輸出是準(zhǔn)確的。
示例
下面提供了本文公開的技術(shù)的說明性示例。技術(shù)的實施例可包含下面描述的示例中的任一個或多個示例以及它們的任何組合。
示例1包含一種用于稀疏矩陣的自動重新排序的計算裝置,所述計算裝置包括:分布性分析模塊,用于確定在程序代碼的代碼區(qū)域中定義的表達式的分布性,其中如果所述表達式的語義不受所述表達式的輸入或輸出的重新排序的影響,則所述表達式被確定成是分布性的;相互依賴的陣列分析模塊,用于對所述表達式執(zhí)行相互依賴的陣列分析以確定所述表達式的相互依賴的陣列的一個或多個集群,其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列;以及可重新排序陣列發(fā)現(xiàn)模塊,用于基于所述相互依賴的陣列的所述一個或多個集群借助于通過所述代碼區(qū)域中的所述表達式的可重新排序陣列的迭代的后向傳播和前向傳播對所述代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析,其中所述后向傳播基于后向傳送函數(shù),而所述前向傳播基于前向傳送函數(shù)。
示例2包含示例1的主題,并且進一步包含區(qū)域標(biāo)識模塊以識別所述程序代碼的所述代碼區(qū)域。
示例3包含示例1和示例2中任一示例的主題,并且其中識別所述代碼區(qū)域包括識別包含循環(huán)體內(nèi)的代碼而不包含流控制語句的所述程序代碼的線性循環(huán)區(qū)域。
示例4包含示例1-3中任一示例的主題,并且其中識別所述代碼區(qū)域包括由所述計算裝置的編譯器識別所述代碼區(qū)域。
示例5包含示例1-4中任一示例的主題,并且其中識別所述代碼區(qū)域包括識別由所述計算裝置至少在閾值時段內(nèi)要執(zhí)行的代碼區(qū)域。
示例6包含示例1-5中任一示例的主題,并且其中所述區(qū)域標(biāo)識模塊進一步由所述計算裝置的編譯器接收所述程序代碼。
示例7包含示例1-6中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定在所述代碼區(qū)域中定義的每個表達式的所述分布性。
示例8包含示例1-7中任一示例的主題,并且其中執(zhí)行所述相互依賴的陣列分析包括響應(yīng)于每個表達式是分布性的確定而執(zhí)行所述相互依賴的陣列分析。
示例9包含示例1-8中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定語句
示例10包含示例1-9中任一示例的主題,并且其中確定所述表達式的所述分布性包括響應(yīng)于確定如下至少一項而確定所述表達式是非分布性的:(i)所述表達式要求輸入或輸出結(jié)構(gòu)具有特定形狀;(ii)所述表達式定義所述程序代碼的輸入-輸出函數(shù);(iii)所述表達式要求逐位可再生性;或(iv)所述表達式包含對所述計算裝置的編譯器未知的函數(shù)。
示例11包含示例1-10中任一示例的主題,并且其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列,使得所述一個或多個集群的具體集群中的一個陣列的重新排序影響所述具體集群的每個其它陣列。
示例12包含示例1-11中任一示例的主題,并且其中執(zhí)行所述相互依賴的陣列分析包括:生成所述表達式的表達式樹,其中所述表達式樹的每個內(nèi)部節(jié)點指示所述表達式的運算,而所述表達式樹的每個端節(jié)點指示陣列或標(biāo)量;基于所述陣列的相互依賴性將所述表達式樹分成表達式子樹的集合;以及基于包含在所述表達式子樹中的所述陣列確定每個表達式子樹的相互依賴的陣列的對應(yīng)集群。
示例13包含示例1-12中任一示例的主題,并且其中將所述表達式樹分成表達式子樹的集合包括確定所述表達式樹的每個內(nèi)部節(jié)點的結(jié)果類型。
示例14包含示例1-13中任一示例的主題,并且其中執(zhí)行所述雙向數(shù)據(jù)流分析包括:初始化所述表達式的輸入集和輸出集;通過向要重新排序的第一陣列應(yīng)用所述前向傳送函數(shù)來預(yù)先調(diào)節(jié)所述表達式的所述輸入集和所述輸出集;以及迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù),直到所述輸入集和所述輸出集不改變。
示例15包含示例1-14中任一示例的主題,并且其中所述可重新排序陣列發(fā)現(xiàn)模塊進一步從所述計算裝置的用戶接收所述要重新排序的第一陣列。
示例16包含示例1-15中任一示例的主題,并且其中迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù)包括:迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù),直到每個表達式的輸入集和輸出集都不改變。
示例17包含示例1-16中任一示例的主題,并且進一步包含代碼變換模塊以基于所述雙向數(shù)據(jù)流分析變換所述程序代碼以重新排序至少一個陣列。
示例18包含示例1-17中任一示例的主題,并且進一步包含活性分析模塊以確定在所述代碼區(qū)域內(nèi)的每個語句的所述代碼區(qū)域中的每個變量的活性。
示例19包含一種稀疏矩陣的自動重新排序的方法,所述方法包括:由計算裝置確定在程序代碼的代碼區(qū)域中定義的表達式的分布性,其中如果所述表達式的語義不受所述表達式的輸入或輸出的重新排序的影響,則所述表達式被確定成是分布性的;由所述計算裝置對所述表達式執(zhí)行相互依賴的陣列分析以確定所述表達式的相互依賴的陣列的一個或多個集群,其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列;以及由所述計算裝置基于所述相互依賴的陣列的所述一個或多個集群借助于通過所述代碼區(qū)域中的所述表達式的可重新排序陣列的迭代的后向傳播和前向傳播對所述代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析,其中所述后向傳播基于后向傳送函數(shù),而所述前向傳播基于前向傳送函數(shù)。
示例20包含示例19的主題,并且進一步包含:由計算裝置識別程序代碼的代碼區(qū)域。
示例21包含示例19和20中任一示例的主題,并且其中識別所述代碼區(qū)域包括識別包含循環(huán)體內(nèi)的代碼而不包含流控制語句的所述程序代碼的線性循環(huán)區(qū)域。
示例22包含示例19-21中任一示例的主題,并且其中識別所述代碼區(qū)域包括由所述計算裝置的編譯器識別所述代碼區(qū)域。
示例23包含示例19-22中任一示例的主題,并且其中識別所述代碼區(qū)域包括識別由所述計算裝置至少在閾值時段內(nèi)要執(zhí)行的代碼區(qū)域。
示例24包含示例19-23中任一示例的主題,并且進一步包含由計算裝置的編譯器接收程序代碼。
示例25包含示例19-24中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定在所述代碼區(qū)域中定義的每個表達式的所述分布性。
示例26包含示例19-25中任一示例的主題,并且其中執(zhí)行所述相互依賴的陣列分析包括響應(yīng)于確定每個表達式是分布性而執(zhí)行所述相互依賴的陣列分析。
示例27包含示例19-26中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定語句
示例28包含示例19-27中任一示例的主題,并且其中確定所述表達式的所述分布性包括響應(yīng)于確定如下至少一項而確定所述表達式是非分布性的:(i)所述表達式要求輸入或輸出結(jié)構(gòu)具有特定形狀;(ii)所述表達式定義所述程序代碼的輸入-輸出函數(shù);(iii)所述表達式要求逐位可再生性;或(iv)所述表達式包含對所述計算裝置的編譯器未知的函數(shù)。
示例29包含示例19-28中任一示例的主題,并且其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列,使得所述一個或多個集群的具體集群中的一個陣列的重新排序影響所述具體集群的每個其它陣列。
示例30包含示例19-29中任一示例的主題,并且其中執(zhí)行所述相互依賴的陣列分析包括:生成所述表達式的表達式樹,其中所述表達式樹的每個內(nèi)部節(jié)點指示所述表達式的運算,而所述表達式樹的每個端節(jié)點指示陣列或標(biāo)量;基于所述陣列的相互依賴性將所述表達式樹分成表達式子樹的集合;以及基于包含在所述表達式子樹中的所述陣列確定每個表達式子樹的相互依賴的陣列的對應(yīng)集群。
示例31包含示例19-30中任一示例的主題,并且其中將所述表達式樹分成表達式子樹的集合包括確定所述表達式樹的每個內(nèi)部節(jié)點的結(jié)果類型。
示例32包含示例19-31中任一示例的主題,并且其中執(zhí)行所述雙向數(shù)據(jù)流分析包括:初始化所述表達式的輸入集和輸出集;通過向要重新排序的第一陣列應(yīng)用所述前向傳送函數(shù)來預(yù)先調(diào)節(jié)所述表達式的所述輸入集和所述輸出集;以及迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù),直到所述輸入集和所述輸出集不改變。
示例33包含示例19-32中任一示例的主題,并且進一步包含:由計算裝置從計算裝置的用戶接收要重新排序的第一陣列。
示例34包含示例19-33中任一示例的主題,并且其中迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù)包括:迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù),直到每個表達式的輸入集和輸出集都不改變。
示例35包含示例19-34中任一示例的主題,并且進一步包含:基于所述雙向數(shù)據(jù)流分析變換所述程序代碼以重新排序至少一個陣列。
示例36包含示例19-35中任一示例的主題,并且進一步包含:由計算裝置確定在代碼區(qū)域內(nèi)的每個語句的代碼區(qū)域中的每個變量的活性。
示例37包含計算裝置,計算裝置包括:處理器;以及存儲器,所述存儲器具有多個指令存儲在其上,所述指令當(dāng)由處理器執(zhí)行時使計算裝置執(zhí)行示例19-36中任一示例的方法。
示例38包含一個或多個機器可讀存儲媒體,其包括多個指令存儲在其上,所述指令響應(yīng)于被執(zhí)行而導(dǎo)致計算裝置執(zhí)行示例19-36中任一示例的方法。
示例39包含包括用于執(zhí)行示例19-36中任一示例的方法的部件的計算裝置。
示例40包含一種用于稀疏矩陣的自動重新排序的計算裝置,所述計算裝置包括:用于確定在程序代碼的代碼區(qū)域中定義的表達式的分布性的部件,其中如果所述表達式的語義不受所述表達式的輸入或輸出的重新排序的影響,則所述表達式被確定成是分布性的;用于對所述表達式執(zhí)行相互依賴的陣列分析以確定所述表達式的相互依賴的陣列的一個或多個集群的部件,其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列;以及用于基于所述相互依賴的陣列的所述一個或多個集群借助于通過所述代碼區(qū)域中的所述表達式的可重新排序陣列的迭代的后向傳播和前向傳播對所述代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析的部件,其中所述后向傳播基于后向傳送函數(shù),而所述前向傳播基于前向傳送函數(shù)。
示例41包含示例40的主題,并且進一步包含:用于識別程序代碼的代碼區(qū)域的部件。
示例42包含示例40和41中任一示例的主題,并且其中用于識別所述代碼區(qū)域的部件包括用于識別包含循環(huán)體內(nèi)的代碼而不包含流控制語句的所述程序代碼的線性循環(huán)區(qū)域的部件。
示例43包含示例40-42中任一示例的主題,并且其中用于識別所述代碼區(qū)域的部件包括用于由所述計算裝置的編譯器識別所述代碼區(qū)域的部件。
示例44包含示例40-43中任一示例的主題,并且其中用于識別所述代碼區(qū)域的部件包括用于識別由所述計算裝置至少在閾值時段內(nèi)要執(zhí)行的代碼區(qū)域的部件。
示例45包含示例40-44中任一示例的主題,并且進一步包含:用于由計算裝置的編譯器接收程序代碼的部件。
示例46包含示例40-45中任一示例的主題,并且其中用于確定所述表達式的所述分布性的部件包括用于確定在所述代碼區(qū)域中定義的每個表達式的所述分布性的部件。
示例47包含示例40-46中任一示例的主題,并且其中用于執(zhí)行所述相互依賴的陣列分析的部件包括用于響應(yīng)于確定每個表達式是分布性的而執(zhí)行所述相互依賴的陣列分析的部件。
示例48包含示例40-47中任一示例的主題,并且其中用于確定表達式的分布性的部件包括用于確定語句
示例49包含示例40-48中任一示例的主題,并且其中用于確定所述表達式的所述分布性的部件包括用于響應(yīng)于確定如下至少一項而確定所述表達式是非分布性的部件:(i)所述表達式要求輸入或輸出結(jié)構(gòu)具有特定形狀;(ii)所述表達式定義所述程序代碼的輸入-輸出函數(shù);(iii)所述表達式要求逐位可再生性;或(iv)所述表達式包含對所述計算裝置的編譯器未知的函數(shù)。
示例50包含示例40-49中任一示例的主題,并且其中所述一個或多個集群的集群的每個陣列相互依賴于所述集群的每個其它陣列,使得所述一個或多個集群的具體集群中的一個陣列的重新排序影響所述具體集群的每個其它陣列。
示例51包含示例40-50中任一示例的主題,并且其中用于執(zhí)行相互依賴的陣列分析的部件包括:用于生成所述表達式的表達式樹的部件,其中所述表達式樹的每個內(nèi)部節(jié)點指示所述表達式的運算,而所述表達式樹的每個端節(jié)點指示陣列或標(biāo)量;用于基于所述陣列的相互依賴性將所述表達式樹分成表達式子樹的集合的部件;以及用于基于包含在所述表達式子樹中的所述陣列確定每個表達式子樹的相互依賴的陣列的對應(yīng)集群的部件。
示例52包含示例40-51中任一示例的主題,并且其中用于將所述表達式樹分成表達式子樹的集合的部件包括用于確定所述表達式樹的每個內(nèi)部節(jié)點的結(jié)果類型的部件。
示例53包含示例40-52中任一示例的主題,并且其中用于執(zhí)行所述雙向數(shù)據(jù)流分析的部件包括:用于初始化所述表達式的輸入集和輸出集的部件;用于通過向要重新排序的第一陣列應(yīng)用所述前向傳送函數(shù)來預(yù)先調(diào)節(jié)所述表達式的所述輸入集和所述輸出集的部件;以及用于迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù)直到所述輸入集和所述輸出集不改變的部件。
示例54包含示例40-53中任一示例的主題,并且進一步包含:用于從計算裝置的用戶接收要重新排序的第一陣列的部件。
示例55包含示例40-54中任一示例的主題,并且其中用于迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù)的部件包括:用于迭代地應(yīng)用所述后向傳送函數(shù)和所述前向傳送函數(shù)直到每個表達式的輸入集和輸出集都不改變的部件。
示例56包含示例40-55中任一示例的主題,并且進一步包含:用于基于所述雙向數(shù)據(jù)流分析變換所述程序代碼以重新排序至少一個陣列的部件。
示例57包含示例40-56中任一示例的主題,并且進一步包含:用于確定在代碼區(qū)域內(nèi)的每個語句的代碼區(qū)域中的每個變量的活性的部件。