亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

用于稀疏矩陣的自動重新排序的技術(shù)的制作方法

文檔序號:11216248閱讀:1040來源:國知局
用于稀疏矩陣的自動重新排序的技術(shù)的制造方法與工藝



背景技術(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是矩陣(即相似性變換),則;如果x是向量,則;或者如果x是標(biāo)量數(shù)字,則,其中p是置換矩陣,并且是p的轉(zhuǎn)置/逆。另外,在說明性實施例中,如果其語義保持不變,則表達式上的重新排序r是分布性的(不管其輸出是否被重新排序和/或其輸入是否被重新排序)。換言之,,其中是輸入的集合。

在一些實施例中,沒有流控制語句的代碼區(qū)域可被共同解釋為單個表達式。如果重新排序在具體代碼區(qū)域中的所有表達式上都是分布性的,則應(yīng)該認(rèn)識到,重新排序在作為說明性實施例中的共同表達式的整個區(qū)域上也是分布性的。像這樣,為了對代碼區(qū)域的結(jié)果重新排序,計算裝置200可對到代碼區(qū)域的輸入重新排序,無需修改區(qū)域內(nèi)部的代碼。在代碼區(qū)域的確包含流控制語句的實施例中,輸入的一個或多個可能是有條件的,并且因此,那些輸入的重新排序可能也是有條件的(例如參見圖4b)。

應(yīng)該認(rèn)識到,一些常見的陣列相關(guān)表達式經(jīng)常是分布性的。例如,表達式、、、、、一般是分布性的,其中m和n是矩陣,v和w是向量,并且n是標(biāo)量數(shù)字。此外,重新排序在沒有輸入和輸出的表達式(例如條件“if(n)”和“goto”語句)上和在具有標(biāo)量輸入和輸出的表達式上一般是分布性的。相比之下,一些其它常見的陣列相關(guān)的表達式不是分布性的。例如,要求輸入和/或輸出是具體“形狀”(例如假定輸入是上三角矩陣或下三角矩陣的三角求解器)的表達式、輸入/輸出表達式(例如打印命令)、要求逐位可再生性的表達式和/或?qū)幾g器314未知的函數(shù)一般可被視為非分布性的。應(yīng)該認(rèn)識到,如果用于具體用戶定義的函數(shù)的源代碼可用,則源代碼可與本文描述的技術(shù)一致地進行分析以確定其分布性。盡管代碼區(qū)域形成/標(biāo)識和分布性分析在本文分開進行描述,但在一些實施例中,代碼區(qū)域形成和分布性可同時進行分析。例如,在一些實施例中,計算裝置200可開始于空區(qū)域,并且通過添加確認(rèn)為分布性的語句來逐步“生長”區(qū)域。

活性分析模塊306配置成確定在代碼區(qū)域內(nèi)一個或多個位置的一個或多個(例如每個)變量/陣列的活性(即,變量/陣列是活的還是死的)。例如,在一些實施例中,活性分析模塊306可以確定在代碼區(qū)域中的每個語句/表達式之前和/或之后的每個變量的活性。在說明性實施例中,變量/陣列被視為在程序代碼中的具體編程點是活的,如果有可能該變量在將來(即在那個編程點之后)將被使用的話。應(yīng)該認(rèn)識到,計算裝置200(例如編譯器314)可利用用于確定變量活性的任何適合的技術(shù)、算法和/或機制。

相互依賴的陣列分析模塊308配置成分析具體表達式以構(gòu)造或者以其它方式確定表達式的相互依賴的陣列/變量的集群。在說明性實施例中,陣列的集合被視為彼此相互依賴的,如果那些陣列中的任何陣列的重新排序都會使其它陣列的重新排序成為必要的話。例如,如果表達式中的稀疏矩陣a被重新排序(例如一些列和/或行被交換),則向量x和y必須被重新排序。類似地,如果x或y重新排序,則a必須相應(yīng)地重新排序。應(yīng)該認(rèn)識到,一般而言,向另一陣列指配涉及一個或多個陣列的表達式的語句指示那些陣列中每個陣列之間的相互依賴性。例如,如果代碼區(qū)域包含語句,其中是陣列的表達式,則陣列是相互依賴的陣列。如下面所更詳細(xì)描述的,在一些實施例中,相互依賴的陣列分析模塊308可生成具體語句的表達式樹,以便確定表達式的哪些變量/陣列是彼此相互依賴的,并由此生成集群。當(dāng)然,在一些實施例中,語句可用3-地址格式(結(jié)果,算子和兩個運算數(shù))表達,其隱含地是表達式樹,沒有明確生成表達式樹。

可重新排序陣列發(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ū)域中的所有表達式,并且確定重新排序是否在每一個表達式上都是分布性的。如上所述,在說明性實施例中,如果其語義保持不變,則表達式上的重新排序r是分布性的,不管其輸出是否被重新排序和/或其輸入是否被重新排序。也就是,如果,其中是輸入的集合,則重新排序r在表達式上是分布性的。在一些實施例中,表達式可包含通常使用的已知是分布性的或非分布性的陣列相關(guān)表達式。相應(yīng)地,在一些實施例中,計算裝置200可確定在給定表達式中的具體陣列上執(zhí)行的運算的類型。盡管分布性分析被描述為在代碼標(biāo)識之后,但在一些實施例中,分布性分析和代碼標(biāo)識可同時發(fā)生。例如,在一些實施例中,計算裝置200可開始于空區(qū)域,并且通過添加識別為/已知是分布性的語句來逐步“生長”代碼區(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ū)域包含語句,其中是陣列的表達式,則陣列、是相互依賴的陣列。在一些實施例中,計算裝置200可執(zhí)行方法600以生成并分析如圖6中所示的表達式樹,以便確定表達式的哪些變量/陣列彼此相互依賴,并由此生成集群。當(dāng)然,在一些實施例中,語句可用3-地址格式(結(jié)果,算子和兩個運算數(shù))表達,其隱含地是表達式樹,沒有明確生成表達式樹。

現(xiàn)在參考圖6,說明性方法600開始于框602,其中計算裝置200識別并選擇代碼區(qū)域的語句/表達式用于分析。作為示例,代碼區(qū)域可包含由計算裝置200選擇的表達式,其中、、是向量,m是矩陣,并且是點積函數(shù)。在框604,計算裝置200生成所選擇的語句/表達式的表達式樹。具體地說,計算裝置200可生成表達式樹700,如圖7a所示的。如所示的,表達式樹700包含多個內(nèi)部節(jié)點和端節(jié)點。具體地說,在說明性實施例中,表達式樹700包含指示運算(=、+、*和)的內(nèi)部節(jié)點,并且包含指示對應(yīng)運算的運算數(shù)的子節(jié)點。此外,表達式樹700包含指示變量/陣列和/或標(biāo)量常數(shù)(、、、和m)的端節(jié)點。盡管示范表達式,并且因此表達式樹700僅包含二進制運算,但應(yīng)該認(rèn)識到,任何具體表達式和表達式樹在其它實施例中都可包含具有不同數(shù)量運算數(shù)的運算(例如由于表達式中的三元算子)。像這樣,在其它實施例中,表達式樹的具體操作節(jié)點可包含多于或少于2個的子節(jié)點。

在框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的示范實施例中,運算生成標(biāo)量值。相應(yīng)地,通過打破節(jié)點與其父節(jié)點之間的鏈路將表達式樹700分成2個子樹702,如圖7b中所示的。

在圖6的框610,計算裝置200生成或確定每個生成的表達式子樹的相互依賴的陣列的集合/集群。具體地說,在說明性實施例中,具體子樹中的每個陣列/變量都被包含在與該具體子樹關(guān)聯(lián)的結(jié)合/集群中。例如,在圖7a-b的示范實施例中,第一子樹702的陣列/變量被包含在第一集群中,而第二子樹的陣列/變量、被包含在第二集群中。在圖6的框612中,計算裝置200確定是否分析另一語句/表達式。例如,在說明性實施例中,計算裝置200確定是否存在尚未對于表達式的陣列的相互依賴性進行分析的其它表達式。如果計算裝置200確定分析另一表達式,則方法600返回到框602,其中計算裝置200識別并選擇另一表達式用于分析。

回頭參考圖5,在框518,計算裝置200對所識別的代碼區(qū)域執(zhí)行雙向數(shù)據(jù)流分析,以便發(fā)現(xiàn)代碼區(qū)域中的可重新排序陣列。如下所描述的,應(yīng)該認(rèn)識到,計算裝置200可利用前向和后向傳播函數(shù)、前向和后向傳送函數(shù)和/或其它函數(shù),以便例如基于所提供的要重新排序的第一陣列(far)來發(fā)現(xiàn)可重新排序陣列。例如,可根據(jù)定義前向相互依賴的陣列傳播函數(shù),非空,其中是前向傳播函數(shù),b是表達式,x是要通過的輸入陣列的集合,c是集群,并且c.rhs是集群的右手側(cè)(即,指示由對應(yīng)表達式使用的陣列)。此外,可根據(jù)定義后向相互依賴的陣列傳播函數(shù),非空,其中是后向傳播函數(shù),并且c.lhs是集群的左手側(cè)(即,指示由對應(yīng)表達式定義的陣列)。

例如,基于上面描述的示范表達式,相互依賴的陣列分析得出兩個集群(例如基于兩個子樹702):第一集群和第二集群,其中|將定義的陣列/變量(即在左手側(cè)的)與使用的陣列/變量(即在右手側(cè)的)分開。

作為示例,在此類實施例中,應(yīng)該認(rèn)識到,,因為v1不包含在第一集群或第二集群的右手側(cè),,因為v2在第一集群的右手側(cè),,因為v2在第一集群的右手側(cè)并且u不在集群的右手側(cè)不影響結(jié)果,,因為v2在第一集群右手側(cè)并且v4在第二集群的右手側(cè),,因為v1在第一集群的左手側(cè),并且,因為v1在第一集群的左手側(cè)并且v4不在集群的左手側(cè)不影響結(jié)果。

在說明性實施例中,可根據(jù)定義前向傳送函數(shù),其中是前向傳播函數(shù),b是表達式,x是要通過的可重新排序陣列的集合,是在語句b中定義的陣列的集合,并且是在語句b中使用的陣列的集合。應(yīng)該認(rèn)識到,前向傳送函數(shù)指示從語句b前面到它后面按次序通過語句的右手側(cè)和左手側(cè)。應(yīng)該進一步認(rèn)識到,有兩種情況可在通過具有前向傳送函數(shù)的語句b傳播期間發(fā)生,對于其可發(fā)生進一步“生長”:滿足第一項的陣列和滿足第二項的陣列。像這樣,如果x中的輸入陣列由語句b使用,則可重新排序陣列的新集合包含具有集群右手側(cè)的陣列的所有集群。應(yīng)該認(rèn)識到,第一語句反映表達式右手側(cè)的重新排序的陣列可使同一集群中的每個其它陣列的重新排序成為必要。另外,如果表達式b既不使用也不定義輸入陣列,則該陣列也被包含在重新排序的陣列的新集合中。換言之,如果重新排序的輸入陣列被通過,并且既不影響表達式b的任何陣列影響也不受其影響,則重新排序的輸入陣列應(yīng)該在表達式之后保持重新排序。

可根據(jù)定義后向傳送函數(shù),其中是前向傳播函數(shù),是后向傳播函數(shù),b是表達式,x是要通過的可重新排序陣列的集合,是在語句b中定義的陣列的集合,是在語句b中使用的陣列的集合,并且.rhs定義集群的右手側(cè)。應(yīng)該認(rèn)識到,后向傳送函數(shù)指示從語句b后面到它前面按次序通過語句的左手側(cè)和右手側(cè)。此外,應(yīng)該進一步認(rèn)識到,有三種情況可在通過具有后向傳送函數(shù)的語句b傳播期間發(fā)生,對于其可發(fā)生進一步“生長”:滿足第一項的陣列、滿足第二項的陣列或滿足第三項的陣列。

在一些實施例中,計算裝置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ù)初始化,其中是輸入集,并且是輸出集,并且代碼區(qū)域內(nèi)部的所有語句都可被初始化,使得如果b是條目,則,并且否則等于全集。

在框804,計算裝置200預(yù)先調(diào)節(jié)代碼區(qū)域中語句的輸入和輸出集。為了這么做,在框806,計算裝置200可向語句應(yīng)用前向傳送函數(shù)。像這樣,應(yīng)該認(rèn)識到,對于每個語句b,輸入集都包含在其每個前任(predecessor)后面可重新排序的陣列,并且輸出集是基于前向傳送函數(shù)通過語句b傳播的結(jié)果,其可被重復(fù),直到輸入集和輸出集沒有改變。更正式地說,在一些實施例中,可根據(jù)預(yù)先調(diào)節(jié)代碼區(qū)域中(對于其b不是代碼區(qū)域的條目)的所有語句b,其中pred()是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ù)可通過添加陣列(在其每個后繼前面可重新排序)來擴大,和/或可通過添加基于具體后向傳送函數(shù)通過b傳播的結(jié)果的陣列來擴大。在采用活性優(yōu)化的實施例中,如果在后繼之前變量是“死”(即,在通過后繼的任何執(zhí)行路徑中都不使用),則它可在后繼前面人工重新排序,因為這么做不影響程序語義(例如,該陣列在那點無論如何都不使用)。在采用執(zhí)行頻率優(yōu)化的實施例中,如果語句b具有多于一個后繼塊,并且執(zhí)行頻率顯著不同(例如基于預(yù)先確定的閾值),則最頻繁的后繼x可以總是允許中的可重新排序陣列被傳播到。例如,如果具體后繼x在循環(huán)內(nèi),并且所有其它的都在循環(huán)外,則該后繼x的傳播可避免在語句b與x之間插入陣列的重新排序;當(dāng)然,在一些實施例中,可能有必要在b與后繼而不是x之間插入那些陣列中的一個或多個的反向重新排序函數(shù)。更正式地說,在一些實施例中,對于區(qū)域中的所有語句b,應(yīng)用后向傳送函數(shù)可根據(jù):如果采用活性優(yōu)化,則根據(jù)中的一個,如果采用執(zhí)行頻率優(yōu)化,則根據(jù),或者如果不采用優(yōu)化,則根據(jù),其中是語句b的所有后繼的集合,,,其中,并且在b的所有后繼之間最頻繁執(zhí)行,是在后繼s前面是死的但在其它后繼前面不是死的(即,它們在所有后繼之間是“部分死的”)的變量/陣列的集合,并且是在后繼s前面是活的的變量/陣列的集合。

在框814,計算裝置200向代碼區(qū)域中的語句應(yīng)用前向傳送函數(shù)。應(yīng)該認(rèn)識到,對于前向傳送函數(shù)的應(yīng)用類似于上面相對于預(yù)先調(diào)節(jié)所描述的;然而,保持它們的原始值,并且隨著新陣列“生長”。更正式地說,在一些實施例中,對于代碼區(qū)域中的所有語句b都可根據(jù)應(yīng)用前向傳送函數(shù)。在框818,計算裝置200確定無論輸入和輸出集都不改變。如果否,則方法800返回到框810,其中再次向語句應(yīng)用后向傳送函數(shù)。換言之,迭代地應(yīng)用后向和前向傳送函數(shù),直到輸入和輸出集不改變并且穩(wěn)定。

回頭參考圖5,在框520,計算裝置200基于所發(fā)現(xiàn)的可重新排序陣列變換程序代碼。具體地說,計算裝置200配置成重新排序和/或反向重新排序代碼區(qū)域中和/或程序代碼中的代碼區(qū)域周邊(例如緊接在代碼區(qū)域之前或之后)內(nèi)的一個或多個陣列。如上面所指示的,計算裝置200可利用任何適合的技術(shù)來實現(xiàn)程序代碼本身的變換。在一些實施例中,對于代碼區(qū)域中的任何語句b1,如果存在從語句b1到隨后語句b2的邊緣(例如在控制流圖(cfg)中),其中b2例如是cfg中的另一塊,則對于每個變量/陣列,如果但是,則程序代碼“x=reorder(x)”可被插入在那個邊緣,并且如果但是,則程序代碼“x=reverse_reorder(x)”可被插入在那個邊緣。在語句b2是代碼區(qū)域的條目的實施例中,對于每個變量/陣列,如果,則程序代碼“x=reorder(x)”可被插入在b2前面。

應(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描繪了來自向僅包含兩個語句/塊:的簡單代碼區(qū)域應(yīng)用雙向分析的結(jié)果。如所示的,在初始化階段期間,b1的輸出集被指配了要發(fā)現(xiàn)的第一陣列(far),其在此具體實施例中是(例如由用戶選擇的),并且b2的輸出集被指配了全集。在預(yù)先調(diào)節(jié)期間,計算裝置200如上所述應(yīng)用前向傳送函數(shù)的前向傳遞902,這導(dǎo)致b2被指配了的輸出集。如所示的,語句b2的輸入集與語句b1的輸出集相同,因為在b1與b2之間沒有改變該集合的語句。計算裝置200隨后應(yīng)用后向傳送函數(shù)的后向傳遞904,這導(dǎo)致b2具有的輸入集,并且b1具有的輸出集和的輸入集。如所示的,在此類實施例中,計算裝置200迭代地應(yīng)用后向傳送函數(shù)和前向傳送函數(shù),直到語句b1和b2中的每個的輸入和輸出集都不改變。

現(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中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定語句,其中是所述表達式;其中r是所述表達式上的重新排序;并且其中是輸入的集合。

示例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中任一示例的主題,并且其中確定所述表達式的所述分布性包括確定語句,其中是所述表達式;其中r是所述表達式上的重新排序;并且其中是輸入的集合。

示例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中任一示例的主題,并且其中用于確定表達式的分布性的部件包括用于確定語句的部件,其中是所述表達式;其中r是所述表達式上的重新排序;并且其中是輸入的集合。

示例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ū)域中的每個變量的活性的部件。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1