如何使用DSP的cache(轉)


C6747在執行一塊算法的執行時間在114ms左右,需求要20ms以下。6000屬於分層存儲器體系架構,內部RAM跟CPU不同頻運行,只有cache使能才跟CPU同頻。可能是cache沒打開。下面轉載一遍文章。非常感謝原創。

    處理器中的cache是存放於處理器四周的高速存儲器,它可以用來保存運算處理時的一些共有的指令,從而加速運算的速度。
在本文中,將比較cache存儲器和系統中的普通的存儲器,隨后將先容cache的一些基本理論和基本術語,以及在高速處理器結構中cache的重要性。以TI的TMS320C64x DSP結構為基礎,將着重向開發者先容cache是如何工作,如何配置,以及如何正確使用cahce,本文將以cache的一致性貫串全文。

存儲器結構
在圖一中,左邊的模塊先容了普通的存儲器系統結構,CPU和內部存儲器均工作在300MHZ。當CPU訪問外部存儲器時,將不會發生存儲器訪問禁止的情況。並且當訪問內部存儲器時也不會發生訪問延遲的情況。
當CPU的時鍾增加到600MHZ時,只有當存儲器的速度也增加到600MHZ時才不會發生訪問等待的狀態。很不幸,對於大多數情況下同樣頻率工作在600MHZ的內部存儲器價格將十分昂貴。而300MHZ的也不是好的選擇,由於將大幅降低CPU的頻率。設想一個算法需要在每個周期訪問存儲器,每一次對存儲器的訪問需等待一個周期,加倍了訪問周期從而抵消了CPU的雙倍工作頻率。

 

                                                               image

                                                                        圖一:普通存儲器和多層存儲器結構

 

      解決的辦法就是采用一個多層次的存儲器。最靠近CPU的存儲器由一塊速度快但體積小組成,訪問時不存在任何延遲。稍闊別一些CPU的采用體積大但速度稍慢的存儲器。對於低級別的存儲器來說,最靠近CPU的這塊存儲器便是典型的cache存儲器位置法則 當然,這個解決辦法必須工作在CPU能夠最快訪問最近的存儲器的情況時。由於位置法則,對於大多數CPU來說這一情況都是適用的。這意為着在一個特定的窗口時間內,程序僅僅訪問全部地址空間的一塊相關的小區域。這包括一下兩個基本的位置種類:
1、空間位置法則:一塊剛剛被訪問過的資源四周的資源更有可能被訪問
2、時間位置法則:在過往的一個時間點剛剛被訪問的資源更有可能馬上在將來被訪問
     空間位置法則是由計算機程序的編程風格所決定的,一般情況下,相關的數據將被連續的存儲在存儲器中。例如一個共同的類型在計算時,總是將第一個元素放在第一列,然后是第二個元素,以此類推。同理,時間位置法則形成的原因是程序包含的結構比如循環結構調用的是相同的指令(甚至是同樣的數據),以此反復。
圖二闡述了空間位置法則,它描述了一個6階FIR濾波器。為了計算y[0]輸出,將從輸進數據緩存x[](值由預算法則對內存中訪問的采樣數據決定)里讀出6個采樣數據。當完成一次數據訪問時,cache控制器從內存中取出x[0]和一系列的取樣值地址。這個一系列的地址值稱為cache 串。假如再從低速率的存儲器中取出數據串將導致一些CPU的延遲周期。這樣做的目的是而當進行以下計算時,鄰近x[0]的這些數占有可能馬上將被訪問。而對於FIR濾波器來說正好適用這個原則,由於接着的五個采樣數值(x[1]-x[5])馬上將被訪問。這五個數值的訪問過程將進進到cache中完成而不是在低速率的存儲器中進行,因而不會產生任何延遲周期。

                                                                                              圖二:位置原則

當計算下一個輸出y[1]時,五個抽樣值(x[1]-x[5]) 將被再次使用,只有一個抽樣值(x[6])是新的。所有的抽樣值已經提取到cache中,CPU不會發生任何的延遲。這個早先使用過的數據在數據處理中再次被用到的例子很好的說明了時間位置原則。
cache是以局部時間地和空間地訪問數據為基礎的。因此極大的降低了對低速率的存儲器訪問,盡大多數數據訪問都由高速cache存儲器以CPU的工作頻率服務於CPU。
存儲器數率:
cache系統代表性的包括三種級別
1、第一級cache (L1)位於CPU芯片上並且運算快於CPU工作速度。
2、第二級cache(L2)也位於芯片上比L1速度慢而體積大。
3、第三級cache(L3)位於CPU外部,是速度最慢體積最大的存儲器。
每一級別的cahce相應執行的因素決定於cache間隔處理器的間隔。表一中體現了一個有代表性的各自相應的時間。

 

                                                                                 圖三:在一個2ns時鍾周期的具有多級cache系統的處理器cache執行時間

 

    當運算器需要從存儲器中提取數據時,它首先在最高級的cache中尋找然后在次高級的cache中尋找。假如在cache中找到,則稱為命中。反之,則稱為不命中。
一個cache系統的性能決定於cache申請命中的次數,也稱為命中率。對於一個特定的級別的cache來說,一個高的cache命中率意為着更高的性能。而整個cahce系統的性能決定於各級cache的命中率。比如一個cache系統第一級 L1 cache命中率為70%,第二級L2cache命中率為20%,第三級L3cache命中率為5%,整個存儲器的為5%,因此基於圖三這個系統的均勻存儲器性能為:
(0.7 * 4) + (0.2 * 5) + (0.05 * 30) + (0.05 * 220) = 16.30 ns
為了闡述這個概念,我們以TI的TMS320C64x DSP 存儲器結構為例,(表四)包含了一個兩級內部cache存儲器以及外部存儲器。L1cache可以被CPU無延遲的訪問。L2存儲器可被編程並且可分配為L2SRAM(可設地址的片上存儲器)和L2cache。無論何種設置中,L2存儲器都只能每兩個周期被訪問一次。L2的大小決定於芯片的不同,但總是比L1大的多。以TMS320C6454 DSP為例,L2的大小為1MByte。而C64x DSP 最多支持2GBytes 的外部存儲器。存儲器的速度決定於存儲器采用的技術種類,盡大多數在100MHZ左右。在圖三中,所有的cache和數據通道均自動的由cache控制器控制。

                                                                                        圖四:TMS320C64x Cache 存儲器結構

Cache的數據更新
    由於cache也是主存儲器中的一部分備份,因此cache是否能實時反映主存儲器的數據顯得至關重要。當cache里的數據改變,而主存儲器內的數據未能改變時,cache里的數據被稱為“臟”數據。當數據在主存儲中改變,而cache中未能實時改變,cache里的這個數據被稱為“延遲”數據。
cache控制器采用一系列的技術來維持cache的一致性從而保證cache里存儲的都是有用的信息而不是延遲數據。“監測”和“寫回”操縱便是兩種保持cache一致性的辦法。”監測“指的是用來答應cache在主存儲器中是否進行影響cache地址的傳輸。假如cache探測到有這樣的傳輸發生,它將及時更性自己從而匹配主存儲器。這個在主存儲器中復制數據的過程稱為”寫回“操縱。
由於cache比主存儲器體積小,因此經常會被填布滿。當此種情況發生時,所有搬到cache里面的新數據將會取代已經存在的數據。這里有多種決定數據取代的方法。例如隨機取代法、先進先出取代法、最近最少使用取代法。大多數的處理器采用的都是最近最少使用取代法。這樣可以是的最新的數據取代最近最少使用的數據。這種方法來源於時間位置法則。

直接映射cache
cache存儲器可以被設置為“直接映射”或者“聯合方式”。為了解釋這些術語,我們以圖四所示的C64X的L1Pcache為例,這些cache由512列32字節組成。每一排映射到一些固定的具有相識的存儲器地址上。比如:
從0000h 到 0019h的地址經常被cache安排在第0列
從0020h 到 0039h的地址經常被cache安排在第1列
從3FE0h 到 3FFFh 的地址經常被cache安排在第511列。
因此一旦我們需要獲得地址4000h,由於cache的容量被用盡了,因此從4000h 到 4019h的地址需要從新從第0列開始。

                                                                                  圖五:直接映射caches

為了保持復制的數據,每一行的L1Pcache包括: 
一位有效信號,用來指示cache的列中 是否包含的是有用的信息
一個標記符,其值即是地址的高18位,這個是必須的由於一個指定的列可能包含着不同地址的數據,比如,第0列可以包含的是從0000h 到 0019h的數據,也可以是從4000h 到 4019h的數據。 
一個可設置的數據,這個數據等同於從第5位到第13位的地址。對於直接映射方式,這個設置的數據同這個列的值是一樣的。而對於聯合方式時要更加復雜,這種情況我們將在隨后討論。
現在讓我們看看當CPU訪問位於0020h的地址時發生了什么。假定cache被完全無效,即意為着所有的列都沒有包含有效數據。當CPU發出對地址20h的訪問請求時,cache控制器開始首先在部分地址位(比如:從第5位到13位)等同於列地址的位置查詢。當這個部分地址值(從第5位到13位)被設置為1時,匹配需查詢的地址。控制器將繼續檢查第一列的標記位是否也和地址0020h 到 0039h的高18位相符合。當這些都完成時,將檢查有效數據位看cache保存的是否為有效數據。假如有效數據位為0時,cache控制器記錄一個不命中操縱。
這個不命中操縱將使得控制器將從存儲器中將此列的數據0020h-0039h讀進,並將該有效數據位設置為1。同時將部分地址值保存在標記符RAM中。取得的數據將被傳送到CPU中,完成訪問操縱。
假如這個0020h的地址被再次訪問,cache控制器將再次取得這個地址,檢查它的設置符和標記符。當有效數據位為1時,控制器將記錄一個命中操縱,因此cache列里面的數據也將被送到CPU中,完成整個訪問操縱。

聯合設置方式
聯合設置方式是直接映射方式的延續。在直接映射方式中,每一個設置只包含一列。而在聯合設置方式中,每一個設置包含多個列,被稱為多路方式。圖五中闡述了這樣一個聯合設置的cache,以C64x DSP's L1D為例。這是一個兩路的包含64個字節總共16KBytes容量的聯合設置cache。

 

為了保持數據,L1Dcache的每一列包含以下:
一個最近最少使用位用來指示哪些路最近很少被使用(這個在L1P中未被使用);
一個臟數據位,用來指示cache列是否匹配主存儲器的容量(這個在L1P中未被使用);
一個有效數據位,用來指示cache列中包含的是否是有效數據;
一個標記位,等價於地址的高18位;
一個設置數據,等價於地址的5到13位。

命中和不命中決定的方式和直接映射cache方式是一樣的。不同的是此時需要兩個標記位,一個標記位記錄是哪一路的請求數據。假如是第0路的數據被命中,則第0路的列中的數據被訪問,假如是第1路的數據被命中,則第1路的列中的數據被訪問。
假如兩路均不命中的話,數據將從內存中被指派。一個最近最少使用位將決定數據如何分配類似於一個開關操縱。假如被指派的第0列的最近最少使用位被設置為0,那么將把此數據分配於第一列。無論對這個cache列是讀還是寫的訪問,都將改變這個最近最少使用標記位。例如:假如第0路的列被讀取,則最近最少使用位將切換到1。由於最近最少使用位只記錄不命中操縱,但是它的狀態每次都會更新,無論對列訪問是命中還是不命中,讀或者寫。
對於L1P來說,L1D是一個讀分配的cache,不管新數據在內存中申請時讀操縱是命中或者不命中。在一個寫不命中操縱時,數據從寫存儲器傳遞到內存中,繞過L1Dcacee。在一個寫命中操縱時,數據寫進cache中而不是立即寫進內存。當數據被CPU寫訪問改變時,cache里的內容將提交給一個寫回cache,隨后數據將被寫進內存中。
臟數據位指示當cache里面的數據被寫操縱修改時,而修改后的新數據還未被寫進到主存儲器中。最初臟數據位將被賦值為0。一旦當CPU對某列進行寫操縱時,臟數據位將變為1。當此列被逐出cache時,這個數據將被寫回主存儲器中。當發生讀不命中操縱時新數據將從臟數據列中申請,這種情況才會發生。一個寫回命令將傳遞給cache控制器從而產生一個寫回操縱,只是這種情況並不經常發生。

優化cache性能
這里有三種不命中的情況:
必然不命中(也叫首次不命中):這種不命中發生在當數據第一次放進cache中,為了和下面兩種不命中方式區分開來,它們可以被避免。
沖突不命中:不命中發生在在該列在被重復使用之前被取代。
容量不命中:這種方式發生在當cache容量被耗盡時,容量不命中是沖突命中的一種方式。
對於每一種不命中方式,控制器在將數據從存儲器放進cache中時都會產生延遲。為了得到更高的性能,每一列中的內容在被取代之前應該盡可能的被重復利用。重復使用某列以此來獲得不同的位置能夠改善空間位置的訪問,而重復使用某列可以改善時間位置的訪問。這就是優化cache存儲

性能的一個最基本的准則。
例如,當cache存儲器經常被訪問時,cache的性能是比較高的。這種訪問模式在對下一列訪問之前將重復對上一列的訪問。例如,下面的代碼就

有一個很高的命中率:

   而下面的代碼的性能就如上一個,由於他的內存的訪問有一個很大幅度的跨越,這就意味着在對下一列訪問之前對上一列的訪問率就降低了。

    假如某一列被從cache里驅除而又需要重新訪問,這一列必須重新寫進cache。因此,如何避免這種驅除就變得非常重要,確定這種不命中的原因可以幫助我們避免下一次的不命中。
正如上面所說,容量不命中產生的原因是由於cache的容量小於主存儲器。假如發生容量不命中,最簡單的辦法就是加大cache的容量。例如,

C64x DSP上的L2cache可以被配置為cache和SRAM的混合體。假如有很多的容量不命中的情況,編程者可以將L2存儲器更多的申請為cache。另一種

解決辦法就是減少所需要的數據量。
    假如產生沖突不命中,關鍵在於重新編排數據的排列方式,從而使得最近時間數據能夠映射到其他路中。(對於直接映射方式,這個類似於將數據映射對應於不同的行中)改變存儲器的排列方式,可以使得數據位於存儲器中的不同位置,從而不會產生沖突。作為可選擇的,從一個硬件設計的角度,多設置方式可以產生多列的方式。因此,存儲器中映射於相同設置的兩列都可以在cache中被申請,而不會發生沖突。

 

      前面已多次提到了Cache,這可是一個討人喜歡的東西,您有必要詳細了解它的作用與原理。Cache是介於CPU與主內存之間、或者主內存與磁盤之間的高速緩沖器,其作用是解決系統中數據讀寫速度不匹配的問題。其中介於CPU與主內存之間的緩沖器又稱為RAM Cache,而介於主內存與磁盤驅動器之間的緩沖器則稱之為Disk Cache,這里要討論的是前者,也就通常簡稱的Cache。
那么,Cache是怎樣工作的呢?您一定明白CPU的運算速度比主內存的讀寫速度要快得多,這就使得CPU在訪問內存時要花很長的等待時間,從而造成系統整體性能的下降。為了解決這種速度不匹配的問題,需要在CPU與主內存之間加入比主內存更快的SRAM(Static Ram,靜態存儲器)。SRAM儲存了主內存中的數據(專業術語稱為“映象”),使CPU可以直接通過訪問SRAM來讀寫數據。由於SRAM的速度與CPU的速度相當,因而大大縮短了數據讀寫的等待時間,系統的整體速度也就得到了提高。既然SRAM那么快,為什么不用來作為主內存呢?這是因為SRAM采用了與CPU相類似的半導體制造工藝,成本極高,只有在那些只關心性能不考慮價格的場合才會這樣做。這也就使得Cache粉墨登場了,它能將CPU用過的數據,以及結果保存起來,讓CPU下次處理時先來訪問Cache,如果沒有可用的數據再去別處找,以此來提高運行速度。
Cache由標記存儲器和數據存儲器兩個基本部分組成。標記存儲器是用來儲存Cache的控制位與塊地址標簽,控制位用於管理Cache的讀寫操作,而塊地址標簽則記錄着Cache中各塊的地址。這個地址包含了與主內存映射的塊地址,並且都與Cache中的一塊“數據”相對應。而這塊“數據”正是貯存於Cache的數據存儲器中。當CPU讀取數據時,先通過地址總線把物理地址送到Cache中,與Cache中的塊地址標簽進行對比。若相符合,則表示此數據已經存在於Cache中(此情況被戲稱為“命中”),這時只需把Cache中的對應數據經由數據總線直接傳送給CPU即可。但如果CPU送來的物理地址無法與Cache中的塊地址標簽相符,則表明這一數據不在Cache中(稱為“失誤”),這時,需要由主內存把CPU所需的數據地址拷貝到Cache中,再由Cache把數據傳送給CPU。從這個過程我們可以看到,若CPU讀取“命中”,存取速度確實可以提高許多,但如果“失誤”,則Cache的存在反而減慢了CPU的讀取速度。因此,采用何種技術和方法提高讀寫命中率、減少失誤率,就成了Cache設計的關鍵。加大Cache的容量當然可以提高命中率,但因成本問題,Cache不可能無限增大,但可以通過采用適當的映射方式和塊替代方式來提高命中率。
所謂映射方式是指Cache中的數據如何與主內存中的數據相對應的問題。映射方式通常有以下三種:


1:直接映射
    如果主內存上的塊只能映射到Cache中的特定塊,我們稱這種映射方式為直接映射。直接映射的存取速度最快,但失誤率也最高。
2:完全映射
    在這種映射方式下,主內存上的塊可以映射到Cache的任意塊之中,當CPU欲讀取某一個塊時,Cache會把CPU送來的地址與Cache中的所有地址標簽進行對比。由於是完全對比,因此存取時間最長,但失誤率也最低。
3:結合映射
    這種映射方式是把Cache分成若干個頁面,每個頁面會有相同數目的塊。主內存中數據塊可以映射到Cache中指定頁面的任一塊中。這種映射方式可以看成是直接映射與完全映射的折衷,是效率最高的映射方式。
由上可見,結合映射方式最為理想,也是應用最為廣泛的映射方式。但由於Cache的容量比主內存要小得多,因此無論采用何種映射方式,失誤都在所難免。由於當CPU的存取出現“失誤”時,必須從主內存把相應的塊地址與數據寫入Cache中,若此時Cache已經飽和,寫入的數據必然會覆蓋掉Cache中原有的數據,這就是“塊替代”。那么,采用何種塊替代方式可以最大限度的減低失誤率呢?可以采用的方式又是什么呢?是這么三種:

1.先入先出,新寫入的塊取代最先存放到Cache中的舊塊。
2.隨機替代,新寫入的塊隨機地取代Cache中的舊塊。
3.最近、最不常用替代方式(LRU,Least Recent Used),新寫入的塊將取代Cache中最少被CPU訪問的舊塊。

不難看出,第三種方式的效率最高,能有效地降低失誤率,因此這也是目前大多數Cache所采用的塊替代方式。此外,在CPU的讀取操作中,Cache中的數據與主內存上的數據是一致的。但是當CPU向Cache寫入新的數據時,則會出現Cache與主內存之間數據不一致的情況。解決的方法有兩種:

1.寫通(Write through)

當CPU向Cache寫入數據時,同時也把數據寫入主內存,或同時把數據寫到一個緩沖器中,待CPU空閑時再把數據寫入主內存。此方式簡單可靠,但由於CPU每次寫入數據時都要同時對主內存的相應數據進行刷新,因而速度較慢。
2.寫回(Write back)
當CPU要進行寫入操作時,只把數據寫入Cache,而不直接寫入主內存。這時,Cache與主內存之間會出現暫時不一致的數據塊。當Cache中的不一致數據塊將要被替代時,再把數據寫回主內存,從而使Cache中的數據與主內存中的數據又再保持一致。在此方式下,需要在Cache中加入一個控制位(Dirty bit),若Cache中的某數據塊是由CPU寫入的,則控制位=1,否則控制位=0。發生塊替代時,Cache先檢查被替代塊的控制位,若控制位=0,則無需把內容寫回主內存,若控制位=1,則執行寫回操作。這樣做的好處是當CPU多次刷新同一數據塊時,只需把最后的結果寫回主內存即可,從而避免了重復寫入,因而具有較高的效率。在早期版本的BIOS中,用戶還可以對采用寫通方式還是寫回方式進行設置,但在新版本的BIOS中已取消了這一設置。


以上數據寫入都是由CPU執行的,但若是DMA的系統,由於其它設備也可能向主內存寫入數據,這時同樣會造成Cache中的數據與主內存數據不一致。所以,目前個人計算機系統大多采用了一種稱為Non-Cacheable Block(非可Cache塊)的解決方法。其原理是在主內存中開辟一塊專門的區域,所有對內存直接進行寫入操作的設備都只能把數據寫入該區域。同時,該區域中的內容不會被寫入Cache中,因此Cache中的數據與Non-Cacheable Block 中的數據互不干擾,也就不會發生不一致的情況。
注:DMI(Desktop Management Interface桌面管理接口)是用來讓系統保存自身及外圍設備相關資料的應用程序。通過DMI可以在操作系統級查詢系統配置信息,而不用進入BIOS,包括CPU、內存、I/O擴充插槽等。DMI可以將上述資料存儲在BIOS中的特定位置,也可以利用DMI對資料庫中系統配置情況作出修改以適應不同環境的系統需求。主板上的BIOS會盡可能地收集系統信息,將它存在主板上Flash EPROM中一個4K的小塊中,DMI可以恢復數據庫中的系統信息―這個數據庫叫作MIFD(Management Information Format Database)。該BIOS允許動態實時更新DMI信息,DMI還允許在手工加入BIOS時不能探測到如使用者姓名、銷售商、計算機編號等信息。Flash EPROM與Flash ROM的作用相類似。
上面說明了Cache的工作方式。在實際應用中,還有異步與同步Cache之分,這也是高速緩存的工作方式。在異步Cache工作方式下,CPU每次訪問Cache的開始時都需要額外消耗一個時鍾周期來查找特征位。同步Cache則是把按地址進行查找的過程分配到兩個以上的時鍾周期上完成。在第一個時鍾周期內,Cache先將地址存放到一個寄存器中,而在第二個時鍾周期內,Cache再把把數據傳送給CPU。由於地址已被保存在一個寄存器中,所以同步Cache可以在CPU讀取前一次數據的同時接收下一個數據地址,而不必另花時間來接收附加地址。目前大多數主板所采用的同步Cache稱為管道突發式(Pipelined burst)Cache。能更加快速地訪問從內存中讀取的連續數據。
Cache可分為L1 Cache與L2 Cache兩部分。這也就是BIOS設置中的Internal Cache(內部Cache)與External Cache(外部Cache)。L1 Cache介於CPU與L2 Cache 之間,而L2 Cache 則介於L1 Cache與主板之間,上面所述的Cache就是前面的L2 Cache。
注:過去L1Cache已集成到CPU內部,而L2 Cache則焊接在主板上,早期的奔騰CPU已把L2 Cache集成在芯片上,這樣L2 Cache將與CPU工作在同一頻率上,從而實現了真正的零等待。但在奔騰 II中,Intel采用了既兼顧成本,又考慮性能的折衷方案:將CPU與L2 Cache分開,但又焊接在同一塊電路板上,並一起封裝,L2 Cache的工作頻率是CPU主頻的一半。這就是有人把奔騰Pentium II稱為奔騰pro加MMX的原因。而奔騰賽揚(Celeron)處理器為降低成本,取消了芯片上的L2 Cache,因此有人把賽揚稱為簡裝奔騰II。而在賽楊300A中,又加入了128K L2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM