欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

程序轉(zhuǎn)換裝置及程序轉(zhuǎn)換方法

文檔序號(hào):6655120閱讀:249來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):程序轉(zhuǎn)換裝置及程序轉(zhuǎn)換方法
技術(shù)領(lǐng)域
本發(fā)明涉及程序轉(zhuǎn)換裝置,尤其是涉及具備指令系統(tǒng)(instruction set)的面向處理器的程序轉(zhuǎn)換裝置,其中該指令系統(tǒng)包含在運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令。
背景技術(shù)
近幾年來(lái),處理器的處理速度急劇提高,然而與其相比,主存儲(chǔ)器的存取速度的提高幅度很小,兩者的速度差逐年增大。為此,在信息處理裝置的高速處理中,存儲(chǔ)器存取成為瓶頸的問(wèn)題早已被指出。
為了解決這個(gè)問(wèn)題,根據(jù)存儲(chǔ)分層的考慮方法,使用了高速緩存機(jī)構(gòu)。在高速緩存機(jī)構(gòu)中,把處理器中必須的數(shù)據(jù)從主存儲(chǔ)器事先傳輸(預(yù)取)到高速的高速緩存中。由此,可以高速應(yīng)對(duì)來(lái)自處理器的存儲(chǔ)器存取。
然而,處理器存取高速緩存上并不存在的數(shù)據(jù)時(shí),就會(huì)產(chǎn)生高速緩存失誤。由此,產(chǎn)生了從主存儲(chǔ)器向高速緩存?zhèn)鬏敂?shù)據(jù)耗費(fèi)時(shí)間的問(wèn)題。
用戶(hù)意識(shí)不到高速緩存進(jìn)行編程,如果運(yùn)行這個(gè)程序,可以設(shè)想到會(huì)頻繁產(chǎn)生這種高速緩存失誤。結(jié)果,高速緩存失誤引起的損失很大程度地惡化了處理器的性能。為此,編譯器有必要進(jìn)行考慮了高速緩存的最佳化。
作為高速緩存最佳化技術(shù)之一,可以例舉預(yù)取指令的插入被提出來(lái)。預(yù)取指令指的是,在參照某存儲(chǔ)器地址之前,把這個(gè)地址的數(shù)據(jù),提前從主存儲(chǔ)器傳輸?shù)礁咚倬彺嫔?。在預(yù)取指令的插入的最佳化中,在開(kāi)始參照該存儲(chǔ)器地址的稍微提前一點(diǎn)的周期里,插入預(yù)取指令。
例如,對(duì)于如圖1(a)所示的循環(huán)處理,如圖1(b)所示,考慮數(shù)據(jù)被參照之前的等待(latency)時(shí)間,把預(yù)取指令(dpref())插入循環(huán)內(nèi),以便預(yù)取在多個(gè)迭代前被參照的數(shù)據(jù)。另外,在這里設(shè)int型的數(shù)組a的要素是4字節(jié),高速緩存的行大小(line size)為128字節(jié)。
但是,圖1(b)所示的代碼中,對(duì)于1個(gè)迭代分別進(jìn)行了數(shù)組a的參照和預(yù)取,參照只能以每4字節(jié)進(jìn)行,與此相對(duì),預(yù)取則以1行(128字節(jié))單位進(jìn)行。
因此,1次的預(yù)取可以對(duì)應(yīng)32次的參照,剩余31次成了進(jìn)行無(wú)用的預(yù)取的狀態(tài)。也就是說(shuō),連續(xù)發(fā)出了相同行的預(yù)取指令。
而且,通過(guò)處理器,在dpref指令的數(shù)據(jù)傳輸中,如果要運(yùn)行下一個(gè)dpref指令,盡管按照前面的dpref指令的主存儲(chǔ)器向高速緩存的數(shù)據(jù)傳輸沒(méi)有結(jié)束,也會(huì)發(fā)出下一個(gè)dpref指令,盡管本來(lái)是為了消除互鎖插入了dpref指令,還是會(huì)引起互鎖。
因此,如上所述,如果循環(huán)的1個(gè)迭代短,2個(gè)dpref指令的間隔短,則按照dpref指令的主存儲(chǔ)器到高速緩存的數(shù)據(jù)傳輸所消耗的時(shí)間(等待時(shí)間)變得顯著,反而惡化了性能。
而且,即使是在dpref指令的運(yùn)行狀態(tài)以外,如存儲(chǔ)器存取指令等,即使是指令發(fā)出后發(fā)生任何的應(yīng)答等待的指令的情況,也可能引起互鎖。

發(fā)明內(nèi)容
本發(fā)明,正是為了解決上述課題而做出的,其目的在于,提供一種不再無(wú)用地發(fā)出有可能引起互鎖的指令,可以提高程序運(yùn)行時(shí)處理速度的程序轉(zhuǎn)換裝置及程序轉(zhuǎn)換方法。
而且,本發(fā)明的目的在于,提供一種程序轉(zhuǎn)換裝置及程序轉(zhuǎn)換方法,,不再無(wú)用得發(fā)出在指令發(fā)出后發(fā)生某種應(yīng)答等待的指令,可以提高程序運(yùn)行時(shí)處理速度。
而且,本發(fā)明的目的是提供一種程序運(yùn)行時(shí)不會(huì)引起互鎖的程序轉(zhuǎn)換裝置及程序轉(zhuǎn)換方法。
為了達(dá)到上述目的,本發(fā)明涉及的程序轉(zhuǎn)換裝置,是一種面向處理器的程序轉(zhuǎn)換裝置,該處理器具備包含運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令的指令系統(tǒng),其特征在于,具備進(jìn)行雙重循環(huán)的循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,其中雙重循環(huán)轉(zhuǎn)換是把包含于輸入程序中的反復(fù)次數(shù)是x次的循環(huán)轉(zhuǎn)換為反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán),反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu);指令配置裝置,在上述內(nèi)循環(huán)的外部位置配置上述指令,由此轉(zhuǎn)換為包含該指令的輸出程序。
由此,例如如圖2所示,把圖1(a)所示的循環(huán)處理雙重循環(huán)化,并且可以在最內(nèi)循環(huán)的外側(cè)插入預(yù)取指令。由此,消除了沒(méi)用的預(yù)取運(yùn)行。由此提高了處理速度。而且,從一個(gè)dpref指令運(yùn)行后到下一個(gè)dpref指令運(yùn)行之前的期間,可以隱蔽從主存儲(chǔ)器到高速緩存?zhèn)鬏敂?shù)據(jù)耗費(fèi)的等待時(shí)間,難以發(fā)生互鎖。
也就是說(shuō),依據(jù)本發(fā)明,由于循環(huán)的雙重化,如果在內(nèi)循環(huán)的外側(cè)運(yùn)行有可能引起互鎖的指令,可以不用多余發(fā)出相應(yīng)指令就可以提高程序運(yùn)行時(shí)的處理速度。
而且,由于循環(huán)的雙重化,可以保證發(fā)出有可能引起互鎖的指令之后到下一個(gè)有可能引起互鎖的指令為止的期間的周期數(shù)。為此,程序運(yùn)行時(shí)很難引起互鎖。
另外,程序轉(zhuǎn)換裝置,可以作為編譯器、OS(Operating System)或者CPU等的集成電路來(lái)實(shí)現(xiàn)。
應(yīng)答等待指令包括如上述的dpref指令那樣可能引起互鎖的指令和指令運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令,另外還有等待應(yīng)答的情況和不等待應(yīng)答情況的指令。
而且,本發(fā)明,不僅能作為具備這種特征裝置的程序轉(zhuǎn)換裝置來(lái)實(shí)現(xiàn),還可以由把程序轉(zhuǎn)換裝置所具備的特征裝置作為步驟的程序轉(zhuǎn)換方法來(lái)實(shí)現(xiàn),作為程序轉(zhuǎn)換裝置也可以由賦予計(jì)算機(jī)功能的程序來(lái)實(shí)現(xiàn)。而且,這種程序,可以通過(guò)CD-ROM(Compact Disc-Read OnlyMemory光盤(pán)只讀存儲(chǔ)器)等記錄媒介和因特網(wǎng)等傳輸媒介流通是不言而喻的。
發(fā)明效果依據(jù)本發(fā)明,可以提高程序運(yùn)行時(shí)的處理速度。
而且,程序運(yùn)行時(shí)不易引起互鎖問(wèn)題。


圖1是說(shuō)明過(guò)去最佳化技術(shù)的問(wèn)題點(diǎn)的圖;圖2是說(shuō)明依據(jù)本發(fā)明的循環(huán)處理的結(jié)構(gòu)轉(zhuǎn)換的圖;圖3是表示有關(guān)本實(shí)施例的編譯器系統(tǒng)組成的圖;圖4是表示編譯器組成的圖;圖5是編譯器所運(yùn)行的處理的流程圖;圖6是說(shuō)明循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理的具體內(nèi)容的圖;圖7是表示復(fù)制型內(nèi)循環(huán)分割處理的具體內(nèi)容的流程圖;圖8是表示條件型內(nèi)循環(huán)分割處理的具體內(nèi)容的流程圖;圖9是表示預(yù)取指令配置處理的具體內(nèi)容的流程圖;圖10是表示預(yù)取指令插入處理的具體內(nèi)容的流程圖;圖11是說(shuō)明不需要?jiǎng)冸x時(shí)的單循環(huán)分割處理的圖;圖12是表示不需要?jiǎng)冸x時(shí)的源程序的一個(gè)例圖;圖13是表示對(duì)應(yīng)圖12所示的源程序的中間語(yǔ)言程序的圖;圖14表示的是把圖13所示的中間語(yǔ)言的程序結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)之后的中間語(yǔ)言程序的圖;圖15表示的是對(duì)圖14所示的中間語(yǔ)言程序插入預(yù)取指令之后的中間語(yǔ)言程序的圖;圖16是用來(lái)說(shuō)明需要?jiǎng)冸x時(shí)的單循環(huán)分割處理的圖;圖17是用來(lái)說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取時(shí)的循環(huán)分割處理的圖;圖18是用來(lái)說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取時(shí)的循環(huán)分割處理的圖;圖19是用來(lái)說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取,且數(shù)組要素的大小全部不同時(shí)的循環(huán)分割處理的圖;圖20是用來(lái)說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取,且數(shù)組要素的大小全部不同時(shí)的循環(huán)分割處理的圖;圖21是說(shuō)明循環(huán)內(nèi)存在跨距不同的多個(gè)數(shù)組存取時(shí)的循環(huán)分割處理的圖;圖22是說(shuō)明循環(huán)次數(shù)不確定的循環(huán)處理的循環(huán)分割處理的圖;圖23是說(shuō)明循環(huán)次數(shù)不確定的循環(huán)處理的循環(huán)分割處理的圖;圖24是說(shuō)明不需要循環(huán)分割的最佳化處理的圖;圖25是說(shuō)明在循環(huán)內(nèi)存取的要素在主存儲(chǔ)器上沒(méi)有適當(dāng)排序(align)時(shí)的循環(huán)分割處理的圖;圖26是說(shuō)明在循環(huán)內(nèi)存取的要素在主存儲(chǔ)器上沒(méi)有適當(dāng)排序時(shí)的循環(huán)分割處理的圖;圖27是說(shuō)明動(dòng)態(tài)確定沒(méi)有排序的數(shù)組要素,且對(duì)循環(huán)處理進(jìn)行最佳化處理的圖;圖28是說(shuō)明沒(méi)有排序的數(shù)組要素的圖;圖29是說(shuō)明使用剖面信息確定沒(méi)有排序的數(shù)組要素,且對(duì)循環(huán)處理進(jìn)行最佳化處理的圖;圖30是說(shuō)明對(duì)最內(nèi)循環(huán)以外的循環(huán)進(jìn)行結(jié)構(gòu)轉(zhuǎn)換的圖;
圖31是說(shuō)明由編譯指示(pragma)#pragma_loop_tiling_dpref變量名[,變量名]確定變量情況下的最佳化處理的圖;圖32是說(shuō)明插入PreTouch指令時(shí)不需要?jiǎng)冸x情況下的單循環(huán)分割處理的圖;圖33是說(shuō)明插入PreTouch指令時(shí)需要?jiǎng)冸x情況下的單循環(huán)分割處理的圖;圖34是說(shuō)明動(dòng)態(tài)確定沒(méi)有排序的數(shù)組要素,且對(duì)循環(huán)處理進(jìn)行最佳化處理的圖。
標(biāo)號(hào)說(shuō)明141源程序142高速緩存參數(shù)143匯編文件144目標(biāo)文件145運(yùn)行程序146運(yùn)行登錄數(shù)據(jù)147剖面(profile)數(shù)據(jù)148編譯系統(tǒng)149編譯器150匯編程序151連接程序
152模擬器153剖析工具181最佳化輔助信息182語(yǔ)法解析部183最佳化信息解析部184普通最佳化部185指令編排部186循環(huán)結(jié)構(gòu)轉(zhuǎn)換部187指令最佳配置部188代碼輸出部實(shí)施發(fā)明的最佳實(shí)施例系統(tǒng)組成圖3是表示有關(guān)本實(shí)施例的編譯系統(tǒng)組成的圖。編譯系統(tǒng)148是把以C語(yǔ)言等高級(jí)語(yǔ)言記述的源程序141轉(zhuǎn)換為機(jī)器語(yǔ)言的運(yùn)行程序145的軟件系統(tǒng),包括編譯器149、匯編程序150和連接程序151。
編譯器149,把具備高速緩存的計(jì)算機(jī)的CPU(CentralProcessing Unit)作為目標(biāo)處理器,是把源程序141轉(zhuǎn)換為以匯編語(yǔ)言記述的匯編程序143的程序。編譯器149,在把源程序141轉(zhuǎn)換為匯編程序文件143之際,根據(jù)與高速緩存的行大小和等待周期等信息有關(guān)的高速緩存參數(shù)142和下述的剖面數(shù)據(jù)147,進(jìn)行最佳化處理,并輸出匯編程序文件143。
匯編程序150是把以匯編語(yǔ)言記述的匯編程序文件143轉(zhuǎn)換為以機(jī)器語(yǔ)言記述的目標(biāo)文件144的程序。連接程序151是結(jié)合多個(gè)目標(biāo)文件144,并生成運(yùn)行程序145的程序。
作為運(yùn)行程序145的開(kāi)發(fā)工具,準(zhǔn)備了模擬器152及剖析工具153。模擬器152是模擬運(yùn)行程序145,輸出運(yùn)行時(shí)的各種運(yùn)行登錄數(shù)據(jù)146的程序。剖析工具153,是解析運(yùn)行登錄數(shù)據(jù)146,輸出解析了程序的運(yùn)行順序等的剖面數(shù)據(jù)147的程序。
編譯器組成圖4是表示編譯器組成的圖。編譯器149包括語(yǔ)法解析部182、最佳化信息解析部183、普通最佳化部184、指令編排部185、循環(huán)結(jié)構(gòu)轉(zhuǎn)換部186、指令最佳配置部187、代碼輸出部188。各組成處理部作為程序來(lái)實(shí)現(xiàn)。
語(yǔ)法解析部182是把源程序141作為輸入接收,并在進(jìn)行語(yǔ)法解析處理之后輸出中間語(yǔ)言程序的處理部。
最佳化信息解析部183是讀入高速緩存參數(shù)142、剖面數(shù)據(jù)147、編譯程序選項(xiàng)及編譯指示(pragma)等中間語(yǔ)言的最佳化處理必須的信息,并進(jìn)行解析的處理部。普通最佳化部184,是對(duì)中間代碼實(shí)施普通的最佳化處理的處理部。指令編排部185是使指令排列最佳化、進(jìn)行指令編排的處理部。編譯程序選項(xiàng)及編譯指示(pragma)都是針對(duì)編譯器的指示。
循環(huán)結(jié)構(gòu)轉(zhuǎn)換部186,是把單層循環(huán)轉(zhuǎn)換為雙重循環(huán)的處理部。指令最佳配置部187,是在轉(zhuǎn)換的雙重循環(huán)內(nèi)配置預(yù)取指令的處理部。代碼輸出部188,是把最佳化后的中間語(yǔ)言規(guī)格的程序轉(zhuǎn)換為以匯編語(yǔ)言記述的程序并輸出匯編程序文件143的處理部。
處理流程下面,說(shuō)明編譯器149所運(yùn)行的處理的流程。圖5是編譯器149所運(yùn)行的處理的流程圖。
語(yǔ)法解析部182,進(jìn)行源程序141的語(yǔ)法解析,生成中間代碼(S1)。最佳化信息解析部183,解析高速緩存參數(shù)142、剖面數(shù)據(jù)147、編譯程序選項(xiàng)及編譯指示等(S2)。普通最佳化部184,根據(jù)最佳化解析部183中的解析結(jié)果,進(jìn)行普通的中間代碼的最佳化(S3)。指令編排部185,進(jìn)行指令的編排(S4)。循環(huán)結(jié)構(gòu)轉(zhuǎn)換部186,著眼于包含在中間代碼的循環(huán)結(jié)構(gòu),如果需要就把單層循環(huán)轉(zhuǎn)換為雙重循環(huán)結(jié)構(gòu)(S5)。指令最佳配置部187,把預(yù)取循環(huán)結(jié)構(gòu)內(nèi)被參照的數(shù)據(jù)的指令插入中間代碼(S6)。代碼輸出部188,把中間代碼轉(zhuǎn)換為匯編代碼,作為匯編程序文件143進(jìn)行輸出(S7)。
語(yǔ)法解析處理(S1)、最佳化信息解析處理(S2)、普通的最佳化處理(S3)、指令編排處理(S4)及匯編代碼輸出處理(S7)和普通的處理一樣,因此其詳細(xì)說(shuō)明在這里不再重復(fù)。
下面,對(duì)循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)及預(yù)取指令配置處理(S6)進(jìn)行詳細(xì)說(shuō)明。
圖6是用來(lái)說(shuō)明循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(圖5的S6)的具體內(nèi)容的圖。循環(huán)結(jié)構(gòu)轉(zhuǎn)換部186,判斷循環(huán)次數(shù)是被立即給予而可以算出,或者是以其它變量給予且不能算出(S11)。也就是說(shuō)判斷循環(huán)次數(shù)是固定的還是不確定的。
如果是循環(huán)次數(shù)不確定的情況(在S11中是NO),依據(jù)編譯指示或者編譯程序選項(xiàng)判斷有無(wú)最低循環(huán)次數(shù)的指定,或者程序運(yùn)行時(shí)動(dòng)態(tài)判定循環(huán)次數(shù),來(lái)判斷有無(wú)分割循環(huán)的指定(S12)。
如果有任何一種指定(S12中是YES),或者循環(huán)次數(shù)是固定值的情況(S11中是YES),調(diào)查循環(huán)內(nèi)所參照的數(shù)組的下標(biāo)是否可以解析(S13)。也就是說(shuō),如果循環(huán)計(jì)數(shù)是具有某種規(guī)律而在變化的情況,就判斷為可以解析。例如,如果循環(huán)計(jì)數(shù)的值在迭代內(nèi)可以置換,則判斷為不可以解析。
下標(biāo)如果是可以解析的情況(S13中是YES),對(duì)在循環(huán)處理內(nèi)被參照的各數(shù)組求出在1個(gè)迭代中參照的要素字節(jié)數(shù),導(dǎo)出其中最小的值LB(S14)。
然后,判斷高速緩存的行大小CS除以值LB的值是否大于1(S15)。如果CS/LB的值比1大時(shí)(S15中是YES),調(diào)查循環(huán)處理的數(shù)組是否被排序(align)(S16)。數(shù)組是否被排序的判斷,根據(jù)是否有依據(jù)編譯指示或編譯程序選項(xiàng)等被排序這樣的指示來(lái)進(jìn)行判斷。
數(shù)組沒(méi)有被排序時(shí)(S17中是NO),進(jìn)行LB*LC/IC是否比CS大的判斷(S16)。這里,LC表示等待時(shí)間的周期數(shù),IC表示每1個(gè)迭代的周期數(shù)。LC/IC,表示循環(huán)分割為多個(gè)最內(nèi)循環(huán)情況下的各循環(huán)的循環(huán)次數(shù),LB*LC/IC表示各循環(huán)中的存取容量。
如果LB*LC/IC大于行大小CS時(shí)(S16中是YES),在分割后的各循環(huán)處理中參照1個(gè)行大小以上的要素。為此,以分割因子為周期,根據(jù)式(1)導(dǎo)出把各循環(huán)處理進(jìn)行雙重循環(huán)時(shí)的最內(nèi)循環(huán)的循環(huán)次數(shù)DT(S18)。
DT=(LC-1)/IC+1…(1)如果LB*LC/IC是行大小CS之下的情況(S16中是NO)或者數(shù)組被排序的情況(S17中是YES),以分割因子為大小,根據(jù)式(2)導(dǎo)出把各循環(huán)處理進(jìn)行雙重循環(huán)時(shí)的最內(nèi)循環(huán)的循環(huán)次數(shù)DT(S19)。
DT=(CS-1)/LB+1…(2)在導(dǎo)出最內(nèi)循環(huán)的循環(huán)次數(shù)DT的處理之后(S18或者S19),判斷最內(nèi)循環(huán)的循環(huán)次數(shù)DT是否比1大(S20)。DT如果是1(S20中是NO)的情況,由于最內(nèi)循環(huán)的循環(huán)次數(shù)DT是1次,因此沒(méi)有必要把循環(huán)轉(zhuǎn)換為雙重循環(huán)。為此,結(jié)束循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)。
如果最內(nèi)循環(huán)的循環(huán)次數(shù)DT是2以上的情況(S20中是YES),就做成循環(huán)結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)時(shí)的外循環(huán)結(jié)構(gòu)(S21)。生成外循環(huán)結(jié)構(gòu)時(shí),判斷是否需要?jiǎng)冸x處理(S22)。下面敘述剝離處理及是否需要?jiǎng)冸x處理的判斷方法。
如果是需要?jiǎng)冸x處理的情況(S22中是NO),就進(jìn)行剝離處理,生成剝離代碼(S24)。之后,調(diào)查是否有依據(jù)編譯程序選項(xiàng)-O或者-Os的指定(S25)。這里,編譯程序選項(xiàng)-O,是為把程序大小及運(yùn)行處理速度同平均的匯編代碼輸出給編譯器的指示。編譯程序選項(xiàng)-Os,是為把重視抑制程序大小的匯編代碼輸出給編譯器的指示。
不需要?jiǎng)冸x處理(S22中是YES)或者沒(méi)有編譯程序選項(xiàng)-O或者-Os的指定的情況(S25中是NO),生成內(nèi)循環(huán)(最內(nèi)循環(huán))的循環(huán)次數(shù)的條件式(S23)。
有編譯程序選項(xiàng)-O或者-Os的指定的情況(S25中是YES),把剝離的循環(huán)處理疊入雙重循環(huán),生成最內(nèi)循環(huán)的循環(huán)次數(shù)的條件式(S26)。
在最內(nèi)循環(huán)的循環(huán)次數(shù)條件生成處理(S23、S26)之后,調(diào)查最內(nèi)循環(huán)中所參照的對(duì)象數(shù)組是否是1個(gè)(S27)。如果最內(nèi)循環(huán)中所參照的對(duì)象數(shù)組是1個(gè)的情況(S27中是YES),結(jié)束循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)。
如果最內(nèi)循環(huán)中所參照的對(duì)象數(shù)組具有2個(gè)以上時(shí)(S27是NO),導(dǎo)出最內(nèi)循環(huán)的分割個(gè)數(shù),決定分割后的各最內(nèi)循環(huán)的循環(huán)次數(shù)的比率(S28)。之后,判斷分割后的最內(nèi)循環(huán)次數(shù)DT除以分割個(gè)數(shù)的值是否比1大(S29)。也就是說(shuō),該值在1以下時(shí)(S29中是NO),由于分割后的各循環(huán)次數(shù)是1次以下,因此沒(méi)有分割的意義。為此,結(jié)束循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)。
如果該值比1大(S29中是YES),分割后的各循環(huán)次數(shù)是2次以上。這種情況下,調(diào)查是否有依據(jù)編譯程序選項(xiàng)-O或者-Ot的指定(S30)。編譯程序選項(xiàng)-Ot是把重視提高運(yùn)行處理速度的匯編代碼輸出給編譯器的指示。
如果有依據(jù)編譯程序選項(xiàng)-O或者-Os的指定(S30中是YES),運(yùn)行下述的重視運(yùn)行處理速度的復(fù)制型內(nèi)循環(huán)分割處理(S31),結(jié)束循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)。
如果沒(méi)有依據(jù)編譯程序選項(xiàng)-O或者-Os的指定(S30中是NO),運(yùn)行下述的重視抑制程序大小的條件型內(nèi)循環(huán)分割處理(S32),結(jié)束循環(huán)結(jié)構(gòu)轉(zhuǎn)換處理(S5)。
圖7是表示復(fù)制型內(nèi)循環(huán)分割處理(圖6的S31)的具體內(nèi)容的流程圖。
把最內(nèi)循環(huán)的循環(huán)次數(shù)DT除以分割個(gè)數(shù)的值作為細(xì)化分割后的內(nèi)循環(huán)次數(shù)(S41)。然后,只復(fù)制分割個(gè)數(shù)份的內(nèi)循環(huán),并生成內(nèi)循環(huán)(S42)。之后,把細(xì)化分割后的各內(nèi)循環(huán)次數(shù)修正為細(xì)化分割后的內(nèi)循環(huán)次數(shù)(S43)。而且,把DT除以分割個(gè)數(shù)的剩余加在細(xì)化分割后的開(kāi)頭循環(huán)的循環(huán)次數(shù)上(S44),結(jié)束復(fù)制型內(nèi)循環(huán)分割處理。
圖8是表示條件型內(nèi)循環(huán)分割處理(圖6的S32)的具體內(nèi)容的流程圖。
把最內(nèi)循環(huán)的循環(huán)次數(shù)DT除以分割個(gè)數(shù)的值設(shè)為細(xì)化分割后的內(nèi)循環(huán)次數(shù)(S51)。然后,生成內(nèi)循環(huán)次數(shù)條件的切換switch表(S52)。也就是說(shuō),生成用C語(yǔ)言表述的switch語(yǔ)句,以便依次交替內(nèi)循環(huán)次數(shù)。另外,也可以是if語(yǔ)句。
表生成之后,把細(xì)化分割后的各內(nèi)循環(huán)次數(shù)條件修正為細(xì)化分割后的內(nèi)循環(huán)次數(shù)(S53)。之后,把DT除以分割個(gè)數(shù)的剩余加在細(xì)化分割后的開(kāi)頭循環(huán)的次數(shù)條件上(S54),結(jié)束條件型內(nèi)循環(huán)分割處理。
圖9是表示預(yù)取指令配置處理(圖5的S6)的具體內(nèi)容的流程圖。
預(yù)取指令配置處理中,對(duì)于所有的循環(huán)反復(fù)以下處理(循環(huán)A)。首先,調(diào)查所關(guān)注的循環(huán)是否是指令插入對(duì)象的循環(huán)(S61)。有關(guān)是否是指令插入對(duì)象的循環(huán)的信息,根據(jù)循環(huán)結(jié)構(gòu)轉(zhuǎn)換部186的解析結(jié)果取得。
如果是指令插入對(duì)象的循環(huán)(S61中是YES),對(duì)這個(gè)循環(huán)調(diào)查是否進(jìn)行了條件型循環(huán)分割(S62)。如果進(jìn)行了條件型循環(huán)分割,解析各條件語(yǔ)句中的指令插入位置(S63),插入預(yù)取指令(S64)。如果對(duì)指令插入對(duì)象的循環(huán)沒(méi)有進(jìn)行條件型循環(huán)分割(S62中是NO),對(duì)這個(gè)循環(huán)調(diào)查是否進(jìn)行了復(fù)制型循環(huán)分割(S65)。如果進(jìn)行了復(fù)制型循環(huán)分割(S65中是YES),解析這個(gè)循環(huán)的前一個(gè)指令插入位置(S66)。之后,插入預(yù)取指令(S67)。如果是被剝離的循環(huán)的情況(S68中是YES),解析指令插入位置以便在該循環(huán)前面插入指令(S69),在這個(gè)位置插入預(yù)取指令(S70)。
圖10是表示預(yù)取指令插入處理(圖9的S64、S67及S70)的具體內(nèi)容的流程圖。
指令插入處理中,直到插入指令、插入位置、插入地址等組成的信息清單全為空為止反復(fù)以下處理(循環(huán)B)。
判斷要插入預(yù)取指令的數(shù)組要素是否排序完畢(S72)。如果沒(méi)有排序(S72中是NO),調(diào)查是根據(jù)周期因子分割的循環(huán)還是根據(jù)大小因子分割的循環(huán)(S73)。
如果排序完畢(S72中是YES)或者是以周期因子分割的循環(huán)(S73中是YES),對(duì)1行前的數(shù)據(jù)插入預(yù)取指令(S74)。沒(méi)有排序,且是以大小因子分割的循環(huán)(S73中是NO),對(duì)2行前的數(shù)據(jù)插入預(yù)取指令(S75)。最后,從信息清單刪除解析完畢的信息(S76)。
編譯程序選項(xiàng)編譯系統(tǒng)148中,作為針對(duì)編譯器的編譯程序選項(xiàng),準(zhǔn)備了選項(xiàng)-fno-loop-tiling-dpref。如果指定了這個(gè)選項(xiàng),和編譯指示的指定無(wú)關(guān),不進(jìn)行針對(duì)循環(huán)的結(jié)構(gòu)轉(zhuǎn)換。如果沒(méi)有指定本選項(xiàng),結(jié)構(gòu)轉(zhuǎn)換的實(shí)施遵從有無(wú)編譯指示的指定。
編譯指示指定本指定針對(duì)隨后的循環(huán)。
由編譯指示#pragma_loop_tiling_dpref變量名[,變量名]指定了變量時(shí),僅著眼于編譯指示指定的變量進(jìn)行循環(huán)分割。指定的變量可以是數(shù)組也可以是指針。
由編譯指示#pragma_loop_tiling_dpref_all指定了循環(huán)時(shí),著眼于循環(huán)內(nèi)參照的所有數(shù)組進(jìn)行結(jié)構(gòu)轉(zhuǎn)換。
下面,說(shuō)明幾個(gè)具體曲面中的循環(huán)分割處理。另外,在后面的處理中,為了簡(jiǎn)化說(shuō)明,進(jìn)行依據(jù)C語(yǔ)言的程序記述,但實(shí)際上依據(jù)中間語(yǔ)言進(jìn)行最佳化處理。
單循環(huán)分割圖11是用于說(shuō)明不需要?jiǎng)冸x情況下的單循環(huán)分割處理的圖。
考慮輸入了如圖11(a)所示的源程序282的情況。這個(gè)源程序282中,依次參照數(shù)組A的要素,加在變量sum上。這里,數(shù)組A的各要素大小設(shè)為4字節(jié),高速緩存的1個(gè)行大小設(shè)為128字節(jié)(在以后的說(shuō)明中,高速緩存的行大小也設(shè)為128字節(jié))。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素。又,包含于源程序282的循環(huán)的迭代次數(shù)128次,是32的整數(shù)倍。由此,源程序282,如圖11(b)的程序284所示,可以結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。也就是說(shuō),在最內(nèi)循環(huán)中,進(jìn)行32次的反復(fù)處理,在其外的循環(huán)中,進(jìn)行反復(fù)4次最內(nèi)循環(huán)的循環(huán)處理。在最內(nèi)循環(huán)處理中,參照高速緩存1行的數(shù)據(jù)。之后,如圖11(c)的程序286所示,在運(yùn)行最內(nèi)循環(huán)之前,插入預(yù)取指令(dpref(&A[i+32])。通過(guò)插入預(yù)取指令,運(yùn)行最內(nèi)循環(huán)時(shí),形成了該循環(huán)中所參照的數(shù)組A的要素搭乘高速緩存的狀態(tài)。
圖12~圖15,是說(shuō)明有關(guān)不需要?jiǎng)冸x的單循環(huán)分割處理中的中間語(yǔ)言推移的圖。
圖12,和圖11(a)一樣,是表示不需要?jiǎng)冸x時(shí)的一個(gè)源程序的例圖。圖13是對(duì)應(yīng)圖12所示的源程序240的中間語(yǔ)言的程序。BGNBBLKENDBBLK之間的指令列對(duì)應(yīng)1個(gè)基本程序段,始于BGNBBLKB1的基本程序段表示for循環(huán)之前的處理,始于BGNBBLKB2的基本程序段表示for循環(huán),始于BGNBBLKB3的基本程序段表示for循環(huán)后的處理。
圖14表示的是把圖13所示的中間語(yǔ)言的程序結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)之后的中間語(yǔ)言的程序。始于BGNBBLKB2的基本程序段對(duì)應(yīng)最內(nèi)循環(huán),始于BGNBBLKB4及BGNBBLKB5的循環(huán)對(duì)應(yīng)外循環(huán)。
圖15表示的是對(duì)圖14所示的中間語(yǔ)言程序插入預(yù)取指令之后的中間語(yǔ)言的程序。程序270中,在始于BGNBBLKB4的基本程序段的內(nèi)部重新插入了預(yù)取指令(dpref)。
圖16是用來(lái)說(shuō)明需要?jiǎng)冸x時(shí)的單循環(huán)分割處理的圖。
考慮輸入了圖16(a)所示的源程序292的情況。在這個(gè)源程序292中,依次參照數(shù)組A的要素,加在變量sum上。這里,數(shù)組A的各要素大小設(shè)為4字節(jié)。也就是說(shuō),高速緩存的1行上存儲(chǔ)了32個(gè)數(shù)組A的要素。而且,包含于源程序292的循環(huán)迭代次數(shù)設(shè)為140次。也就是說(shuō),是除以1行存儲(chǔ)的數(shù)組A的要素?cái)?shù)32時(shí)所得到的余數(shù)。
這種情況下,如圖16(b)所示的程序294,剝離140除以32的余數(shù)的循環(huán)次數(shù),其它部分和圖11(b)一樣結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)結(jié)構(gòu)。之后,進(jìn)行為了把被剝離的部分包含于雙重循環(huán)結(jié)構(gòu)的剝離疊入處理,可以得到圖16(c)所示的程序296。也就是說(shuō),通常狀態(tài)下,在最內(nèi)循環(huán)進(jìn)行32次的反復(fù)處理,最后運(yùn)行最內(nèi)循環(huán)時(shí),進(jìn)行殘余的12(=140-128)次反復(fù)處理。之后,如圖16(d)的程序298所示,在運(yùn)行最內(nèi)循環(huán)之前,插入預(yù)取指令(dpref(&A[i+32]))。
存在多個(gè)數(shù)組存取的情況(不需要?jiǎng)冸x)圖17是用于說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取的情況下的循環(huán)分割處理的圖。
考慮輸入了如圖17(a)所示的源程序301的情況。這個(gè)源程序301中,依次參照數(shù)組A及數(shù)組B的要素,相應(yīng)要素之間的乘積加在變量sum上。這里,數(shù)組A及數(shù)組B的各要素分別設(shè)為4字節(jié)。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素?;蛘撸鎯?chǔ)32個(gè)數(shù)組B的要素。也就是說(shuō),1行所存儲(chǔ)的要素?cái)?shù),在數(shù)組A和數(shù)組B是一樣的。而且,源程序301所包含的循環(huán)的迭代次數(shù)128次是32的整數(shù)倍。由此,源程序301,如圖17(b)的程序302所示,不需要?jiǎng)冸x就可以結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。
存在多個(gè)數(shù)組存取情況下的雙重循環(huán)結(jié)構(gòu)有兩種,一種是稱(chēng)作復(fù)制型的提高運(yùn)行處理速度的最佳化結(jié)構(gòu),另一種是稱(chēng)作條件型的減小程序大小的最佳化結(jié)構(gòu)。
首先,說(shuō)明復(fù)制型的最佳化結(jié)構(gòu)。用數(shù)組A和數(shù)組B之間的要素大小比分割程序302中包含的最內(nèi)循環(huán)的循環(huán)次數(shù)。這里,數(shù)組A和數(shù)組B要素的大小相同。因此,如圖17(c)所示的程序303,把最內(nèi)循環(huán)分為2等分,分割為2個(gè)循環(huán)次數(shù)是16次的最內(nèi)循環(huán)。其次,如圖17(d)的程序304所示,在各最內(nèi)循環(huán)的前面插入預(yù)取指令。在開(kāi)頭的最內(nèi)循環(huán)前面,插入預(yù)取指令(dpref(&A[i+32]))用來(lái)預(yù)取1行的數(shù)組A的要素,在第2個(gè)最內(nèi)循環(huán)的前面,插入預(yù)取指令(dpref(&B[i+32]))用來(lái)預(yù)取1行的數(shù)組B的要素。
這樣,在預(yù)取指令之間插入循環(huán)處理,由此對(duì)不同數(shù)組的預(yù)取指令不會(huì)連續(xù),可以隱蔽運(yùn)行預(yù)取指令引起的等待時(shí)間。由此,可以提高運(yùn)行處理速度。
下面,說(shuō)明條件型的最佳化結(jié)構(gòu)。條件型的情況也與復(fù)制型的情況一樣,以數(shù)組A和數(shù)組B之間的要素大小比來(lái)分割最內(nèi)循環(huán)的循環(huán)次數(shù)。只是,不是如程序303那樣排列2個(gè)最內(nèi)循環(huán),而是如圖17(e)所示的程序305,最內(nèi)循環(huán)的個(gè)數(shù)是1個(gè),把這個(gè)循環(huán)次數(shù)作為條件分支。也就是說(shuō),以變量K=1的情況和K=0的情況改變最內(nèi)循環(huán)的循環(huán)次數(shù)N。只是,這個(gè)例子中,和變量K的值無(wú)關(guān),最內(nèi)循環(huán)的次數(shù)是16次。然后,如圖17(f)所示的程序306,插入條件分支式及預(yù)取指令以便在K=1的情況下預(yù)取1行的數(shù)組A的要素,K=0的情況下則預(yù)取1行的數(shù)組B的要素。另外,這里由于最佳化,循環(huán)次數(shù)N立即置換為16。
這樣,最內(nèi)循環(huán)的個(gè)數(shù)為1個(gè),由條件分支式改變最內(nèi)循環(huán)的循環(huán)次數(shù)及預(yù)取指令,由此可以減小最終生成的機(jī)器語(yǔ)言指令的程序大小。只是,由于有條件分支處理,和復(fù)制型比起來(lái)處理速度多少會(huì)遲緩一些。
存在多個(gè)數(shù)組存取的情況(需要?jiǎng)冸x)圖18是用于說(shuō)明循環(huán)內(nèi)存在多個(gè)數(shù)組存取的情況下的循環(huán)分割處理的圖。
考慮輸入了圖18(a)所示的源程序311的情況。這個(gè)源程序311中,依次參照數(shù)組A及數(shù)組B,相應(yīng)要素之間的乘積加在變量sum上。這里,設(shè)數(shù)組A及數(shù)組B的各要素分別為4字節(jié)。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素?;蛘叽鎯?chǔ)32個(gè)數(shù)組B的要素。也就是說(shuō),1行所存儲(chǔ)的要素?cái)?shù),在數(shù)組A和數(shù)組B是一樣的。而且,設(shè)源程序311中包含的循環(huán)的迭代次數(shù)是140次。
因此,把源程序311結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)時(shí),和圖16(b)所示的程序294一樣,生成圖18(b)所示的剝離處理了的程序312。
進(jìn)行復(fù)制型的最佳化時(shí),以數(shù)組A和數(shù)組B之間的要素大小比分割最內(nèi)循環(huán)。這樣,生成圖18(c)所示的程序313。然后,如圖18(d)的程序314所示,在開(kāi)頭的最內(nèi)循環(huán)前面,插入預(yù)取指令(dpref(&A[i+32]))用來(lái)預(yù)取1行的數(shù)組A的要素,在第2個(gè)最內(nèi)循環(huán)的前面,插入預(yù)取指令(dpref(&B[i+32]))用來(lái)預(yù)取1行的數(shù)組B的要素。另外,在剝離處理了的最終循環(huán)前面不插入預(yù)取指令。這是因?yàn)椋捎谶\(yùn)行其前面的雙重循環(huán)處理中的預(yù)取指令,所希望的數(shù)據(jù)被高速緩存預(yù)取。
在進(jìn)行條件型的最佳化時(shí),對(duì)程序312進(jìn)行剝離疊入處理,得到圖18(e)所示的程序315。剝離疊入處理和參照?qǐng)D16進(jìn)行說(shuō)明的一樣。然后,以數(shù)組A和數(shù)組B之間的要素大小比分割最內(nèi)循環(huán)的循環(huán)次數(shù),制作圖18(f)所示的程序316以便可以條件分支該循環(huán)次數(shù)。在程序316中,交替變更變量K的值,改變循環(huán)計(jì)數(shù)N的值以便對(duì)應(yīng)變量K的值。然后如圖18(g)的程序317所示,隨著K值的變化,在條件分支式中插入預(yù)取指令以便交互預(yù)取每1行的數(shù)組A及數(shù)組B的要素。
這樣,即使是需要?jiǎng)冸x的情況,在復(fù)制型的情況,把剝離部分設(shè)為區(qū)分于雙重循環(huán)的循環(huán),條件型的情況,由條件分支式改變剝離情況下的循環(huán)計(jì)數(shù)次數(shù),由此即使在循環(huán)內(nèi)有多個(gè)數(shù)組存取,且需要?jiǎng)冸x的情況,也可以進(jìn)行考慮了預(yù)取引起的等待時(shí)間的最佳化。
存在大小不同的多個(gè)數(shù)組存取的情況(不需要?jiǎng)冸x)圖19是說(shuō)明當(dāng)循環(huán)內(nèi)存在多個(gè)數(shù)組存取且數(shù)組要素大小完全不同情況下的循環(huán)分割處理的圖。
考慮輸入圖19(a)所示的源程序321的情況。這里,設(shè)數(shù)組A的要素是4字節(jié),數(shù)組B的要素是2字節(jié)。也就是說(shuō),高速緩存的1行上存儲(chǔ)了32個(gè)數(shù)組A的要素,存儲(chǔ)了64個(gè)數(shù)組B的要素。
這種情況下,關(guān)注要素大小小的數(shù)組B,進(jìn)行對(duì)應(yīng)數(shù)組B的要素的循環(huán)結(jié)構(gòu)轉(zhuǎn)換。也就是說(shuō),如圖19(b)的程序322所示,把最內(nèi)循環(huán)的循環(huán)次數(shù)設(shè)為1行收納的數(shù)組B的要素?cái)?shù)64,結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。在最內(nèi)循環(huán)中,對(duì)于數(shù)組B消耗了1行的要素,對(duì)于數(shù)組A消耗了2行的要素。由此,為了運(yùn)行最內(nèi)循環(huán)處理就需要3行的數(shù)據(jù)。
為此,進(jìn)行復(fù)制型的最佳化之際,如圖19(c)的程序323所示,把最內(nèi)循環(huán)分割為3個(gè),如圖19(d)的程序324所示,在各最內(nèi)循環(huán)前面插入預(yù)取指令。這里,在第1個(gè)最內(nèi)循環(huán)前面,插入預(yù)取2行前的數(shù)組A的要素的預(yù)取指令(dpref(&A[i+64])),在第2個(gè)最內(nèi)循環(huán)前面插入預(yù)取3行前的數(shù)組A的要素的預(yù)取指令(dpref(&A[i+96])),在第3個(gè)最內(nèi)循環(huán)的前面插入預(yù)取1行前的數(shù)組B的要素的預(yù)取指令(dpref(&B[i+64]))。而且,3個(gè)最內(nèi)循環(huán)的循環(huán)次數(shù)按照處理順序分別設(shè)為22、21及21。這是因?yàn)?,最外循環(huán)的條件分支判斷在運(yùn)行第3個(gè)最內(nèi)循環(huán)后進(jìn)行,所以由減少第3個(gè)最內(nèi)循環(huán)的循環(huán)次數(shù),來(lái)提高整體的處理速度。
而且,進(jìn)行條件型的最佳化時(shí),如圖19(e)的程序325所示,1次最內(nèi)循環(huán)處理中,在0到2之間的范圍內(nèi)更新變量K的值,根據(jù)依據(jù)變量K值的條件分支處理,把最內(nèi)循環(huán)的循環(huán)次數(shù)N設(shè)為22、21及21中的任一值。之后,運(yùn)行循環(huán)次數(shù)N的最內(nèi)循環(huán)。然后,如圖19(f)的程序326所示,進(jìn)行最佳化,當(dāng)變量K的值是0時(shí)運(yùn)行預(yù)取指令(dpref(&A[i+64])),當(dāng)變量K的值是1時(shí)運(yùn)行預(yù)取指令(dpref(&A[i+96])),當(dāng)變量K的值是2時(shí)運(yùn)行預(yù)取指令(dpref(&B[i+64]))的。
存在大小不同的多個(gè)數(shù)組存取的情況(需要?jiǎng)冸x)圖20是說(shuō)明當(dāng)循環(huán)內(nèi)存在多個(gè)數(shù)組存取且數(shù)組要素大小完全不同的情況下的循環(huán)分割處理的圖。
如圖20(a)所示的源程序331,和圖19(a)所示的源程序321相比僅僅是循環(huán)次數(shù)不同。因此,和源程序321一樣,數(shù)組A的要素是4字節(jié),數(shù)組B的要素是2字節(jié)。如圖20(b)所示,把源程序321的循環(huán)結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán),對(duì)循環(huán)次數(shù)140除以數(shù)組B的1行的要素?cái)?shù)64的剩余進(jìn)行剝離處理,就可以得到程序322。進(jìn)行復(fù)制型的最佳化處理時(shí),如參照?qǐng)D19(c)及圖19(d)所說(shuō)明的那樣,把雙重循環(huán)的最內(nèi)循環(huán)分割為3個(gè),并插入預(yù)取指令,由此得到圖20(c)所示的程序333。進(jìn)行條件型的最佳化處理時(shí),如參照?qǐng)D19(e)及圖19(f)所說(shuō)明的那樣,由條件分支式控制循環(huán)次數(shù)及預(yù)取指令,最終得到如圖20(e)所示的程序335。
存在跨距不同的多個(gè)數(shù)組存取的情況圖21是說(shuō)明循環(huán)內(nèi)存在跨距不同的多個(gè)數(shù)組存取的情況下的循環(huán)分割處理的圖。
跨距指的是循環(huán)處理中的數(shù)組要素的增量值(存取幅度)??紤]輸入了圖21(a)所示的源程序341的情況。這里,設(shè)數(shù)組A的要素及數(shù)組B的要素都是4字節(jié)。在源程序341中,循環(huán)的每次迭代中,數(shù)組A的要素增加1個(gè),而數(shù)組B的要素增加2個(gè)。也就是說(shuō),數(shù)組B的存取幅度是數(shù)組A的存取幅度的2倍。如果著眼于最小存取幅度的數(shù)組A,1行收納32個(gè)數(shù)組A的要素。由此,如果向最內(nèi)循環(huán)的循環(huán)次數(shù)設(shè)為32次的雙重循環(huán)進(jìn)行結(jié)構(gòu)轉(zhuǎn)換,就可以得到圖21(b)所示的程序342。在最內(nèi)循環(huán)中,數(shù)組A消耗1行的要素,數(shù)組B就消耗2行程度的要素。由此,為了運(yùn)行最內(nèi)循環(huán)處理,就需要合計(jì)3行的數(shù)據(jù)。
因此,進(jìn)行復(fù)制型的最佳化時(shí),如圖21(c)的程序343所示,把最內(nèi)循環(huán)分割為3個(gè),如圖21(d)的程序344所示,在各最內(nèi)循環(huán)前面插入預(yù)取指令。這里,在第1個(gè)最內(nèi)循環(huán)前面,插入預(yù)取1行前的數(shù)組A的要素的預(yù)取指令(dpref(&A[i+32])),在第2個(gè)最內(nèi)循環(huán)前面插入預(yù)取2行前的數(shù)組B的要素的預(yù)取指令(dpref(&B[i*2+64])),在第3個(gè)最內(nèi)循環(huán)的前面插入預(yù)取3行前的數(shù)組B的要素的預(yù)取指令(dpref(&B[i*2+96]))。
又,進(jìn)行條件型的最佳化時(shí),如圖21(e)的程序345所示,1次的最內(nèi)循環(huán)處理中,在0到2之間的范圍內(nèi)更新變量K的值,根據(jù)依據(jù)變量K值的條件分支處理,把最內(nèi)循環(huán)的循環(huán)次數(shù)N設(shè)為11、11及10中的任一值。之后,運(yùn)行循環(huán)次數(shù)N的最內(nèi)循環(huán)。然后,如圖21(f)的程序346所示,進(jìn)行最佳化,當(dāng)變量K的值是0時(shí)運(yùn)行預(yù)取指令(dpref(&A[i+32])),當(dāng)變量K的值是1時(shí)運(yùn)行預(yù)取指令(dpref(&B[i*2+64])),當(dāng)變量K的值是2時(shí)運(yùn)行預(yù)取指令(dpref(&B[i*2+96]))。
循環(huán)次數(shù)不定的情況圖22是說(shuō)明循環(huán)次數(shù)不定的循環(huán)處理的循環(huán)分割處理的圖。
考慮輸入了圖22(a)所示的源程序351的情況。包含于源程序351的循環(huán)次數(shù),由變量Val確定,編譯時(shí)不確定。但是,進(jìn)行最低128次反復(fù)處理通過(guò)編譯指示指定#pragma_min_iteration=128來(lái)保證。這里,設(shè)數(shù)組A為4字節(jié)。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素。
根據(jù)編譯指示指定,把循環(huán)分割為開(kāi)始的128次的循環(huán)處理和其后的由變量Val確定的循環(huán)次數(shù)的循環(huán)處理,和單循環(huán)的情況一樣把他們分別進(jìn)行雙重循環(huán)化,就可以得到圖22(b)所示的程序352。
進(jìn)行復(fù)制型的最佳化處理時(shí),在程序352的最內(nèi)循環(huán)的前面插入預(yù)取指令(dpref(&A[i+32]))用來(lái)預(yù)取1行前的數(shù)組A的要素,由此得到圖22(c)所示的程序353。
進(jìn)行條件型的最佳化處理時(shí),對(duì)后半部分的循環(huán)處理疊入剝離,最外循環(huán)次數(shù)達(dá)到128次之前,最內(nèi)循環(huán)的次數(shù)設(shè)為32次,其后插入最內(nèi)循環(huán)的次數(shù)設(shè)定為(Val-128)次的分支指令。這樣,可以得到圖22(d)所示的程序354。
最后,在運(yùn)行最內(nèi)循環(huán)之前,插入預(yù)取指令(dpref(&A[i+32])),由此得到圖22(e)所示的程序355。
圖23是說(shuō)明循環(huán)次數(shù)不定的循環(huán)處理的循環(huán)分割處理的圖。
考慮輸入了圖23(a)所示的源程序361的情況。包含于源程序361的循環(huán)次數(shù)由變量N確定,在編譯時(shí)不定。而且,源程序361和源程序351不同,沒(méi)有表示最低循環(huán)次數(shù)的編譯指示指定。
對(duì)循環(huán)次數(shù)小的循環(huán)處理進(jìn)行循環(huán)的結(jié)構(gòu)轉(zhuǎn)換,即使進(jìn)行了最佳化也難以顯現(xiàn)最佳化的效果。由此,這種情況下,為了提高最佳化的效果,如果循環(huán)次數(shù)大于某臨界值運(yùn)行被最佳化了的循環(huán)處理,其它的情況運(yùn)行通常的循環(huán)處理。例如,某臨界值設(shè)定為1024的情況,如圖23(b)的程序362所示,循環(huán)次數(shù)N如果超過(guò)了1024時(shí),對(duì)開(kāi)始的1024次的循環(huán)處理運(yùn)行雙重循環(huán),對(duì)于剩余次數(shù)的循環(huán)處理進(jìn)行剝離了的循環(huán)處理。又,循環(huán)次數(shù)N在1024以下時(shí),不運(yùn)行雙重循環(huán),運(yùn)行被剝離的循環(huán)處理。之后,在雙重循環(huán)的最內(nèi)循環(huán)前面插入預(yù)取指令(dpref(&A[i+32])),由此生成如圖23(c)所示的最佳化的程序363。
不需要循環(huán)分割的情況圖24是說(shuō)明不需要循環(huán)分割情況下的最佳化處理的圖。如果輸入了圖24(a)所示的源程序371時(shí),在循環(huán)中完全用完1行的數(shù)據(jù)(A[i]~A[i+31])。這種情況下,沒(méi)有必要進(jìn)行雙重循環(huán)化。為此,如圖24(b)所示的程序372,在循環(huán)的開(kāi)頭插入預(yù)取指令(dpref(&A[i+32]))用來(lái)預(yù)取循環(huán)內(nèi)使用的數(shù)據(jù)的1行前的數(shù)據(jù),由此進(jìn)行最佳化。
而且,循環(huán)內(nèi)的處理周期數(shù)比預(yù)取指令中需要的處理周期數(shù)還要大時(shí),沒(méi)有必要對(duì)循環(huán)進(jìn)行雙重化,即使在循環(huán)的開(kāi)頭插入預(yù)取指令也可以隱蔽預(yù)取指令的等待時(shí)間。
循環(huán)內(nèi)存取的要素不排序的情況圖25及圖26是說(shuō)明循環(huán)內(nèi)存取的要素在主存儲(chǔ)器上沒(méi)有適當(dāng)排序情況下的循環(huán)分割處理的圖。到此為止的說(shuō)明中,都是在假設(shè)循環(huán)內(nèi)存取的要素在主存儲(chǔ)器上適當(dāng)排序的情況下進(jìn)行的。排序的情況事先被編譯指示和編譯程序選項(xiàng)的指定所明確時(shí),進(jìn)行如上述例子中說(shuō)明的最佳化。
但是,一般的編譯器,這些要素是否排序在運(yùn)行之前是不明確的。為此,編譯器要以循環(huán)內(nèi)存取要素在主存儲(chǔ)器上沒(méi)有適當(dāng)排序?yàn)榍疤徇M(jìn)行最佳化。
也就是說(shuō),出現(xiàn)了圖25(a)所示的源程序381時(shí),如果設(shè)數(shù)組A的要素大小為4字節(jié),則和參照?qǐng)D11進(jìn)行說(shuō)明的單循環(huán)分割一樣,進(jìn)行最佳化。只是,由于以要素沒(méi)有排序?yàn)榍疤幔圆迦胱顑?nèi)循環(huán)前面的預(yù)取指令(dpref(&A[i+64]))預(yù)取指定2行前的數(shù)組A的要素。而且,在循環(huán)處理之前,為了確保在循環(huán)內(nèi)存取的數(shù)組要素A
~A[63],預(yù)取指令(dpref(&A
)及dpref(&A[32]))被插入到預(yù)取的等待時(shí)間可以十分隱蔽的位置,生成圖25(b)所示的程序382。
而且,出現(xiàn)圖26(a)所示的源程序391時(shí),和圖16一樣,疊入循環(huán)被剝離處理的部分之后,插入預(yù)取2行前的數(shù)組A的要素的預(yù)取指令(dpref(&A[i+64]))。而且,和程序382一樣插入預(yù)取指令(dpref(&A
)及dpref(&A[32])),生成如圖26(b)所示的最佳化程序392。
插入動(dòng)態(tài)排序解析代碼的結(jié)構(gòu)轉(zhuǎn)換分割圖27是說(shuō)明動(dòng)態(tài)確定沒(méi)有排序的數(shù)組要素,進(jìn)行循環(huán)處理的最佳化的圖??紤]輸入了圖27(a)所示的源程序401的情況。這里設(shè)數(shù)組A的要素為4字節(jié)。
數(shù)組A的開(kāi)頭地址(要素A
的地址)指定的比特表示高速緩存的行,存在于這個(gè)比特內(nèi)的比特,表示行開(kāi)頭開(kāi)始的偏移量。因此,由進(jìn)行稱(chēng)作A&Mask比特之間的邏輯運(yùn)算,可以取出行開(kāi)頭開(kāi)始的偏移量。這里,屏蔽值Mask是事先給定的值。從數(shù)組A的開(kāi)頭地址取出的偏移值向右只移位事先給定的補(bǔ)正值Cor,由此可以知道數(shù)組A的開(kāi)頭要素A
位于1行內(nèi)從頭開(kāi)始的第幾個(gè)。因此,根據(jù)式(3),可以求出行上沒(méi)有排序的要素?cái)?shù)n。
n=32-(A&Mask)>>Cor…(3)也就是說(shuō),如圖28所示,預(yù)取高速緩存431時(shí),可以區(qū)分沒(méi)有排序的數(shù)組A的要素(A
~A[n-1])和排序的數(shù)組A的要素。
因此,如圖27(b)的程序402所示,根據(jù)式(3)求出沒(méi)有排序的數(shù)組A的要素?cái)?shù)n。然后,根據(jù)要素?cái)?shù)n,進(jìn)行與沒(méi)有排序的數(shù)組A的要素(A
~A[n-1])有關(guān)的循環(huán)處理。之后,對(duì)于排序的數(shù)組A的要素(A[n]以后的要素),和圖11所示的單循環(huán)分割情況同樣進(jìn)行雙重循環(huán)化。
之后,對(duì)于正在剝離的循環(huán)405,如果進(jìn)行疊入處理,就可以生成圖27(c)所示的程序403。又,如圖27(d)所示,插入預(yù)取指令(dpref(&A[i+32])),由此可以得到最佳化的程序404。
使用剖面信息的結(jié)構(gòu)轉(zhuǎn)換分割圖29是關(guān)于使用剖面信息確定沒(méi)有排序的數(shù)組要素,而后進(jìn)行循環(huán)處理的最佳化的處理進(jìn)行說(shuō)明的圖。對(duì)于沒(méi)有排序的數(shù)組要素?cái)?shù),不是如圖27那樣從計(jì)算中求得,而是從剖面信息中求出。根據(jù)取得的沒(méi)有排序的數(shù)組要素?cái)?shù)N,進(jìn)行如圖27所示的同樣的處理,把圖29(a)所示的源程序411轉(zhuǎn)換為圖29(b)所示的程序412。之后,疊入剝離的循環(huán)部分,得到圖29(c)所示的程序413。最后,插入圖29(d)所示的預(yù)取指令,由此得到最佳化的程序414。
對(duì)最內(nèi)循環(huán)以外的循環(huán)的結(jié)構(gòu)轉(zhuǎn)換圖30是說(shuō)明對(duì)最內(nèi)循環(huán)以外的循環(huán)結(jié)構(gòu)轉(zhuǎn)換的圖。
考慮給予了圖30(a)所示的源程序421的情況。源程序421中進(jìn)行雙重循環(huán)處理,設(shè)最內(nèi)循環(huán)處理424中所參照的數(shù)組A的要素為1字節(jié)。由于最內(nèi)循環(huán)處理424的循環(huán)次數(shù)是4次,因此在最內(nèi)循環(huán)處理424中數(shù)組A的要素被參照了4字節(jié)。所以,由于最內(nèi)循環(huán)處理424中參照的要素字節(jié)數(shù)小,因此這種情況下,把最內(nèi)循環(huán)處理424作為1個(gè)整體考慮,最外循環(huán)如圖30(b)所示的程序422那樣,結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。之后,運(yùn)行第2個(gè)循環(huán)處理之前,插入預(yù)取高速緩存的1行份的數(shù)組A的要素的指令(dpref(&A[j+128])),得到圖30(c)所示的最佳化程序423。
依據(jù)編譯指示#pragma_loop_tiling_dpref變量名[,變量名]的變量指定圖31是說(shuō)明由編譯指示#pragma_loop_tiling_dpref變量名[,變量名]指定了變量情況下的最佳化處理的圖。如圖31(a)所示,編譯指示的指定#pragma_loop_tiling_dpref b包含于源程序中時(shí),只是著眼于循環(huán)內(nèi)的數(shù)組b進(jìn)行結(jié)構(gòu)轉(zhuǎn)換,忽略數(shù)組a。因此,運(yùn)行圖31(b)所示的雙重循環(huán)化,只插入預(yù)取數(shù)組b的指令。
如上說(shuō)明,依據(jù)本實(shí)施例的編譯系統(tǒng),雙重化循環(huán)處理,并在最內(nèi)循環(huán)的外側(cè)運(yùn)行預(yù)取指令。由此,可以防止發(fā)出無(wú)用的預(yù)取指令,并且可以提高程序運(yùn)行時(shí)的處理速度。而且,由于雙重化循環(huán)處理,可以保證從運(yùn)行預(yù)取指令之后到運(yùn)行下一個(gè)預(yù)取指令之前的周期數(shù)。由此,可以隱蔽等待時(shí)間,防止互鎖。
以上,對(duì)有關(guān)本發(fā)明實(shí)施例的編譯系統(tǒng),基于實(shí)施例進(jìn)行了說(shuō)明,但本發(fā)明不限于這個(gè)實(shí)施例。
例如,由指令最佳配置部187配置的指令,不限于預(yù)取指令,也可以是以下指令通常的存儲(chǔ)器存取指令、啟動(dòng)外部處理并等待其處理結(jié)果的指令等等待應(yīng)答指令、運(yùn)行的結(jié)果有可能引起互鎖的指令、運(yùn)行后在可以參照指定的資源之前需要多個(gè)周期的指令等。應(yīng)答等待指令,除了經(jīng)常等待應(yīng)答的指令外,還包含具有等待應(yīng)答情況和不等待應(yīng)答情況的指令。
另外,也可以是把不具備高速緩存的計(jì)算機(jī)的CPU作為目標(biāo)處理器,隱蔽各種處理的等待時(shí)間,輸出防止互鎖的代碼的編譯系統(tǒng)。
還有,可以在逐條解釋由CPU運(yùn)行的機(jī)器語(yǔ)言指令串的同時(shí),實(shí)現(xiàn)作為運(yùn)行本實(shí)施例中說(shuō)明的循環(huán)結(jié)構(gòu)轉(zhuǎn)換等處理的OS(OperatingSystem)。
又,如以下所示的PreTouch指令,對(duì)于沒(méi)有可能引起互鎖的指令,本發(fā)明也可以適用。PreTouch指令指的是,進(jìn)行在高速緩存上只事先保證用來(lái)存儲(chǔ)自變量指定的變量的區(qū)域的處理的指令。以下,對(duì)進(jìn)行循環(huán)的結(jié)構(gòu)轉(zhuǎn)換、插入PreTouch指令的處理進(jìn)行說(shuō)明。
單循環(huán)分割圖32是,在插入PreTouch指令時(shí),對(duì)象區(qū)域與高速緩存大小排序,對(duì)不需要?jiǎng)冸x的情況下的單循環(huán)分割處理進(jìn)行說(shuō)明的圖。
考慮輸入了圖32(a)所示的源程序502的情況。在這個(gè)源程序502中,定義了把循環(huán)次數(shù)i和變量val之間的運(yùn)算結(jié)果(乘積結(jié)果)依次代入到數(shù)組A的要素的處理。這里,設(shè)數(shù)組A的各要素大小為4字節(jié),設(shè)高速緩存的1行大小是128字節(jié)(在以后的說(shuō)明中,高速緩存的行大小也設(shè)為128字節(jié))。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素。又,包含于源程序502的循環(huán)迭代次數(shù)128次是32的整數(shù)倍。
為此,源程序502,如圖32(b)的程序504所示,可以結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。也就是說(shuō),在最內(nèi)循環(huán)中進(jìn)行32次反復(fù)處理,在其外的循環(huán)中,進(jìn)行反復(fù)4次最內(nèi)循環(huán)的循環(huán)處理。在最內(nèi)循環(huán)處理中,高速緩存的1行的數(shù)據(jù)被代入數(shù)組A。之后,如圖32(c)的程序506所示,在運(yùn)行最內(nèi)循環(huán)之前,插入高速緩存區(qū)域保證指令(PreTouch(&A[i]))。由于插入PreTouch指令,在運(yùn)行最內(nèi)循環(huán)時(shí),在高速緩存區(qū)域中保證了該循環(huán)中定義的數(shù)組A的要素。由此,不會(huì)引起來(lái)自主存儲(chǔ)器的不需要的數(shù)據(jù)傳輸,可以減輕總線占有率。
圖33是說(shuō)明插入PreTouch指令時(shí)的不需要?jiǎng)冸x情況下的單循環(huán)分割處理的圖。
考慮輸入了圖33(a)所示的源程序512的情況。在這個(gè)源程序512中,定義了把循環(huán)次數(shù)i和變量val之間的運(yùn)算結(jié)果(乘積結(jié)果)依次代入數(shù)組A的要素的處理。這里,設(shè)數(shù)組A的各要素大小為4字節(jié),且排序于高速緩存大小。也就是說(shuō),高速緩存的1行上存儲(chǔ)32個(gè)數(shù)組A的要素。又,設(shè)包含于源程序512的循環(huán)迭代次數(shù)是140次。也就是說(shuō)是,除以1行上所存儲(chǔ)的數(shù)組A的要素?cái)?shù)32時(shí)剩余的數(shù)。
這種情況下,如圖33(b)所示的程序514,剝離140除以32時(shí)的剩余數(shù)的循環(huán)次數(shù),其外部分和圖32b同樣,結(jié)構(gòu)轉(zhuǎn)換為雙重循環(huán)。之后,進(jìn)行為了把剝離的部分包含于雙重循環(huán)結(jié)構(gòu)中的剝離疊入處理,得到如圖33(c)所示的程序516。也就是說(shuō),通常狀態(tài)下,在最內(nèi)循環(huán)進(jìn)行32次的反復(fù)處理,在最后運(yùn)行最內(nèi)循環(huán)時(shí),進(jìn)行剩余的12(=140-128)次的反復(fù)處理。之后,如圖33(d)的程序518所示,在運(yùn)行最內(nèi)循環(huán)之前,插入高速緩存保證指令(PreTouch(&A[i]))。只是,區(qū)域保證處理,以1行單位進(jìn)行。由此,在運(yùn)行可以保證目標(biāo)對(duì)象A以外的區(qū)域的最后的最內(nèi)循環(huán)時(shí),使其不發(fā)出PreTouch指令,使其不保證目標(biāo)對(duì)象A以外的區(qū)域。
插入動(dòng)態(tài)排序解析代碼的結(jié)構(gòu)轉(zhuǎn)換分割圖34是說(shuō)明動(dòng)態(tài)確定沒(méi)有排序的數(shù)組要素,進(jìn)行循環(huán)處理的最佳化處理的圖??紤]輸入了圖34(a)所示的源程序522的情況。這里,設(shè)數(shù)組A的要素為4字節(jié)。
數(shù)組A的開(kāi)頭地址(要素A
)指定的比特表示高速緩存的行,存在于這個(gè)比特內(nèi)的比特,表示行開(kāi)頭開(kāi)始的偏移量。因此,通過(guò)進(jìn)行稱(chēng)為A&Mask的比特之間的邏輯演算,可以取出從行開(kāi)頭開(kāi)始的偏移量。這里,屏蔽值Mask是事先給定的值。這里,設(shè)[Mask=0x7F]。把從循環(huán)初次存取的數(shù)組A的要素地址中取出的偏移值,從屏蔽值Mask中減掉,僅向右挪動(dòng)事先給定的補(bǔ)正值Cor,由此可以知道數(shù)組A的要素A[X]位于1行從頭開(kāi)始的第幾個(gè)。因此,根據(jù)式(4),可以求出在行上沒(méi)有排序的要素?cái)?shù)PRLG。
PRLG=(Mask-(&A[X])&Mask)>>Cor…(4)而且,根據(jù)式(5)可以求出在循環(huán)最后參照的數(shù)組A的要素(A[Y-1])的下一個(gè)要素A[Y])位于1行內(nèi)從開(kāi)頭開(kāi)始的第幾個(gè),由此,可以求出沒(méi)有完全滿(mǎn)足1行的要素?cái)?shù)EPLG。
EPLG=(&A[Y])&Mask)>>Cor…(5)而且,可以根據(jù)式(6)求出進(jìn)行沒(méi)有剩余的1行的處理的循環(huán)次數(shù)KRNL。
KNRL=(Y-X)-(PRLG+EPLG) …(6)也就是說(shuō),如圖34(b)的程序524所示,當(dāng)高速緩存的區(qū)域分配有數(shù)組A時(shí),也就區(qū)分了沒(méi)有排序的數(shù)組A的要素(A[X])~A[X+PRLG-1])、排序且是1行的倍數(shù)大小的數(shù)組A的要素(A[X+PRLG]~A[X+PRLG+KRNL-1])、排序但不滿(mǎn)足1行大小的數(shù)組A的要素(A[X+PRLG+KRNL]~A[X+PRLG+KRNL+ERLG-1])。
因此,如圖34(b)的程序524所示,進(jìn)行依據(jù)式(4)求出沒(méi)有排序的數(shù)組A的要素?cái)?shù)PRLG的處理等。然后,根據(jù)要素?cái)?shù)PRLG,對(duì)沒(méi)有排序的數(shù)組A的要素(A[X])~A[X+PRLG-1])進(jìn)行循環(huán)處理。之后,對(duì)排序的數(shù)組A的要素(A[X+PRLG]~A[X+PRLG+KRNL-1]的要素),與圖32b所示的單循環(huán)分割情況同樣,進(jìn)行雙重循環(huán)化。而且,如果EPLG>0,由于需要?jiǎng)冸x處理,因此與圖33b所示的需要?jiǎng)冸x時(shí)的情況一樣,進(jìn)行剝離處理。
之后,對(duì)剝離的循環(huán),如果進(jìn)行疊入處理,就生成了圖34(c)所示的程序526。而且,如圖34(d)所示,插入高速緩存區(qū)域保證指令(PreTouch(&A[i])),由此,可以得到程序528。
只是,插入?yún)^(qū)域保證指令,僅僅針對(duì)排序的區(qū)域且使用高速緩存的整個(gè)1行的最內(nèi)循環(huán)。
產(chǎn)業(yè)上利用的可能性本發(fā)明適用于控制發(fā)出有可能引起互鎖的指令的編譯器、OS、處理器中運(yùn)行的處理等。
權(quán)利要求
1.一種面向處理器的程序轉(zhuǎn)換裝置,該處理器具備包含運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令的指令系統(tǒng),其特征在于,具備進(jìn)行雙重循環(huán)轉(zhuǎn)換的循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,其中雙重循環(huán)轉(zhuǎn)換是把包含于輸入程序中的反復(fù)次數(shù)是x次的循環(huán)轉(zhuǎn)換為將反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán)且將反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu);指令配置裝置,在上述內(nèi)循環(huán)的外部位置配置上述指令,由此轉(zhuǎn)換為包含該指令的輸出程序。
2.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置具備檢測(cè)包含于上述輸入程序中的循環(huán)的循環(huán)檢測(cè)部;檢測(cè)上述循環(huán)的反復(fù)次數(shù)的反復(fù)次數(shù)檢測(cè)部;檢測(cè)應(yīng)答等待周期數(shù)的應(yīng)答等待周期數(shù)檢測(cè)部,其中應(yīng)答等待周期數(shù)是等待上述指令運(yùn)行時(shí)的上述指定的應(yīng)答的周期數(shù);檢測(cè)上述循環(huán)的1次反復(fù)處理所需要的1個(gè)序列周期數(shù)的1序列周期數(shù)檢測(cè)部;把上述循環(huán)分割為反復(fù)次數(shù)是“上述應(yīng)答等待周期數(shù)/上述1序列周期數(shù)”次的循環(huán)的循環(huán)分割部;進(jìn)行雙重循環(huán)轉(zhuǎn)換的雙重循環(huán)轉(zhuǎn)換部,該雙重循環(huán)轉(zhuǎn)換是將反復(fù)次數(shù)是“上述應(yīng)答等待周期數(shù)/上述1序列周期數(shù)”次的循環(huán)作為內(nèi)循環(huán)且將反復(fù)次數(shù)是(上述循環(huán)反復(fù)次數(shù)/上述內(nèi)循環(huán)的反復(fù)次數(shù))次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu)的轉(zhuǎn)換。
3.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,還具備接收與最佳化有關(guān)的最佳化指示信息的最佳化指定信息接收裝置。
4.根據(jù)權(quán)利要求3所述的程序轉(zhuǎn)換裝置,其特征在于,上述最佳化指定信息接收裝置接收包含于上述輸入程序的循環(huán)的最低反復(fù)次數(shù),上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,當(dāng)循環(huán)的運(yùn)行次數(shù)不定時(shí),根據(jù)上述最低反復(fù)次數(shù),由上述循環(huán)取出上述最低反復(fù)次數(shù)的反復(fù)處理,對(duì)取出的循環(huán)的反復(fù)處理進(jìn)行雙重循環(huán)轉(zhuǎn)換。
5.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,上述指令是有可能發(fā)生互鎖的指令。
6.根據(jù)權(quán)利要求5所述的程序轉(zhuǎn)換裝置,其特征在于,上述有可能發(fā)生互鎖的指令是從主存儲(chǔ)器向高速緩存預(yù)取數(shù)據(jù)的指令。
7.根據(jù)權(quán)利要求6所述的程序轉(zhuǎn)換裝置,其特征在于,還具備進(jìn)行指令編排的編排裝置,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置根據(jù)上述編排裝置得到的結(jié)果,把上述反復(fù)次數(shù)是x次的循環(huán)分割為反復(fù)次數(shù)是y次的循環(huán),使得該運(yùn)行的周期數(shù)是運(yùn)行上述預(yù)取所需要的周期數(shù),并進(jìn)行將反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán)且將反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu)的轉(zhuǎn)換即雙重循環(huán)轉(zhuǎn)換。
8.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,上述指令是在運(yùn)行后到指定資源成為可以參照的狀態(tài)為止需要多個(gè)周期的指令。
9.根據(jù)權(quán)利要求8所述的程序轉(zhuǎn)換裝置,其特征在于,上述需要多個(gè)的指令,是訪問(wèn)主存儲(chǔ)器或者高速緩存的指令。
10.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置把上述反復(fù)次數(shù)是x次的循環(huán)分割為反復(fù)次數(shù)是y次的循環(huán),使得該循環(huán)中所參照的數(shù)組的地址僅運(yùn)行高速緩存的行大小前進(jìn)量,并進(jìn)行將反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán),將反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的雙重循環(huán)轉(zhuǎn)換。
11.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置進(jìn)行比例分配轉(zhuǎn)換,即當(dāng)上述數(shù)組存在多個(gè)時(shí),對(duì)進(jìn)行了雙重循環(huán)轉(zhuǎn)換的上述反復(fù)次數(shù)是y次的循環(huán),根據(jù)上述數(shù)組數(shù)進(jìn)一步進(jìn)行比例分配。
12.根據(jù)權(quán)利要求11所述的程序轉(zhuǎn)換裝置,其特征在于,上述比例分配轉(zhuǎn)換,對(duì)于多個(gè)上述數(shù)組,當(dāng)這些數(shù)組要素的大小不同時(shí),對(duì)應(yīng)上述大小的比,比例分配上述反復(fù)次數(shù)是y次的循環(huán)。
13.根據(jù)權(quán)利要求11所述的程序轉(zhuǎn)換裝置,其特征在于,上述比例分配轉(zhuǎn)換,對(duì)于多個(gè)上述數(shù)組,當(dāng)循環(huán)的反復(fù)處理進(jìn)行1次所前進(jìn)的地址跨距不同時(shí),對(duì)應(yīng)上述跨距的比,比例分配上述反復(fù)次數(shù)是y次的循環(huán)。
14.根據(jù)權(quán)利要求11所述的程序轉(zhuǎn)換裝置,其特征在于,上述比例分配轉(zhuǎn)換,進(jìn)行比例分配轉(zhuǎn)換,以便在轉(zhuǎn)換內(nèi)循環(huán)之際,生成對(duì)應(yīng)分配的各循環(huán)的條件語(yǔ)句,使分配的各循環(huán)在同一個(gè)內(nèi)循環(huán)中運(yùn)行。
15.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,在把上述反復(fù)次數(shù)是x次的循環(huán)分割為上述反復(fù)次數(shù)是y次的循環(huán)時(shí),如果運(yùn)算x/y時(shí)的余數(shù)z不是0,就對(duì)z次的反復(fù)處理進(jìn)行剝離處理,并進(jìn)行雙重循環(huán)轉(zhuǎn)換。
16.根據(jù)權(quán)利要求15所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,如果上述余數(shù)z不是0,生成判斷內(nèi)循環(huán)的循環(huán)次數(shù)是y次還是z次的判斷條件語(yǔ)句,并進(jìn)行雙重循環(huán)轉(zhuǎn)換。
17.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,當(dāng)循環(huán)的運(yùn)行次數(shù)不定時(shí),運(yùn)行時(shí)判斷上述循環(huán)的運(yùn)行次數(shù),根據(jù)判斷結(jié)果進(jìn)行動(dòng)態(tài)改變反復(fù)次數(shù)的雙重循環(huán)轉(zhuǎn)換,。
18.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,還具備接收數(shù)組排序?yàn)楦咚倬彺娴男写笮〉男畔⒌慕邮昭b置,上述指令配置裝置,對(duì)上述反復(fù)次數(shù)是x次的循環(huán)配置預(yù)取指令,預(yù)取該循環(huán)中x次的反復(fù)處理所參照的數(shù)據(jù)的前一個(gè)高速緩存的行上所存儲(chǔ)的數(shù)據(jù)。
19.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述最佳化指定信息接收裝置,接收數(shù)組從高速緩存的行的哪個(gè)相對(duì)位置開(kāi)始存取的信息,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,根據(jù)該信息進(jìn)行上述的雙重循環(huán)轉(zhuǎn)換。
20.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述指令配置裝置,當(dāng)上述數(shù)組沒(méi)有按高速緩存的行大小排序時(shí),對(duì)上述反復(fù)次數(shù)是x次的循環(huán)配置預(yù)取指令,預(yù)取該循環(huán)中的x次的反復(fù)處理所參照的數(shù)據(jù)的二個(gè)前的高速緩存的行上所存儲(chǔ)的數(shù)據(jù)。
21.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,當(dāng)上述數(shù)組沒(méi)有排序?yàn)楦咚倬彺娴男写笮r(shí),判斷數(shù)組從高速緩存的行的哪個(gè)相對(duì)位置開(kāi)始存取,并根據(jù)判別結(jié)果進(jìn)行雙重循環(huán)結(jié)構(gòu)轉(zhuǎn)換。
22.根據(jù)權(quán)利要求10所述的程序轉(zhuǎn)換裝置,其特征在于,還具備接收有關(guān)關(guān)注的數(shù)組的信息的接收裝置,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,只對(duì)該數(shù)組進(jìn)行關(guān)注,進(jìn)行雙重循環(huán)轉(zhuǎn)換。
23.根據(jù)權(quán)利要求1所述的程序轉(zhuǎn)換裝置,其特征在于,上述循環(huán)結(jié)構(gòu)轉(zhuǎn)換裝置,把最內(nèi)循環(huán)作為1個(gè)塊,對(duì)外循環(huán)進(jìn)一步進(jìn)行雙重循環(huán)轉(zhuǎn)換。
24.一種面向處理器的程序轉(zhuǎn)換方法,該處理器具備包含運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令的指令系統(tǒng),其特征在于,具備進(jìn)行雙重循環(huán)轉(zhuǎn)換的步驟,把包含于輸入程序中的反復(fù)次數(shù)是x次的循環(huán)轉(zhuǎn)換為將反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán)且將反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu);在上述內(nèi)循環(huán)的外部位置配置上述指令,并轉(zhuǎn)換為包含該指令的輸出程序的步驟。
25.一種面向處理器的程序轉(zhuǎn)換方法的程序,該處理器具備包含運(yùn)行時(shí)等待來(lái)自外部的指定應(yīng)答的指令的指令系統(tǒng),其特征在于,使計(jì)算機(jī)運(yùn)行如下步驟進(jìn)行雙重循環(huán)轉(zhuǎn)換的步驟,把包含于輸入程序中的反復(fù)次數(shù)是x次的循環(huán)轉(zhuǎn)換為反復(fù)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán),反復(fù)次數(shù)是x/y次的循環(huán)作為外循環(huán)的嵌套結(jié)構(gòu);在上述內(nèi)循環(huán)的外部位置配置上述指令,并轉(zhuǎn)換為包含該指令的輸出程序的步驟。
全文摘要
一種不再無(wú)端發(fā)出有可能引起互鎖的指令,可以提高程序運(yùn)行時(shí)的處理速度的編譯器,其面向處理器并具備運(yùn)行時(shí)有可能引起互鎖的指令,其特征在于,賦予計(jì)算機(jī)功能,具備循環(huán)結(jié)構(gòu)轉(zhuǎn)換部(186),對(duì)輸入程序進(jìn)行雙重循環(huán)轉(zhuǎn)換,把循環(huán)次數(shù)是x次的循環(huán)分割為循環(huán)次數(shù)是y次的循環(huán),把上述循環(huán)次數(shù)是y次的循環(huán)作為內(nèi)循環(huán),把循環(huán)次數(shù)是x/y次的循環(huán)作為外循環(huán);指令最佳配置部(187),對(duì)上述雙重循環(huán)轉(zhuǎn)換之后的程序進(jìn)行有可能引起互鎖的指令的配置。
文檔編號(hào)G06F9/45GK1918546SQ20058000468
公開(kāi)日2007年2月21日 申請(qǐng)日期2005年2月4日 優(yōu)先權(quán)日2004年2月12日
發(fā)明者川端輝雄, 小川一, 瓶子岳人, 山本康博, 道本昌平 申請(qǐng)人:松下電器產(chǎn)業(yè)株式會(huì)社
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
吴桥县| 交城县| 通渭县| 甘德县| 通化市| 黔南| 奈曼旗| 平远县| 安陆市| 二手房| 博湖县| 萨迦县| 乌鲁木齐县| 若羌县| 德钦县| 蒙自县| 社会| 安化县| 维西| 蒙阴县| 张北县| 天全县| 梨树县| 新乐市| 阳曲县| 德江县| 新津县| 灵山县| 噶尔县| 江山市| 白城市| 邳州市| 繁昌县| 宁晋县| 启东市| 米脂县| 汝南县| 北宁市| 萨嘎县| 建始县| 明光市|