Cache Line操作和Cache相關概念介紹


1.計算機存儲體系簡介  

 

 存儲器是分層次的,離CPU越近的存儲器,速度越快,每字節的成本越高,同時容量也因此越小。寄存器速度最快,離CPU最近,成本最高,所以個數容量有限,其次是高速緩存(緩存也是分級,有L1,L2等緩存),再次是主存(普通內存),再次是本地磁盤。

 

寄存器的速度最快,可以在一個時鍾周期內訪問,其次是高速緩存,可以在幾個時鍾周期內訪問,普通內存可以在幾十個或幾百個時鍾周期內訪問。

 

存儲器分級,利用的是局部性原理。我們可以以經典的閱讀書籍為例。我在讀的書,捧在手里(寄存器),我最近頻繁閱讀的書,放在書桌上(緩存),隨時取來讀。當然書桌上只能放有限幾本書。我更多的書在書架上(內存)。如果書架上沒有的書,就去圖書館(磁盤)。我要讀的書如果手里沒有,那么去書桌上找,如果書桌上沒有,去書架上找,如果書架上沒有去圖書館去找。可以對應寄存器沒有,則從緩存中取,緩存中沒有,則從內存中取到緩存,如果內存中沒有,則先從磁盤讀入內存,再讀入緩存,再讀入寄存器。

2.計算機緩存

Cache本系列的文章重點介紹緩存cache。了解如何獲取cache的參數,了解緩存的組織結構。

2.1 Cache 概述    

cache,中譯名高速緩沖存儲器,其作用是為了更好的利用局部性原理,減少CPU訪問主存的次數。簡單地說,CPU正在訪問的指令和數據,其可能會被以后多次訪問到,或者是該指令和數據附近的內存區域,也可能會被多次訪問。因此,第一次訪問這一塊區域時,將其復制到cache中,以后訪問該區域的指令或者數據時,就不用再從主存中取出。

 

 

    cache分成多個組,每個組分成多個行,linesize是cache的基本單位,從主存向cache遷移數據都是按照linesize為單位替換的。比如linesize為32Byte,那么遷移必須一次遷移32Byte到cache。 這個linesize比較容易理解,想想我們前面書的例子,我們從書架往書桌搬書必須以書為單位,肯定不能把書撕了以頁為單位。書就是linesize。當然了現實生活中每本書頁數不同,但是同個cache的linesize總是相同的。

    所謂8路組相連( 8-way set associative)的含義是指,每個組里面有8個行。


我們知道,cache的容量要遠遠小於主存,主存和cache肯定不是一一對應的,那么主存中的地址和cache的映射關系是怎樣的呢?
    拿到一個地址,首先是映射到一個組里面去。如何映射?取內存地址的中間幾位來映射。
    舉例來說,data cache: 32-KB, 8-way set associative, 64-byte line size
    Cache總大小為32KB,8路組相連(每組有8個line),每個line的大小linesize為64Byte,OK,我們可以很輕易的算出一共有32K/8/64=64 個組。
    對於32位的內存地址,每個line有2^6 = 64Byte,所以地址的【0,5】區分line中的那個字節。一共有64個組。我們取內存地址中間6為來hash查找地址屬於那個組。即內存地址的【6,11】位來確定屬於64組的哪一個組。組確定了之后,【12,31】的內存地址與組中8個line挨個比對,如果【12,31】為與某個line一致,並且這個line為有效,那么緩存命中。
    OK,cache分成三類,
    1 直接映射高速緩存,這個簡單,即每個組只有一個line,選中組之后不需要和組中的每個line比對,因為只有一個line。
    2 組相聯高速緩存,這個就是我們前面介紹的cache。 S個組,每個組E個line。
  3 全相聯高速緩存,這個簡單,只有一個組,就是全相聯。不用hash來確定組,直接挨個比對高位地址,來確定是否命中。可以想見這種方式不適合大的緩存。想想看,如果4M 的大緩存 linesize為32Byte,采用全相聯的話,就意味着4*1024*1024/32 = 128K 個line挨個比較,來確定是否命中,這是多要命的事情。高速緩存立馬成了低速緩存了。

 

   描述一個cache需要以下參數 :
    1 cache分級,L1 cache, L2 cache, L3 cache,級別越低,離cpu越近
    2  cache的容量
    3  cache的linesize
    4  cache 每組的行個數.
2.2 Cache 結構

    假設內存容量為M,內存地址為m位:那么尋址范圍為000…00~FFF…F(m位)

    倘若把內存地址分為以下三個區間:

 

 

tag, set index, block offset三個區間有什么用呢?再來看看Cache的邏輯結構:

 

 

將此圖與上圖做對比,可以得出各參數如下:

B = 2^b

S = 2^s

現在來解釋一下各個參數的意義:

一個cache被分為S個組,每個組有E個cacheline,而一個cacheline中,有B個存儲單元,現代處理器中,這個存儲單元一般是以字節(通常8個位)為單位的,也是最小的尋址單元。因此,在一個內存地址中,中間的s位決定了該單元被映射到哪一組,而最低的b位決定了該單元在cacheline中的偏移量。valid通常是一位,代表該cacheline是否是有效的(當該cacheline不存在內存映射時,當然是無效的)。tag就是內存地址的高t位,因為可能會有多個內存地址映射到同一個cacheline中,所以該位是用來校驗該cacheline是否是CPU要訪問的內存單元。

當tag和valid校驗成功是,我們稱為cache命中,這時只要將cache中的單元取出,放入CPU寄存器中即可。

當tag或valid校驗失敗的時候,就說明要訪問的內存單元(也可能是連續的一些單元,如int占4個字節,double占8個字節)並不在cache中,這時就需要去內存中取了,這就是cache不命中的情況(cache miss)。當不命中的情況發生時,系統就會從內存中取得該單元,將其裝入cache中,與此同時也放入CPU寄存器中,等待下一步處理。注意,以下這一點對理解linux cache機制非常重要:

3.計算機緩存行 ChaceLine
    高速緩存其實就是一組稱之為緩存行(cache line)的固定大小的數據塊,其大小是以突發讀或者突發寫周期的大小為基礎的。

    每個高速緩存行完全是在一個突發讀操作周期中進行填充或者下載的。即使處理器只存取一個字節的存儲器,高速緩存控制器也啟動整個存取器訪問周期並請求整個數據塊。緩存行第一個字節的地址總是突發周期尺寸的倍數。緩存行的起始位置總是與突發周期的開頭保持一致。

當從內存中取單元到cache中時,會一次取一個cacheline大小的內存區域到cache中,然后存進相應的cacheline中。

例如:我們要取地址 (t, s, b) 內存單元,發生了cache miss,那么系統會取 (t, s, 00…000) 到 (t, s, FF…FFF)的內存單元,將其放入相應的cacheline中。


下面看看cache的映射機制:

當E=1時, 每組只有一個cacheline。那么相隔2^(s+b)個單元的2個內存單元,會被映射到同一個cacheline中。(好好想想為什么?)

當1<E<C/B時,每組有E個cacheline,不同的地址,只要中間s位相同,那么就會被映射到同一組中,同一組中被映射到哪個cacheline中是依賴於替換算法的。

當E=C/B,此時S=1,每個內存單元都能映射到任意的cacheline。帶有這樣cache的處理器幾乎沒有,因為這種映射機制需要昂貴復雜的硬件來支持。

不管哪種映射,只要發生了cache miss,那么必定會有一個cacheline大小的內存區域,被取到cache中相應的cacheline。

現代處理器,一般將cache分為2~3級,L1, L2, L3。L1一般為CPU專有,不在多個CPU中共享。L2 cache一般是多個CPU共享的,也可能裝在主板上。L1 cache還可能分為instruction cache, data cache. 這樣CPU能同時取指令和數據。

下面來看看現實中cache的參數,以Intel Pentium處理器為例:

  E B S C
L1 i-cache 4 32B 128 16KB
L1 d-cache 4 32B 128 16KB
L2 4 32B 1024~16384 128KB~2MB

 

補充:

Cache就是對內存的內容進行緩存的一個硬件。cache和內存的邏輯關系結構如下圖所示。從左往右,從上到下逐個說明

 

首先物理內存又是通過物理地址PA(physical address)標識的,內存塊用PA+SIZE表示,在讀取內存的時候,CPU會將內存塊load到cache中,但是並不是按照SIZE的大小load內存塊,而是按照cacheline的大小load一個內存塊,指定的物理內存塊將被包含在這段被load的內存中(如上圖黃色+藍色部分所示,黃色代表了內存塊在cacheline大小的內存塊中的位置)。所以在編程的時候,盡量將結構設計為cacheline對其的,一次可以加載完成,訪問下個結構體的時候,就可以直接訪問另一個cacheline,而不發生沖突了。

物理地址又被分為三個部分,tag+index+offset。index就是物理地址在cache這個大數組中的位置,相當於數組索引,索引到了后,offset說明了PA所在的內存在cacheline中的偏移量。
這樣看來,就會發現很可能兩個物理地址中見的index很有可能發生重復,這就是cacheline沖突。這樣的情況下,就要先廢除cacheline上前一個的內容后重新加載新的內存才會有效。這樣的沖突會大大降低內存的訪問效率,所以intel有提出了一種更新的架構,如下圖所示

 

在每個cacheline的下一級又多了way的概念,每個cacheline的下一級又被分為4WAY或8WAY,每個way都相當於一個cacheline。這樣即使index沖突,也可以將內存內容放到不同的way中減少沖突。tag就是用來表示是那個way上的。上面的結構就是所謂的4路組相連或8路組相連的概念。

cache一致性操作-標志位clean/dirty   

        當CPU需要數據時,首先到cache內部去尋找,如果找到了,則稱為命中了(cache hit),如果沒有找到,則稱為丟失(cache miss),這時CPU必須到內存去讀取數據,並且將其保存在cache中以備后用。

       cache中需要保存數據字在主存中的地址,cache的每個入口都被相應數據的地址所標記,當CPU要完成一次讀或寫操作時,會在cache中尋找匹配的標記。cache中存儲的地址可以是虛擬地址,也可以是物理地址,根據cache的實現而不同。由於標記在cache中本身要占用空間,所以如果以字為粒度在cache中標記主存的地址單元那就顯得有些低效。解決的辦法很簡單,還記得cache是基於空間的局部性原理的,由於被標記的內存字的鄰近單元也有可能被使用,所以會把它們也一起加載到cache中去。因此一個cache的入口處存儲的並不是單一的字,而是幾個連續的字,它們被稱為緩存行(cache line).

       對應每個cache line,都有這樣一個結構

       data bolck存放的是緩存行中所保存的就是從主存取過來的數據,tag表示的是數據塊在主存中的地址(並不是完整的地址),flag bits是一些在操作過程中涉及到的標志位。

       而對於主存中的每個地址單元,我們都可以按下圖的結構進行解析

         我們已經知道,一個cache line對應的是主存中連續的幾個字,那么這些字的低位對於映射一個cache line是沒用的,比如說在一個32位系統中,一個cache line的大小是16個字,也就是64個字節,那么其低6位在映射一個cache時是沒有用的,其作用是用來指定該內存單元在對應cache line中的偏移。Cache Set則指明了該內存單元位於哪一個cache set(一個cache set 可以包含一個或多個cache line,這與cache和內存之間的映射關系有關,在后面會進行講解),S的長度為以2為底的log(cache sets),由於一個cache set可以包含多個cache line,所以還需要高T位的tag域來指明該內存單元是位於哪個cache line中。

       下面來說說flag bits域。對於指令cache來說,flag bits位只有一位,即valid位。顧名思義,valid位指明了相應的cache line中是否裝載了有效的數據。系統剛上電時,所有的cache line中的valid位都被設置為invalid.對於數據cache來說,flag bits除了有valid位外,還有一個dirty位。對於cache line來說,如果讀進來的數據還未被修改,則稱為clean;相反,如果數據被修改了但是還沒被寫回內存,這時將dirty置位表示內存和cache里的數據不同步。在SMP系統中,所有的處理器都必須協調工作保證它們所看到的內存里的內容必須是一樣的,這種問題被稱為緩存一致性(cache coherency).假設一個處理器的cache內對某一內存有一份clean cache copy,而這時該處理器監測到另一個處理器對相應的該內存單元發出一個寫請求,那么前一個處理器將會把相應的cache line給設置為dirty,等待后者的寫操作完成並進行重裝載,以保證數據的同步性。顯然,讀操作是不會影響cache的一致性的。對於cache的實現的一些細節將在下一篇中給出。

Cache寫機制

Cache 寫機制分為:Write-through和Write-back

 Write-through(直寫模式)

定義:在數據更新時,同時寫入緩存Cache和后端存儲(主存);

優點:操作簡單;

缺點:因為數據修改需要同時寫入存儲,數據寫入速度較慢。

 

對於寫缺失使用no write allocate policy(見下文)的write through 處理流程

 

Write-back(回寫模式)

定義:在數據更新時只寫入緩存Cache,只在數據被替換出緩存時,被修改(用dirty標記)的緩存數據才會被寫到后端存儲(主存);

優點:數據寫入速度快,因為不需要寫到后端存儲(主存);

缺點:一旦更新后的數據未被寫入存儲時出現系統掉電的情況,數據將無法找回。

 對於寫缺失使用write allocate policy(見下文)的write back 的處理流程:

注意:上述兩種寫模式都是針對當緩存cache中存在要寫的數據的地址時的分配策略,然而,當要寫的數據的地址不在緩存cache中,即發生Write miss。

 

Write-miss(寫失效)

write-miss(即所要寫的數據的地址不在cache中)的處理方式有兩種:

no write allocate policy:將要寫的內容直接寫回main memory;

write allocate policy:將要寫的地址所在的塊先從main memory(主存)調入cache中,然后寫cache;

 注意:拿L1 Dcache為例,因為對一個cache line的寫入一般不會剛好是一個cache line的長度(抓了trace看過,肉眼觀察是8個字節的訪問粒度居多),

一個cache line一般是64字節,你的一次register spilling只有幾個字節,也就是說你的一次寫入只更新了一個cache line的一小部分,其他部分的值必須保持和內存一致,

所以你不能在cache里隨便找一個地方就寫,而是要先把舊值取上來,再寫入,這是write-allocate的做法。

補充:Cache基本概念

Allocation

         在CACHE中發現一個位置,並把新的cache數據存到這個位置的過程。這個處理過程可能包括evicting(驅逐)cache中已存在的數據,從而為新的數據騰出空間。

Associativity

         指每個Set(集)里包含的line frames(行幀)數。也就是cache的way(路)數。

Capacity miss容量失效

         因為cache的容量限制,導致不能包括一個程序的整個working set(工作集),從而造成cache失效。這是三個cache失效原因(容量、強制、沖突)之一。

Clean干凈

         一個有效的cache行,它的內容沒有被更高層內存或CPU修改寫過,我們稱這個cache行是“干凈”的,顯然相反狀態是dirty(“臟”)

Coherence一致性

         如果讀內存任意地址的數據返回的總是這個地址的數據最近的更新,我們說內存系統是一致的。存取指CPU和EDMA等的存取。

Compulsory miss強制失效

         有時稱為首次引用失效。強制失效是一種肯定發生的一種失效,因為數據事先從沒有使用過也就沒有機會被cache。但有些情況也被稱為強制失效,盡管它們不是第一被引用的數據,比如對非寫定位的cache進行同一位置的重復寫,以及對一個不被cache內存區域的存取。這是三個cache失效原因(容量、強制、沖突)之一。

Conflict miss 沖突失效

         由於Associativity的限制導致的而非容量限制造成的cache失效。

Direct-mapped cache直接映射cache

         直接映射cache映射低層內存的每個地址到cache的一個單一位置。這樣低層內存的多個地址可能被映射到cache中的同一位置上。它相當於1-way set-associative cache。

Dirty臟

         對writeback回寫cache,寫到達多級存儲結構的某一層,並更新這一層內容,但並不更新更低層的內存,這樣,當一個cache行有效並包含更新后的數據,但卻不更新下一更低層的內存,我們說這個cache是“臟”的,顯然一個有效行的相反狀態是“干凈”。

DMA直接內存存取

         直接內存存取,通常一個DMA操作copy一個內存塊從一個區域到另一個區域,或在外設和內存之間傳輸數據。對C64x DSP,DMA傳輸使用EDAM,這些DMA傳輸與程序執行是並行的。從cache一致性角度,EDMA的存取可以看成是另外一個並行處理器。

Eviction驅逐

         從cache移出一個line從而為新的數據騰出空間的過程我們成為Eviction。Eviction可以由用戶發出的writeback-invalidate產生,被驅逐的line我們稱為victim line。當victim line是dirty(“臟”)的時候,數據必須回寫道下一級存儲器中以維持內存的一致性。

Execute packet執行包

         在一個周期里並行執行的一個指令塊,一個執行包可以包含1-8個指令。

Fetch packet取指包

         1個周期里存取的包含8條指令的指令塊。顯然一個取指包可以包含多個執行包,這樣可能消耗多個周期。

First-reference miss首次引用失效

         是強制失效的一種形式。見強制失效。

Fully-associative cache全關聯cache

         任何內存地址都可以被存儲在cache的任何位置。這樣的cache非常靈活,但通常硬件上不可實現。這種cache同直接映射cache和集關聯cache形成鮮明對比,這兩種cache在定位策略方面都有更多的限制,全關聯cache只具有概念上的意義,當分析直接映射cache和集相關cache性能時對區分沖突失效和容量失效是有用的,全關聯cache等價於這樣一個集關聯cache:它有line frame個way,僅有一個set。

Higher-level memory高層內存

在多級內存系統中,距離CPU較近的內存稱為高層內存。在C64x系統中,最高層內存通常是L1層CACHE,這一層的內存直接同CPU相連。較高層內存通常充當較低層內存的CACHE。

Hit命中

         當請求的內存地址的數據在cache中,我們說cache命中。命中的反義詞是miss(失效)。Cache的命中使cpu的阻塞時間最短,因為才cache中去數據要比從原始位置取更快。在某一層內存的“失效”可能在較低層“命中”。

Invalidate無效

         將一個有效的行標記為無效行的過程。這相當於廢棄了這一行的內容,但並不回寫任何更新的數據。當與writeback組合時,會先將dirty數據更新到保存有這個地址的下一層內存。這通常用於維持內存的一致性。

Least Recently Used(LRU)allocation

         對於set-associative和fully-associative cache,最近最少使用原則被用來一個set里選擇一個line frame作為被驅逐的line,用來保存新的cache數據。

Line行

         是cache處理的最小單位塊。顯然一個cache行的尺寸要比CPU或高層內存存取的數據尺寸要大。例如盡管CPU可以進行單字節的存取,但如果發生一次讀失效,則cache會將整個cache行的數據讀入。

Line frame行幀

         Cache的一個位置,包含被cache的數據(一行)、一個關聯的tag地址,這個行的狀態信息。狀態信息包括這一行是否valid(有效)、dirty(臟)、LRU狀態

Line size行尺寸

         一個行的尺寸,單位字節。

Load through

         當CPU請求在第一級和第二級cache中都失效時,數據從外部內存獲得,同時會存儲在第一級和第二級內存中,如果一個cache,它保存數據並同時把數據送到高一層cache中,這種cache我們稱之為load-through cache。相對於那種首先存儲數據到低層然后第二步再把數據送到高層的cache,這種cache可以減少阻塞時間。

Long-distance access長距離存取

         CPU對不被cache內存區域數據的存取。顯然,由於這種存取,不會影響cache的狀態,但速度會比較慢。

Lower-level memory 低層內存

         在多級內存系統中,距離CPU較遠的內存稱為低層內存。在C64x系統中,最低層內存包括L2以下的外部系統內存和內存映射的外設。

LRU

         表示cache line的最近最少使用的狀態信息。

Memory ordering內存訪問排序

         定義在內存里以什么樣的順序看內存操作的結果,有時稱為consistency(連貫性)。在分級結構的特定層的強內存訪問排序表示在這一層上不可能以不同與程序序的順序來觀察內存存取的結果。松散內存訪問排序允許內存分級體系結構以不同的順序看內存操作的結果,注意強排序並不要求系統內存以程序序順序操作,而僅僅是使操作的結果在其它請求者看來是與程序序一致的。

Miss失效

         當請求的內存地址的數據不在cache中,就是說發生了cache失效。一個cache失效,會引起阻塞請求者直到line frame被定位,數據從低層內存中獲得為止。在某些情況下,比如CPU對L1D出現寫失效,阻塞CPU是不必要的。Cache失效通常分為三種類型:強制失效、沖突失效和容量失效。

Miss pipelining

         服務單一的cache失效的過程需要多個流水周期。如果對連續的失效處理進行流水線操作,顯然就增加對失效處理的效率,降低了阻塞周期。

Read allocate

         讀失效cache是僅在發生讀失效時才在cache中定位空間並把數據讀入。寫失效發生時不會產生數據讀入到cache中,而是直接把寫數據送到下一層cache中。

Set集

         Line frames的一個集合。直接映射的cache一個set包含一個line frame,N-way set-associative cache每個set包含N個line frame。Full-associative cache僅有一個set,這個唯一的set包含所有的line frames。

Set-associative cache集相關cache

         一個set-associative cache包含多個line frames用於cache低層內存。當為一個新的line數據定位一個空間時,選擇哪個line frame是基於cache的定位策略的。C64x是基於LRU策略的。

Snoop偵測

         是lower-level memory(低層內存)查詢higher-level memory(高層內存)以確定高層內存是否包含給定地址的數據的一種方法。Snoop的主要目的是通過允許低層內存請求高層內存進行數據更新來維持內存的一致性,snoop操作可以觸發writeback(回寫),或更普通的writeback-invalidate(回寫並無效),觸發writeback-invalidate(回寫並無效)操作的snoop有時又稱為snoop-invalidates。

Tag標簽

         地址高位作為一個Tag存儲在line中,在決定cache是否命中的時候,cache控制器會查詢Tag。

Thrash

         當存取操作引起cache性能遭受嚴重損壞,我們說thrash cache了。Thrash的原因可以有很多:一個可能是算法在短時間存取太多的數據而很少或根本不重復使用。也就是說working set太大。這樣的算法將引起非常嚴重的容量失效。另一種情況是算法重復存取一小組不同地址的數據,這些數據映射到cache的相同set,這樣就人為造成嚴的沖突失效。

Touch

         對一個給定地址的存儲器操作,我們稱之為touch那個地址。Touch也可以指讀數組元素或存儲器地址的其它范圍,定位它們在一個特定層cache的唯一目的。一個CPU中心環用作touch一個范圍的內存是為了定位它到cache經常被引用作為一個touch環。Touching一個數組是軟件控制預取數據的一種形式。

Valid有效

         當一個cache line保存從下一級內存取的數據,那么這個line frame就是有效的。無效狀態發生在line frame不保存任何數據,或者說還沒有被cache的數據,或先前cache的數據由於某種原因(內存一直性要求、程序要求等)被無效。有效的狀態並不表示數據是否已經被修改(其實這有另外的狀態來表示,即dirty或clean)。

Victim

從cache移出一個line從而為新的數據騰出空間的過程我們成為Eviction。Eviction可以由用戶發出的writeback-invalidate產生,被驅逐的line我們稱為victim。當victim line是dirty(“臟”)的時候,數據必須回寫到下一級存儲器中以維持內存的一致性。

Victim Buffer

         保存victim直到它們背回寫的特殊buffer。Victim lines被移到victim buffer,這樣位新的數據騰出空間。

Victim Writeback

         當victim line是dirty(“臟”)的時候,數據必須回寫道下一級存儲器中以維持內存的一致性。我們稱這個過程為Victim Writeback

Way

         對set-associative cache,每個set包含多個line frames。每個set包含的line frames數被稱為way。以set做為行,line frame作為列,那么一列的line frames集合稱為一個way。例如,一個4-way set-associative cache有4個way,每個set有4個關聯的line frames,結果,對於一個可cache的內存地址,在cache中有4個可能的映射位置。

Working Set

         程序或算法就是數據和指令代碼的集合。在一個特定時間內被引用的這個集合我們稱為working set(工作集)。通常,對於一個算法,我們需要考慮高層內存的工作集,對於整個程序我們需要考慮底層內存的工作集。

Write allocate

         對於一個write allocate cache,如果發生寫失效,就會定位一個空間並將失效的數據讀入到cache中。空間定位按照LRU原則。一旦數據被讀入到cache中,就進行寫操作,對write allocate cache,僅更新當前層的內存,寫的數據並不立刻送到下一層更低的內存。

Writeback回寫

         將一個有效的但為臟的cache line回寫到較低層內存的過程。回寫后的這個cache line我們稱之為clean(“干凈”)。回寫后的cache line狀態依然為有效。

Writeback cache回寫cache

         回寫cache僅修改它自己的寫命中的數據,它不會立刻更新下一級較低層內存的內容。數據在將來某時被回寫,如:當這個cache line被驅逐時,或當低層內存向高層內存snoop這個地址時,當然也可以直接通過程序發送writeback命令。一個寫命中,會引起對應的line被標記為dirty(“臟”),也就是說數據被更新了,但還沒來得及更新低層內存。

Writeback-invalidate回寫后使無效

  將一個有效的但為臟的cache line回寫到較低層內存並置這些cache line為無效狀態的過程。對C64x,對一組cache line進行Writeback-invalidate時,僅回寫那些有效且為臟的cache lines,但卻置那一組中的所有cache lines為無效。

Write merging

         Write merging是組合多個獨立的寫操作成一個、位寬更大的寫操作。顯然這可以改善了內存系統的性能。例如,對C64x CPU,L1D寫緩沖在某些情況下(如果它們是對同一個雙字地址的寫)能合並多個寫。

Write-through cache

         對於一個write-through cache,能把所有的寫直接旁路到較低層內存。Cache中永遠不包含更新的數據,這樣做的結果是cache line永遠不會是dirty。C64x的cache並不使用這種cache。

 

 

參考博文https://blog.csdn.net/qq_21125183/article/details/80590934  ,https://blog.csdn.net/vanbreaker/article/details/7470830 ,https://www.cnblogs.com/lifan3a/articles/4958188.html, https://blog.csdn.net/leoufung/article/details/4880462和https://www.cnblogs.com/coderex2522/p/8057830.html

 


免責聲明!

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



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