專利名稱:一種減少流處理器片上指令存儲器資源消耗的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及減少芯片中指令存儲器資源消耗的方法,尤其指一種減少流處理器片上 指令存儲器資源消耗的方法。
背景技術(shù):
基于流體系結(jié)構(gòu)的流處理器是新一代面向密集計(jì)算的高性能微處理器的典型代表, 專門面向流應(yīng)用。流應(yīng)用主要分為兩類 一類是媒體應(yīng)用;另一類是科學(xué)計(jì)算。流應(yīng)用 具有以下幾個(gè)主要特征計(jì)算密集性,與傳統(tǒng)的桌面應(yīng)用相比,流式應(yīng)用對每次從內(nèi)存 取出的數(shù)據(jù)都要進(jìn)行大量的算術(shù)運(yùn)算;并行性,以數(shù)據(jù)級并行為主,同時(shí)存在指令級和 任務(wù)級并行;局域性,是指應(yīng)用中的數(shù)據(jù)重用局域性。流應(yīng)用程序通常包含kernel級程 序和流級程序兩部分流級程序負(fù)責(zé)組織輸入和輸出數(shù)據(jù),kernel程序是運(yùn)算的核心,負(fù) 責(zé)對這些數(shù)據(jù)進(jìn)行運(yùn)算。
由于流處理器中多以超長指令字(VLIW: Very Long Instruction Word)的方式組織指 令來開發(fā)指令級并行,這種結(jié)構(gòu)使得流處理器指令存儲器的寬度很大(因?yàn)橹噶畲鎯ζ?每行至少要能容納1條VLIW);另一方面,流處理器的片上指令存儲器大多采用軟件靜 態(tài)管理的方式,存儲空間的分配以kernel為粒度,因此,指令存儲器必須有能力同時(shí)容 納多個(gè)kernel,這使得流處理器指令存儲器的深度很大。對寬度和深度的要求直接導(dǎo)致指 令存儲器的容量增加,從而使得其在芯片中占用的面積比例增加。如Imagine中核心指 令存儲器的面積占芯片面積的10%, MASA中核心指令存儲器占芯片面積的26。/。。編譯 器靜態(tài)調(diào)度指令碼的管理方式保證了指令存儲器能為計(jì)算單元高效地提供指令,然而以 kernel為調(diào)度粒度使得在kernel的生命周期中,存在大量的無效指令或不常使用指令長時(shí) 間占用指令存儲空間。這增加了指令存儲器的資源消耗,即增加了構(gòu)建存儲器所需的硬 件存儲單元的消耗。
對于超長指令字結(jié)構(gòu)的處理器,減少指令存儲器資源消耗主要有指令壓縮、分布式 指令存儲器和指令生命周期分析優(yōu)化等方法。指令壓縮是通過某種編碼算法對指令碼進(jìn) 行壓縮,減少指令碼的長度,從而降低指令碼對存儲空間的需求。由于應(yīng)用程序中有限 的指令級并行使得VLIW中不可避免的含有很多空操作,該方法最大的問題是將壓縮后 的指令還原時(shí)會引入額外的指令流出延遲。分布式指令存儲器是將VLIW存儲器分割為多個(gè)窄的指令存儲器,每個(gè)存儲器分別與一個(gè)計(jì)算功能單元對應(yīng),當(dāng)VLIW中對應(yīng)的功 能單元出現(xiàn)空操作時(shí),與該功能單元對應(yīng)的指令存儲器則可以不存儲指令,從而可以減 少指令存儲空間的需求。這是一種采用修改存儲器硬件結(jié)構(gòu)設(shè)計(jì)來壓縮指令的方法,它 的主要問題是由于不同應(yīng)用對各功能單元的需求不同,使得VLIW中空操作出現(xiàn)的比例 不同,會造成部分功能單元對應(yīng)的局部指令存儲器不夠用,而另一部分指令存儲器則有 多余的現(xiàn)象。此方法與前一種方法類似,都是通過橫向壓縮指令來減少指令對存儲空間 的需求,從而減少存儲器資源消耗。指令生命周期分析優(yōu)化是通過縮短指令占據(jù)存儲器 的時(shí)間來降低應(yīng)用程序?qū)Υ鎯臻g的需求,從而可通過減少總的存儲容量來減少存儲器 的資源消耗。該方法主要是通過分析程序的局域性,預(yù)測程序中各部分指令的生命周期, 通過編譯器控制指令導(dǎo)入存儲器的時(shí)機(jī),并指導(dǎo)各指令在其生命周期結(jié)束后及時(shí)的釋放 存儲空間,從而盡量縮短指令占據(jù)存儲器的時(shí)間,在縱向上壓縮指令來減少指令存儲器 的資源消耗。該方法過分依賴軟件編譯器的能力,若編譯器預(yù)測錯(cuò)誤,則會造成程序性 能極為低下。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種減少流處理器片上指令存儲器資源消耗的方 法。該方法基于現(xiàn)有成熟的硬件存儲器結(jié)構(gòu),增加少量的指令讀取延遲,不增加復(fù)雜的 編譯算法,能有效的減少指令存儲器的資源消耗。
本發(fā)明的方案是將流處理器中純軟件管理的指令存儲器修改為軟硬件混合指令存
儲器,根據(jù)流應(yīng)用中kernel程序的特征,定義kernel熱代碼;根據(jù)kernel熱代碼的定義, 得到三個(gè)判定kernel熱代碼的定理;在編譯器中增加kernel熱代碼查找模塊,由kernel 熱代碼査找模塊根據(jù)三個(gè)判定定理査找流應(yīng)用中的kernel熱代碼;采用軟件管理靜態(tài)存 儲器存儲kernel熱代碼以保證其高命中率,采用硬件管理的cache存儲其他指令,通過 縮短指令占用指令存儲器的時(shí)間來減少程序?qū)Υ鎯臻g的需求,從而可以縮減總存儲容 量,從而減少指令存儲器的資源消耗。 本發(fā)明技術(shù)方案是
為說明本發(fā)明技術(shù)方案,先給出如下定義和定理
定義1:循環(huán)LOOP1是循環(huán)LOOP2的外層循環(huán),若LOOP2不失效能保證80%以上 的LOOP1指令不失效,則稱LOOP2是LOOP1的熱代碼。
定義2:如果kernel中某個(gè)循環(huán)的所有指令不失效能保證kernel中最外層循環(huán)80% 以上的指令不失效,則稱這個(gè)循環(huán)是"kernel熱代碼",稱kernel中其他指令為"kernel涼代碼"。
在kernel中,最外層循環(huán)之外的指令在整個(gè)kernel的執(zhí)行過程中只會執(zhí)行一次,而 對于沒有預(yù)取功能的指令存儲器來說,這些指令都存在不可避免的強(qiáng)制失效,即在首次 使用這些指令(也是唯一的一次)時(shí),它們沒有裝載進(jìn)指令存儲器中而引發(fā)的失效。而 對于循環(huán)內(nèi)部的指令,由于它們都需要被反復(fù)多次執(zhí)行,若指令存儲器有足夠的能力捕 捉其時(shí)間局域性,即存儲器有足夠的容量或高效的替換策略使得它們在反復(fù)執(zhí)行的過程 中一直存于存儲器中,那么就能極大保證循環(huán)內(nèi)部指令的命中率,從而提高整個(gè)kernel 的命中率。因此,kernel熱代碼定義主要考慮了 kernel最外層循環(huán)內(nèi)指令的命中率,而忽 略外層循環(huán)之外的指令的影響,在指令存儲器的硬件設(shè)計(jì)中再對外層循環(huán)之外的指令進(jìn) 行優(yōu)化。
根據(jù)熱代碼和kernel熱代碼的定義,得到判定熱代碼的三個(gè)定理。 定理1:循環(huán)LOOP1長度為LI , LOOP2長度為L2,循環(huán)次數(shù)為C2, LOOP1是LOOP2 的外層循環(huán)。若滿足(CW(L2/L0〉4,貝lj LOOP2是LOOP1的"熱代碼"。
證明考慮最壞的情況存儲器僅有能力捕捉LOOP2的時(shí)間局域性,而完全不能捕 捉LOOPl的時(shí)間局域性。也就是說,每次LOOPl執(zhí)行一次新的循環(huán)時(shí),LOOP1中的所 有指令都會失效一次,即LOOP1每開始一輪新循環(huán),其中LOOP2的第一遍循環(huán)會全部 失效,但本次LOOPl的循環(huán)中LOOP2的后續(xù)循環(huán)將全部命中??梢杂?jì)算出,在這種情 況下,LOOP1的失效指令數(shù)(Ml, Miss Instructions)和失效率(MR, Miss Rate)分別 為
Ci[Zi +- "] d[l + ^(C2 —1)]
若LOOP2在LOOP1每一輪新循環(huán)中都存在強(qiáng)制失效的情況下,都能保證LOOP1 的命中率大于80%,那么LOOP2的指令不失效就更加能保證80%以上的LOOP1指令不 失效,艮卩LOOP2是LOOPl的熱代碼。因此有如下推導(dǎo)
LOOP2是LOOP1的熱代碼G 1 — AO > 80%
<formula>formula see original document page 8</formula><formula>formula see original document page 9</formula>
定理2: LOOPl是kernel中的最外層循環(huán),若LOOPl沒有熱代碼,則LOOPl是kernel 熱代碼;若LOOP2是LOOPl的熱代碼,則LOOP2為kernel熱代碼。 證明由定義1和定義2顯然得證。
由于kernel結(jié)構(gòu)不同,在進(jìn)行kernel熱代碼分析時(shí),多層循環(huán)嵌套進(jìn)行kernel熱代 碼分析比較復(fù)雜。因此,提出三層循環(huán)嵌套的kernel熱代碼判定定理-
定理3 (三層嵌套循環(huán)kernel熱代碼判定定理)LOOPl、 LOOP2、 LOOP3是kernel 中的由外到內(nèi)三層嵌套循環(huán),Ll、 L2、 L3分別為三個(gè)循環(huán)的長度,Cl、 C2、 C3分別為 對應(yīng)的循環(huán)次數(shù)。LOOP3是kernel熱代碼,當(dāng)且僅當(dāng)命題1和命題2同時(shí)成立 命題l: LOOP3是LOOP2的熱代碼;
丄一
命題2: _k_*c2>~^^其中/7 = ~~AC2(C3-1)_ (h表示當(dāng)LOOP3 丄i一丄2 125 —丄 C2(^2—A) + ^3C3C2
一S
中指令的不失效時(shí),LOOP2的最低命中率); 證明
1. 若LOOP3不是LOOP2的熱代碼,也就是說,LOOP3指令不失效時(shí),LOOP2的 命中率小于80%,那么LOOP2的外層循環(huán)LOOP1的命中率會更低,從而可知LOOP3 不是kernel熱代碼;
2. 若LOOP3是LOOP2的熱代碼,LOOP1的最低命中率(HR, HitRate)為
服=_zag(c廣i)_<formula>formula see original document page 9</formula>A —丄 C2(£2 — i3) + £3C3C2 丄2 3
丄、—+丄
。i z 1 i——f>80%
, 丄-i
/ - /2 1
丄i厶2 1.25 _丄
本發(fā)明最多只對3層嵌套循環(huán)進(jìn)行kernel熱代碼分析,因?yàn)閗ernel作為流應(yīng)用中的 計(jì)算核心,通常不會含有多層循環(huán)嵌套的程序結(jié)構(gòu)。3層嵌套循環(huán)的情況已經(jīng)很少見,多 于3層循環(huán)的kernel基本上沒有。對于超過3層循環(huán)的kernel也按照3層循環(huán)的情況來 處理。
本發(fā)明的具體步驟是
第一步,將流處理器中純軟件管理的指令存儲器修改為軟硬件混合指令存儲器。軟 硬件混合指令存儲器由軟件管理靜態(tài)存儲器和硬件管理的cache兩部分組成。設(shè)計(jì)方法 如下
l丄軟件管理靜態(tài)存儲器與地址產(chǎn)生控制器、片外存儲器和計(jì)算簇相連,它從片外存 儲器獲得程序中的kernel熱代碼,即流控制器根據(jù)從地址產(chǎn)生控制器獲得的寫地址將各 kernel熱代碼由片外存儲器寫入軟件管理靜態(tài)存儲器;程序執(zhí)行時(shí),軟件管理靜態(tài)存儲器 給計(jì)算簇提供數(shù)據(jù),即計(jì)算簇根據(jù)地址產(chǎn)生控制器中的讀地址從軟件管理靜態(tài)存儲器中 讀取kernel熱代碼。
軟件管理靜態(tài)存儲容量設(shè)定為流處理器中原有的靜態(tài)指令存儲器容量的一半。通過 查找典型應(yīng)用中的kernel熱代碼,發(fā)現(xiàn)kernel熱代碼量通常為原程序指令代碼量的一半 左右,所以靜態(tài)指令存儲器的容量減小為原來容量的一半。
1.2.硬件管理的cache是一個(gè)直接映射的經(jīng)典cache,包括存儲體、Tag存儲器和cache 控制器三個(gè)部分,它從片外存儲器獲得程序中的kernel涼代碼。
存儲體與cache控制器、片外存儲器和計(jì)算簇相連。存儲體從片外存儲器獲得程序 中的kernel涼代碼,即流控制器將kernel涼代碼從片外存儲器寫入cache控制器指定的 存儲體的地址;程序執(zhí)行時(shí),硬件管理的cache向計(jì)算簇提供kernel涼代碼,即計(jì)算簇根據(jù)cache控制器產(chǎn)生的kernel涼代碼的讀地址,從存儲體中讀取kernel涼代碼。
Tag存儲器與cache控制器相連。在kernel涼代碼導(dǎo)入存儲體時(shí),cache控制器根據(jù) 涼代碼中指令的寫地址解析出對應(yīng)的Tag位和Tag存儲器寫地址,根據(jù)Tag存儲器寫地 址將Tag位寫入Tag存儲器;在計(jì)算簇從存儲體中讀取kernel涼代碼中的指令時(shí),cache 控制器根據(jù)指令讀地址解析出與其對應(yīng)的Tag存儲器讀地址,根據(jù)該讀地址從Tag存儲 器讀取對應(yīng)Tag位。
cache控制器與地址產(chǎn)生控制器、Tag存儲器和存儲體相連。當(dāng)計(jì)算簇從存儲體讀取 指令時(shí),cache控制器從地址產(chǎn)生控制器獲取指令讀地址,根據(jù)指令讀地址解析出存儲體 讀地址、指令對應(yīng)的Tag位和Tag存儲器讀地址。根據(jù)存儲體讀地址從存儲體中讀出指 令,根據(jù)Tag存儲器讀地址從Tag存儲器中讀取對應(yīng)的Tag位。將指令對應(yīng)的Tag位與 從Tag存儲器中讀出的Tag位進(jìn)行比較,若二者相等,則表示cache命中,存儲體中讀取 的指令有效;若二者不相等,則表示cache失效,存儲體中讀取的指令無效。cache控制 器中包含一個(gè)硬件預(yù)取部件,當(dāng)cache失效時(shí),硬件預(yù)取部件向片外存儲器發(fā)cache取指 令請求,請求將失效指令以及失效指令后續(xù)的若干條指令(即涼代碼) 一并寫入存儲體。 硬件預(yù)取有很多種方式,最常見的是采用cache行預(yù)取,即一次cache寫操作寫入一個(gè) cache行, 一個(gè)cache行內(nèi)包含多條指令。當(dāng)cache取指令請求被片外存儲器響應(yīng)后,地 址產(chǎn)生控制器將cache寫地址送入cache控制器,cache控制器根據(jù)指令寫地址解析出該 指令對應(yīng)的存儲體寫地址、Tag存儲器寫地址和指令對應(yīng)的Tag位,根據(jù)存儲體寫地址將 指令寫入存儲體,根據(jù)Tag存儲器寫地址將Tag位寫入Tag存儲器。
硬件管理的cache的存儲體大小通常為2的整數(shù)次冪(cache訪問地址是由片外存儲 器地址截位而得,所以2的整數(shù)次冪方便地址變換)。因?yàn)閗ernel大小一般不會超過1024 條VUW, kernel涼代碼通常不會超過kernel大小的一半,所以存儲體的容量通常為512 條VLIW。若流處理器是專門面向某類應(yīng)用,也可以根據(jù)該類應(yīng)用的特征對其容量進(jìn)行 定制。
第二步,在編譯器中增加kernel熱代碼查找模塊,由kernel熱代碼査找模塊查找kernel 熱代碼。對于含有n個(gè)kernel的應(yīng)用程序,kernel熱代碼査找模塊的流程是 2丄令i的初始值為1;
2.2.提取第i個(gè)kernel中各層循環(huán)的長度和除最外層循環(huán)外所有循環(huán)的循環(huán)次數(shù),即 "、L2、 L3、 C2、 C3的值。
Lj、 L2和L3的值為由外到內(nèi)三層循環(huán)的長度,由編譯器通過解析循環(huán)指令的循環(huán)跳轉(zhuǎn)的范圍得到,C2、 C3為第二、第三層的循環(huán)次數(shù),其值根據(jù)應(yīng)用的特征而定。在流應(yīng) 用中,循環(huán)的次數(shù)與輸入數(shù)據(jù)流的長度密切相關(guān)。對于典型的流應(yīng)用(如視頻編碼、圖 像搜索等),輸入流的大小在絕大多數(shù)情況下是可預(yù)知的(如一幀圖像的大小是確定的), 因此C2、 C3的值通過kernel的輸入流的長度除以每次循環(huán)處理數(shù)據(jù)的個(gè)數(shù)來確定。在極 少數(shù)特殊應(yīng)用中,少數(shù)kernel的輸入流的不定長會造成<:2或<:3不可預(yù)知。對Cz或C3 不可預(yù)知的情況要分別進(jìn)行處理;
2.3.若C2不可預(yù)知,標(biāo)記第一層循環(huán)為kernel熱代碼,轉(zhuǎn)步驟2.5;若(32可預(yù)知但 C3不可預(yù)知,轉(zhuǎn)步驟2.4;若C2和C3都可預(yù)知,利用定理3判斷第三層循環(huán)是否為kernel 熱代碼,方法如下
計(jì)算P尸(C3-1)氣L3/L2)、 P2=~^*C2、 丄3(C廣1)
丄-i
1.25」
/7
則將第三層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則轉(zhuǎn)
步驟2.4;
2.4.利用定理1和定理2査找kernel熱代碼,方法如下
計(jì)算P氣CW(L2/L0;
若P〉4,則將第二層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則標(biāo)記第一層循環(huán)為
kernel熱代碼,轉(zhuǎn)步驟2.5;
2.5.i=i+l,若i〉n,則kernel熱代碼查找完畢,轉(zhuǎn)入第三步;否則轉(zhuǎn)步驟2.2。 第三歩,在流級編譯時(shí),在各個(gè)kernel熱代碼之前添加指令流加載指令,該指令通
常為如下格式
浙e鵬丄o^/〈啟動瓶若泣巖成#丄位魔長度潛爭源關(guān);^> 啟動標(biāo)志位表示該指令是否已經(jīng)啟動, 一般0表示未啟動,l表示已啟動;完成標(biāo)志 位表示該指令是否已經(jīng)完成, 一般0表示未完成,l表示已完成。起始地址和流長度信息 指定了 kernel熱代碼在軟件管理靜態(tài)存儲器中的空間分配;指令相關(guān)性包含了本條指令 與它之前其他指令的相關(guān)性信息,當(dāng)所有相關(guān)性都得到滿足,本條指令流加載指令才能 被啟動執(zhí)行,也就是說,指令相關(guān)性確定了 kernel熱代碼導(dǎo)入軟件管理靜態(tài)存儲器的時(shí) 機(jī)。
第四步,將應(yīng)用程序裝載到軟硬件混合指令存儲器,啟動程序運(yùn)行,程序運(yùn)行過程
12如下
4丄令j的初始值等于l;
4.2. 査詢第j個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的狀態(tài),若啟動標(biāo)志位 為未啟動則轉(zhuǎn)步驟4.3;若己啟動但完成標(biāo)志位指示為未完成則轉(zhuǎn)步驟4.5;若完成標(biāo)志 位為已完成則轉(zhuǎn)步驟4.6;
4.3. 判斷第j個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的指令相關(guān)性是否滿 足,若滿足則轉(zhuǎn)步驟4.4,否則程序執(zhí)行終止,輸出"系統(tǒng)異常"。
當(dāng)輪到第j個(gè)kernel執(zhí)行時(shí),它的kernel熱代碼對應(yīng)的指令流加載指令的相關(guān)性必 須得到滿足,這是由編譯器保證的。若得不到滿足,則表示出現(xiàn)了系統(tǒng)異常。
4.4. 啟動第j個(gè)kernel的指令流加載指令,修改該指令的啟動標(biāo)志位為已啟動。由地 址產(chǎn)生控制器執(zhí)行該指令流加載指令,獲取軟件管理靜態(tài)存儲器起始地址和指令流的長 度,將第j個(gè)kernel的kernel熱代碼從外部存儲器寫入軟件管理靜態(tài)存儲器;
4.5. 等待第j個(gè)kernel的kernel熱代碼寫入軟件管理靜態(tài)存儲器,當(dāng)?shù)趈個(gè)kernel的 kernel熱代碼全部寫入軟件管理靜態(tài)存儲器,將第j個(gè)kernel的指令流加載指令的完成標(biāo) 志位修改為已完成;
4.6. 令k=j+l,啟動第j個(gè)kernel運(yùn)行,執(zhí)行步驟4.7 4.8;同時(shí)導(dǎo)入后續(xù)kernel的 kernel熱代碼,執(zhí)行步驟4.9 4.11;
在第j個(gè)kernel執(zhí)行時(shí),同時(shí)導(dǎo)入后續(xù)kernel的kernel熱代碼,實(shí)現(xiàn)計(jì)算和存儲操 作的重疊執(zhí)行,從而提高程序執(zhí)行的效率。
4.7. 若l^n,轉(zhuǎn)步驟4.12;若k^n,判斷第k個(gè)kernel的kernel熱代碼對應(yīng)的指令流 加載指令的指令相關(guān)性是否滿足,若滿足則啟動第k個(gè)kernel的指令流加載指令,修改 該指令的啟動標(biāo)志位為已啟動,轉(zhuǎn)步驟4.8;若不滿足則直接轉(zhuǎn)步驟4.8;
4.8. k=k+l;轉(zhuǎn)步驟4.7;
4.9. 若第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.12;否則執(zhí)行步驟4.10;
4.10. 根據(jù)地址產(chǎn)生控制器中的地址訪問軟硬件混合指令存儲器。若地址產(chǎn)生控制器 中的地址是軟件管理靜態(tài)存儲器的地址,則計(jì)算簇從軟件管理靜態(tài)存儲器中讀取對應(yīng)的 指令;若是硬件管理的cache地址,則轉(zhuǎn)步驟4.11;
4.11. 若cache失效,則硬件預(yù)取部件請求從片外存儲器中加載涼代碼,寫入硬件管 理的cache;若cache命中,計(jì)算簇從硬件管理的cache存儲體中讀取對應(yīng)的指令;轉(zhuǎn)步 驟4.9;4.12Jon且第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.13,否則轉(zhuǎn)步驟4.12; 4.13.j=j+l;若j〉n,則程序執(zhí)行結(jié)束;否則轉(zhuǎn)步驟4.2。
采用本發(fā)明可以達(dá)到以下技術(shù)效果
1. 采用硬件管理的cache存儲當(dāng)前執(zhí)行kernel的kernel涼代碼,相對于純軟件管理的 指令存儲器,減少了其他非活躍kernel (非當(dāng)前執(zhí)行的kernel)的涼代碼對存儲空間的長 期占用,從而減少了存儲器容量的需求,減少了指令存儲器在芯片中的面積消耗;
2. 本發(fā)明采用硬件管理的cache存儲當(dāng)前執(zhí)行kernel的kernel涼代碼,并通過硬件預(yù) 取等方法提高了涼代碼的命中率。這是因?yàn)槌绦蛴许樞驁?zhí)行的特性,當(dāng)某條指令被執(zhí)行 之后,若不出現(xiàn)跳轉(zhuǎn)指令,則后續(xù)指令肯定被執(zhí)行。因此,當(dāng)某條指令發(fā)生失效,將其 后續(xù)的若干條指令一并取入cache中,可以減少后續(xù)指令失效。由于流處理器中運(yùn)算單 元很多,分支操作通常會被轉(zhuǎn)化為選擇操作執(zhí)行,即將分支操作的兩條路徑都執(zhí)行,然 后對根據(jù)分支條件對二者的結(jié)果進(jìn)行選擇。這樣減少了流應(yīng)用程序中的跳轉(zhuǎn)指令;另外, kernel涼代碼中的循環(huán)跳轉(zhuǎn)要遠(yuǎn)少于整個(gè)kernel中的循環(huán)跳轉(zhuǎn),因此在cache中增加硬件 預(yù)取功能對提高kernel的命中率有明顯的效果。
3. 本發(fā)明采用軟件管理靜態(tài)存儲器保證了 kernel熱代碼不失效,帶預(yù)取功能的硬件管 理的cache提高了涼代碼的命中率,從而保證了整個(gè)kernel指令的高命中率;對kernel 熱代碼和kernel涼代碼的分別存儲減少了非活躍kernel的涼代碼對存儲空間的長期占用, 從而減少了存儲器容量的需求;因此,本發(fā)明在保證指令高命中率的情況下降低了對指 令存儲器容量的需求,從而提高了指令存儲器的利用率,減少了存儲器的資源消耗。
圖l是本發(fā)明總體流程圖。
圖2是本發(fā)明第一步設(shè)計(jì)的軟硬件混合指令存儲器結(jié)構(gòu)圖。
圖3是本發(fā)明第二步對含有n個(gè)kernel的應(yīng)用程序kernel熱代碼査找方法流程圖。 圖4是本發(fā)明第四步采用本發(fā)明時(shí)含n個(gè)kernel的應(yīng)用程序運(yùn)行過程示意圖。 圖5是本發(fā)明指令在存儲器中空間占用示意圖。 圖6是采用本發(fā)明后kernel運(yùn)行時(shí)間及指令存儲器資源消耗比較。
具體實(shí)施例方式
圖l是本發(fā)明的總體流程圖。
第一步,將流處理器中純軟件管理的指令存儲器修改為軟硬件混合指令存儲器。軟 硬件混合指令存儲器由軟件管理靜態(tài)存儲器和硬件管理的cache兩部分組成。如圖2所7K。
第二步,在編譯器中增加kernel熱代碼查找模塊,由kernel熱代碼查找模塊査找kernel 熱代碼,査找方法流程如圖3所示。
第三步,在流級編譯時(shí),在各個(gè)kernel熱代碼之前添加指令流加載指令。 第四步,將程序指令裝載到軟硬件混合指令存儲器,啟動程序運(yùn)行。程序運(yùn)行過程 和軟硬件混合指令存儲器讀/寫操作的流程如圖4所示。
圖2是本發(fā)明第一步設(shè)計(jì)的軟硬件混合指令存儲器結(jié)構(gòu)圖。設(shè)計(jì)方法如下 l丄軟件管理靜態(tài)存儲器與地址產(chǎn)生控制器、片外存儲器和計(jì)算簇相連,它從片外存 儲器獲得程序中的kernel熱代碼,即流控制器根據(jù)從地址產(chǎn)生控制器獲得的寫地址將各 kernel熱代碼由片外存儲器寫入軟件管理靜態(tài)存儲器;程序執(zhí)行時(shí),軟件管理靜態(tài)存儲器 給計(jì)算簇提供數(shù)據(jù),即計(jì)算簇根據(jù)地址產(chǎn)生控制器中的讀地址從軟件管理靜態(tài)存儲器中 讀取kernel熱代碼。
軟件管理靜態(tài)存儲容量設(shè)定為流處理器中原有的靜態(tài)指令存儲器容量的一半。通過 査找典型應(yīng)用中的kernel熱代碼,發(fā)現(xiàn)kernel熱代碼量通常為原程序指令代碼量的一半 左右,所以靜態(tài)指令存儲器的容量減小為原來容量的一半。
1.2.硬件管理的cache是一個(gè)直接映射的經(jīng)典cache,包括存儲體、Tag存儲器和cache 控制器三個(gè)部分。
存儲體與cache控制器、片外存儲器和計(jì)算簇相連。存儲體從片外存儲器獲得程序 中的kernel涼代碼,即流控制器將kernel涼代碼從片外存儲器寫入cache控制器指定的 存儲體的地址;程序執(zhí)行時(shí),硬件管理的cache向計(jì)算簇提供kernel涼代碼,即計(jì)算簇 根據(jù)cache控制器產(chǎn)生的kernel涼代碼的讀地址,從存儲體中讀取kernel涼代碼。
Tag存儲器與cache控制器相連。在kernel涼代碼導(dǎo)入存儲體時(shí),cache控制器根據(jù) 涼代碼中指令的寫地址解析出對應(yīng)的Tag位和Tag存儲器寫地址,根據(jù)Tag存儲器寫地 址將Tag位寫入Tag存儲器;在計(jì)算簇從存儲體中讀取kernel涼代碼中的指令時(shí),cache 控制器根據(jù)指令讀地址解析出與其對應(yīng)的Tag存儲器讀地址,根據(jù)該讀地址從Tag存儲 器讀取對應(yīng)Tag位。
cache控制器與地址產(chǎn)生控制器、Tag存儲器和存儲體相連。當(dāng)計(jì)算簇從存儲體讀取 指令時(shí),cache控制器從地址產(chǎn)生控制器獲取指令讀地址,根據(jù)指令讀地址解析出存儲體 讀地址、指令對應(yīng)的Tag位和Tag存儲器讀地址。根據(jù)存儲體讀地址從存儲體中讀出指 令,根據(jù)Tag存儲器讀地址從Tag存儲器中讀取對應(yīng)的Tag位。將指令對應(yīng)的Tag位與從Tag存儲器中讀出的Tag位進(jìn)行比較,若二者相等,則表示cache命中,存儲體中讀取 的指令有效;若二者不相等,則表示cache失效,存儲體中讀取的指令無效。cache控制 器中包含一個(gè)硬件預(yù)取部件,當(dāng)cache失效時(shí),硬件預(yù)取部件向片外存儲器發(fā)cache取指 令請求,請求將失效指令以及失效指令后續(xù)的若干條指令一并寫入存儲體。硬件預(yù)取有 很多種方式,最常見的是采用cache行預(yù)取,即一次cache寫操作寫入一個(gè)cache行,一 個(gè)cache行內(nèi)包含多條指令。當(dāng)cache取指令請求被片外存儲器響應(yīng)后,地址產(chǎn)生控制器 將cache寫地址送入cache控制器,cache控制器根據(jù)指令寫地址解析出該指令對應(yīng)的存 儲體寫地址、Tag存儲器寫地址和指令對應(yīng)的Tag位,根據(jù)存儲體寫地址將指令寫入存儲 體,根據(jù)Tag存儲器寫地址將Tag位寫入Tag存儲器。
硬件管理的cache的存儲體大小通常為2的整數(shù)次冪(cache訪問地址是由片外存儲 器地址截位而得,所以2的整數(shù)次冪方便地址變換)。因?yàn)閗ernel大小一般不會超過1024 條VLIW, kernel涼代碼通常不會超過kernel大小的一半,所以存儲體的容量通常為512 條VLIW。若流處理器是專門面向某類應(yīng)用,也可以根據(jù)該類應(yīng)用的特征對其容量進(jìn)行 定制。
圖3是本發(fā)明第二步對含有n個(gè)kernel的應(yīng)用程序kernel熱代碼査找方法流程圖。。 對于含有n個(gè)kernel的應(yīng)用程序,kernel熱代碼查找模塊的流程是 2丄令i的初始值為1;
2.2. 提取第i個(gè)kernel中各層循環(huán)的長度和除最外層循環(huán)外所有循環(huán)的循環(huán)次數(shù),即 Li、 L2、 L3、 C2、 C3的值。
L2和L3的值為由外到內(nèi)三層循環(huán)的長度,由編譯器通過解析循環(huán)指令的循環(huán)跳 轉(zhuǎn)的范圍得到,C2、 C3為第二、第三層的循環(huán)次數(shù),其值根據(jù)應(yīng)用的特征而定。在流應(yīng) 用中,循環(huán)的次數(shù)與輸入數(shù)據(jù)流的長度密切相關(guān)。對于典型的流應(yīng)用(如視頻編碼、圖 像搜索等),輸入流的大小在絕大多數(shù)情況下是可預(yù)知的(如一幀圖像的大小是確定的), 因此C2、 C3的值通過kernel的輸入流的長度除以每次循環(huán)處理數(shù)據(jù)的個(gè)數(shù)來確定。在極 少數(shù)特殊應(yīng)用中,少數(shù)kernel的輸入流的不定長會造成C2或C3不可預(yù)知。對<:2或<:3 不可預(yù)知的情況要分別進(jìn)行處理;
2.3. 若C2不可預(yù)知,標(biāo)記第一層循環(huán)為kernel熱代碼,轉(zhuǎn)步驟2.5;若C2可預(yù)知但 C3不可預(yù)知,轉(zhuǎn)步驟2.4;若C2和C3都可預(yù)知,利用定理3判斷第三層循環(huán)是否為kernel 熱代碼,方法如下計(jì)算P尸(CrlHL3/L2)、 P2:
*C, 、
(丄2—Z3) + £3C:
若P!>4且P2>
,則將第三層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則轉(zhuǎn)
步驟2.4;
2.4.利用定理1和定理2査找kernel熱代碼,方法如下
計(jì)算P-((W(L2/Lj);
若P〉4,則將第二層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則標(biāo)記第一層循環(huán)為 kernel熱代碼,轉(zhuǎn)步驟2.5;
i=i+l,若i〉n,則kernel熱代碼查找完畢,轉(zhuǎn)入第三步;否則轉(zhuǎn)步驟2.2。 圖4是本發(fā)明第四步采用本發(fā)明時(shí)含n個(gè)kernel的應(yīng)用程序運(yùn)行過程示意圖。 4丄令j的初始值等于l;
4.2. 查詢第j個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的狀態(tài),若啟動標(biāo)志位 為未啟動則轉(zhuǎn)步驟4.3;若已啟動但完成標(biāo)志位指示為未完成則轉(zhuǎn)步驟4.5;若完成標(biāo)志 位為已完成則轉(zhuǎn)步驟4.6;
4.3. 判斷第j個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的指令相關(guān)性是否滿 足,若滿足則轉(zhuǎn)步驟4.4,否則程序執(zhí)行終止,輸出"系統(tǒng)異常"。
當(dāng)輪到第j個(gè)kernel執(zhí)行時(shí),它的kernel熱代碼對應(yīng)的指令流加載指令的相關(guān)性必 須得到滿足,這是由編譯器保證的。若得不到滿足,則表示出現(xiàn)了系統(tǒng)異常。
4.4. 啟動第j個(gè)kernel的指令流加載指令,修改該指令的啟動標(biāo)志位為已啟動。由地 址產(chǎn)生控制器執(zhí)行該指令流加載指令獲取軟件管理靜態(tài)存儲器起始地址和指令流的長 度,將第j個(gè)kernel的kernel熱代碼從外部存儲器寫入軟件管理靜態(tài)存儲器;
4.5. 等待第j個(gè)kernel的kernel熱代碼寫入軟件管理靜態(tài)存儲器,當(dāng)?shù)趈個(gè)kernel的 kernel熱代碼全部寫入軟件管理靜態(tài)存儲器,將第j個(gè)kernel的指令流加載指令的完成標(biāo) 志位修改為已完成;
4.6. 令k,+l,啟動第j個(gè)kernel運(yùn)行,執(zhí)行步驟4.7 4.8;同時(shí)導(dǎo)入后續(xù)kernel的 kernel熱代碼,執(zhí)行步驟4.9 4.11;
在第j個(gè)kernel執(zhí)行時(shí),同時(shí)導(dǎo)入后續(xù)kernel的kernel熱代碼,實(shí)現(xiàn)計(jì)算和存儲操 作的重疊執(zhí)行,從而提高程序執(zhí)行的效率。4.7. 若k>n,轉(zhuǎn)步驟4.12;若k^n,判斷第k個(gè)kernel的kernel熱代碼對應(yīng)的指令流 加載指令的指令相關(guān)性是否滿足,若滿足則啟動第k個(gè)kernel的指令流加載指令,修改 該指令的啟動標(biāo)志位為己啟動,轉(zhuǎn)步驟4.8;若不滿足則直接轉(zhuǎn)步驟4.8;
4.8. k=k+l;轉(zhuǎn)步驟4.7;
4.9. 若第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.12;否則執(zhí)行步驟4.10;
4.10. 根據(jù)地址產(chǎn)生控制器中的地址,訪問軟硬件混合指令存儲器。若地址產(chǎn)生控制 器中的地址是軟件管理靜態(tài)存儲器的地址,則計(jì)算簇從軟件管理靜態(tài)存儲器中讀取對應(yīng) 的指令;若是硬件管理的cache地址,則轉(zhuǎn)步驟4.11;
4.11. 若cache失效,則啟動硬件預(yù)取機(jī)制,從片外存儲器中加載涼代碼,寫入硬件 管理的cache;若cache命中,計(jì)算簇從硬件管理的cache存儲體中讀取對應(yīng)的指令;轉(zhuǎn) 步驟4.9;
4.12. k〉n且第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.13,否則轉(zhuǎn)步驟4.12;
4.13. j=j+l;若j〉n,則程序執(zhí)行結(jié)束;否則轉(zhuǎn)步驟4.2。
圖5是本發(fā)明指令在存儲器中空間占用示意圖。左圖是指令在現(xiàn)有大多數(shù)流處理器 采用的純軟件指令存儲器中的空間占用示意圖,右圖是指令在本發(fā)明的軟硬件混合指令 存儲器中空間占用示意圖??梢钥闯?,在純軟件指令存儲器中,多個(gè)kernel的所有指令 都同時(shí)存儲于指令存儲器中,所有的kernel涼代碼在kernel的整個(gè)生命周期中都會一直 占用存儲空間,直到kernel結(jié)束才會釋放存儲空間。由于kernel涼代碼在kernel的整個(gè) 生命周期中很少被訪問,這使得指令存儲器的利用率降低。在本發(fā)明的軟硬件混合指令 存儲器中,kernel熱代碼都存儲于軟件管理靜態(tài)存儲器,以保證其命中率。硬件管理的 cache中只存儲當(dāng)前執(zhí)行kernel的kernel涼代碼,這種設(shè)計(jì)減少了 kernel涼代碼對片上指 令存儲器存儲空間的占用,減少了應(yīng)用對存儲器容量的需求,減少了存儲器的資源消耗。
圖6是采用本發(fā)明后kernel運(yùn)行時(shí)間及指令存儲器資源消耗比較。以MASA流處理 器為平臺,分別采用本發(fā)明軟硬件混合管理指令存儲器、純軟件管理靜態(tài)存儲器和純硬 件管理的cache作為指令存儲器,比較6個(gè)應(yīng)用程序在這三種結(jié)構(gòu)下kernel運(yùn)行時(shí)間及 指令存儲器資源消耗。純軟件管理的靜態(tài)存儲器和純硬件管理的cache容量都為2048條 VLIW,本發(fā)明的存儲器容量由兩部分組成軟件管理靜態(tài)存儲器為1024條VLIW,硬 件管理的cache為512條VLIW,比純軟件管理的靜態(tài)存儲器和純硬件管理的cache的容 量小512條VLIW。
分別采用上述三種存儲器作為MASA流處理器的指令存儲器,將RS、 SUSAN、LUCAS、 Ygx2、 MPEG和H264等六個(gè)應(yīng)用程序分別在MASA流處理器上執(zhí)行,統(tǒng)計(jì)個(gè) 應(yīng)用程序的執(zhí)行時(shí)間,并將所有的執(zhí)行時(shí)間對釆用純軟件管理靜態(tài)存儲器作為指令存儲 器的MASA的執(zhí)行時(shí)間進(jìn)行歸一操作,即所有的執(zhí)行時(shí)間都除以在純軟件管理的靜態(tài)存 儲器下對應(yīng)的執(zhí)行時(shí)間,得到如圖6中的柱狀圖。.
利用HP公司公布的存儲器評測軟件cacti獲得三種存儲器的資源消耗,并將所有資 源消耗值對采用純軟件管理靜態(tài)存儲器作為指令存儲器的資源消耗進(jìn)行歸一操作,得到 如圖6中的折線圖。
可以看出,采用本發(fā)明,雖然有些應(yīng)用的執(zhí)行時(shí)間增加了少許,但指令存儲器的資 源消耗減少了很多。
權(quán)利要求
1.一種減少流處理器片上指令存儲器資源消耗的方法,其特征在于包括以下步驟第一步,將流處理器中純軟件管理的指令存儲器修改為軟硬件混合指令存儲器,軟硬件混合指令存儲器由軟件管理靜態(tài)存儲器和硬件管理的cache兩部分組成,設(shè)計(jì)方法如下1.1.軟件管理靜態(tài)存儲器與地址產(chǎn)生控制器、片外存儲器和計(jì)算簇相連,它從片外存儲器獲得程序中的kernel熱代碼,并在程序執(zhí)行時(shí)給計(jì)算簇提供數(shù)據(jù);1.2.硬件管理的cache包括存儲體、Tag存儲器和cache控制器三個(gè)部分,它從片外存儲器獲得程序中的kernel涼代碼;第二步,在編譯器中增加kernel熱代碼查找模塊,kernel熱代碼查找模塊的流程是2.1.令i的初始值為1;2.2.由編譯器通過解析循環(huán)指令的循環(huán)跳轉(zhuǎn)的范圍得到第i個(gè)kernel中由外到內(nèi)三個(gè)循環(huán)的長度L1、L2、L3,根據(jù)應(yīng)用的特征確定第二、第三層的循環(huán)次數(shù)C2、C3當(dāng)kernel的輸入流的大小預(yù)知時(shí),C2、C3的值通過輸入流的長度除以每次循環(huán)處理數(shù)據(jù)的個(gè)數(shù)來確定;當(dāng)kernel的輸入流不定長時(shí)C2或C3不可預(yù)知;2.3.若C2不可預(yù)知,標(biāo)記第一層循環(huán)為kernel熱代碼,轉(zhuǎn)步驟2.5;若C2可預(yù)知但C3不可預(yù)知,轉(zhuǎn)步驟2.4;若C2和C3都可預(yù)知,判斷第三層循環(huán)是否為kernel熱代碼,方法是計(jì)算P1=(C3-1)*(L3/L2)、<maths id="math0001" num="0001" ><math><![CDATA[ <mrow><msub> <mi>P</mi> <mn>2</mn></msub><mo>=</mo><mfrac> <msub><mi>L</mi><mn>2</mn> </msub> <mrow><msub> <mi>L</mi> <mn>1</mn></msub><mo>-</mo><msub> <mi>L</mi> <mn>2</mn></msub> </mrow></mfrac><mo>*</mo><msub> <mi>C</mi> <mn>2</mn></msub> </mrow>]]></math> id="icf0001" file="A2009100438280002C1.tif" wi="32" he="10" top= "179" left = "135" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/></maths>、<maths id="math0002" num="0002" ><math><![CDATA[ <mrow><mi>h</mi><mo>=</mo><mfrac> <mrow><msub> <mi>L</mi> <mn>3</mn></msub><mrow> <mo>(</mo> <msub><mi>C</mi><mn>3</mn> </msub> <mo>-</mo> <mn>1</mn> <mo>)</mo></mrow> </mrow> <mrow><mrow> <mo>(</mo> <msub><mi>L</mi><mn>2</mn> </msub> <mo>-</mo> <msub><mi>L</mi><mn>3</mn> </msub> <mo>)</mo></mrow><mo>+</mo><msub> <mi>L</mi> <mn>3</mn></msub><msub> <mi>C</mi> <mn>3</mn></msub> </mrow></mfrac><mo>,</mo> </mrow>]]></math> id="icf0002" file="A2009100438280002C2.tif" wi="36" he="10" top= "198" left = "24" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/></maths>若P1>4且<maths id="math0003" num="0003" ><math><![CDATA[ <mrow><msub> <mi>P</mi> <mn>2</mn></msub><mo>></mo><mfrac> <mrow><mfrac> <mn>1</mn> <mi>h</mi></mfrac><mo>-</mo><mn>1</mn> </mrow> <mrow><mn>1.25</mn><mo>-</mo><mfrac> <mn>1</mn> <mi>h</mi></mfrac> </mrow></mfrac><mo>,</mo> </mrow>]]></math> id="icf0003" file="A2009100438280002C3.tif" wi="23" he="18" top= "193" left = "84" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/></maths>則將第三層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則轉(zhuǎn)步驟2.4;2.4.查找kernel熱代碼,方法是計(jì)算P=(C2-1)*(L2/L1),若P>4,則將第二層循環(huán)標(biāo)記為kernel熱代碼,轉(zhuǎn)步驟2.5;否則標(biāo)記第一層循環(huán)為kernel熱代碼,轉(zhuǎn)步驟2.5;2.5.i=i+1,若i>n,n為應(yīng)用程序中含有的kernel個(gè)數(shù),轉(zhuǎn)第三步;否則轉(zhuǎn)步驟2.2;第三步,在流級編譯時(shí),在各個(gè)kernel熱代碼之前添加指令流加載指令,該指令格式為StreamLoad<啟動標(biāo)志位 完成標(biāo)志位 起始地址 流長度 指令相關(guān)性>啟動標(biāo)志位表示該指令是否已經(jīng)啟動,完成標(biāo)志位表示該指令是否已經(jīng)完成,起始地址和流長度信息指定了kernel熱代碼在軟件管理靜態(tài)存儲器中的空間分配,指令相關(guān)性包含了本條指令與它之前其他指令的相關(guān)性信息,當(dāng)所有相關(guān)性都得到滿足,本條指令流加載指令才能被啟動執(zhí)行;第四步,將應(yīng)用程序裝載到軟硬件混合指令存儲器,啟動程序運(yùn)行,程序運(yùn)行過程和軟硬件混合指令存儲器讀/寫操作的流程如下4.1.令j的初始值等于1;4.2.查詢第i個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的狀態(tài),若未啟動則轉(zhuǎn)步驟4.3,若未完成則轉(zhuǎn)步驟4.5,若已完成則轉(zhuǎn)步驟4.6;4.3.判斷kernel j的kernel熱代碼對應(yīng)的指令流加載指令的相關(guān)性是否滿足,若滿足則轉(zhuǎn)步驟4.4,否則程序執(zhí)行終止,輸出“系統(tǒng)異?!?;4.4.啟動第j個(gè)kernel的指令流加載指令,修改該指令的啟動標(biāo)志位為已啟動,由地址產(chǎn)生控制器執(zhí)行該指令流加載指令,獲取軟件管理靜態(tài)存儲器起始地址和指令流的長度,將第j個(gè)kernel的kernel熱代碼從外部存儲器寫入軟件管理靜態(tài)存儲器;4.5.等待第j個(gè)kernel的kernel熱代碼寫入軟件管理靜態(tài)存儲器,當(dāng)?shù)趈個(gè)kernel的kernel熱代碼全部寫入軟件管理靜態(tài)存儲器,將第j個(gè)kernel的指令流加載指令的完成標(biāo)志位修改為已完成;4.6.令k=j(luò)+1,啟動第j個(gè)kernel運(yùn)行,執(zhí)行步驟4.7~4.8;同時(shí)導(dǎo)入后續(xù)kernel的kernel熱代碼,執(zhí)行步驟4.9~4.11;4.7.若k>n,轉(zhuǎn)步驟4.12;若k≤n,判斷第k個(gè)kernel的kernel熱代碼對應(yīng)的指令流加載指令的指令相關(guān)性是否滿足,若滿足則啟動第k個(gè)kernel的指令流加載指令,修改該指令的啟動標(biāo)志位為已啟動,轉(zhuǎn)步驟4.8;若不滿足則直接轉(zhuǎn)步驟4.8;4.8.k=k+1;轉(zhuǎn)步驟4.7;4.9.若第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.12;否則執(zhí)行步驟4.10;4.10.若地址產(chǎn)生控制器中的地址是軟件管理靜態(tài)存儲器的地址,則計(jì)算簇從軟件管理靜態(tài)存儲器中讀取對應(yīng)的指令;若是硬件管理的cache地址,則轉(zhuǎn)步驟4.11;4.11.若cache失效,則硬件預(yù)取部件請求從片外存儲器中加載涼代碼,寫入硬件管理的cache;若cache命中,計(jì)算簇從硬件管理的cache存儲體中讀取對應(yīng)的指令,轉(zhuǎn)步驟4.9;4.12.k>n且第j個(gè)kernel執(zhí)行完畢,轉(zhuǎn)步驟4.13,否則轉(zhuǎn)步驟4.12;4.13.j=j(luò)+1;若j>n,則程序執(zhí)行結(jié)束;否則轉(zhuǎn)步驟4.2。
2. 如權(quán)利要1所述的一種減少流處理器片上指令存儲器資源消耗的方法,其特 征在于所述軟件管理靜態(tài)存儲容量設(shè)定為流處理器中原有的靜態(tài)指令存儲器 容量的一半。
3. 如權(quán)利要1所述的一種減少流處理器片上指令存儲器資源消耗的方法,其特 征在于如果kernel中某個(gè)循環(huán)的所有指令不失效能保證kernel中最外層循環(huán) 80%以上的指令不失效,則這個(gè)循環(huán)為kernel熱代碼,kernel中其他指令為 kernel涼代碼。
4. 如權(quán)利要1所述的一種減少流處理器片上指令存儲器資源消耗的方法,其特 征在于所述硬件管理的cache中的存儲體與cache控制器、片外存儲器和計(jì)算 簇相連,存儲體從片外存儲器獲得程序中的kernel涼代碼,并在程序執(zhí)行時(shí) 向計(jì)算簇提供kernel涼代碼;Tag存儲器與cache控制器相連,在kernel涼代 碼導(dǎo)入存儲體時(shí),cache控制器根據(jù)涼代碼中指令的寫地址解析出對應(yīng)的Tag 位和Tag存儲器寫地址,根據(jù)Tag存儲器寫地址將Tag位寫入Tag存儲器; 在計(jì)算簇從存儲體中讀取kernel涼代碼中的指令時(shí),cache控制器根據(jù)指令讀 地址解析出與其對應(yīng)的Tag存儲器讀地址,根據(jù)該讀地址從Tag存儲器讀取 對應(yīng)Tag位;cache控制器與地址產(chǎn)生控制器、Tag存儲器和存儲體相連,當(dāng) 計(jì)算簇從存儲體讀取指令時(shí),cache控制器從地址產(chǎn)生控制器獲取指令讀地 址,根據(jù)指令讀地址解析出存儲體讀地址、指令對應(yīng)的Tag位和Tag存儲器 讀地址,根據(jù)存儲體讀地址從存儲體中讀出指令,根據(jù)Tag存儲器讀地址從 Tag存儲器中讀取對應(yīng)的Tag位;將指令對應(yīng)的Tag位與從Tag存儲器中讀出的Tag位進(jìn)行比較,若二者相等,則表示cache命中,存儲體中讀取的指 令有效;若二者不相等,則表示cache失效,存儲體中讀取的指令無效;cache 控制器中包含一個(gè)硬件預(yù)取部件,當(dāng)cache失效時(shí),硬件預(yù)取部件向片外存 儲器發(fā)cache取指令請求,請求將失效指令以及失效指令后續(xù)的若干條指令 一并寫入存儲體;當(dāng)cache取指令請求被片外存儲器響應(yīng)后,地址產(chǎn)生控制 器將cache寫地址送入cache控制器,cache控制器根據(jù)指令寫地址解析出該 指令對應(yīng)的存儲體寫地址、Tag存儲器寫地址和指令對應(yīng)的Tag位,根據(jù)存 儲體寫地址將指令寫入存儲體,根據(jù)Tag存儲器寫地址將Tag位寫入Tag存 儲器。
全文摘要
本發(fā)明公布了一種減少流處理器片上指令存儲器資源消耗的方法,要解決的技術(shù)問題基于現(xiàn)有成熟的硬件存儲器結(jié)構(gòu),不增加復(fù)雜的編譯算法,有效減少指令存儲器的資源消耗。技術(shù)方案是將流處理器中純軟件管理的指令存儲器修改為軟硬件混合指令存儲器;在編譯器中增加kernel熱代碼查找模塊,根據(jù)判定熱代碼的定理查找流應(yīng)用中的kernel熱代碼;且在流級編譯時(shí),在各個(gè)kernel熱代碼之前添加指令流加載指令;采用軟件管理靜態(tài)存儲器存儲kernel熱代碼以保證其高命中率,采用硬件管理的cache存儲其他指令,通過縮短指令占用指令存儲器的時(shí)間來減少指令存儲器對存儲器容量的需求,從而可以減少指令存儲器的容量。采用本發(fā)明能減少指令存儲器在芯片中的資源消耗。
文檔編號G06F9/38GK101620526SQ200910043828
公開日2010年1月6日 申請日期2009年7月3日 優(yōu)先權(quán)日2009年7月3日
發(fā)明者巨 任, 楠 伍, 義 何, 偉 吳, 張春元, 梅 文, 李京旭, 楊乾明, 俊 柴, 管茂林, 荀長慶 申請人:中國人民解放軍國防科學(xué)技術(shù)大學(xué)