衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

cpu與cache內存交互的過程

嵌入式情報局 ? 來源:人人極客社區 ? 作者:人人極客社區 ? 2022-10-21 09:10 ? 次閱讀

What is cache?

CPU緩存(Cache Memory)位于CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。

在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。

下圖是一個典型的存儲器層次結構,我們可以看到一共使用了三級緩存:

ba63465c-50d7-11ed-a3b6-dac502259ad0.png

Why should I care about cache?

ba71dab4-50d7-11ed-a3b6-dac502259ad0.png

從延遲上看,做一次乘法一般只要三個周期,而做一次CPU的內存訪問需要167個cycle,如果需要提升程序性能,減少CPU的memory訪問至關重要。因此,需要采用容量小但是更快的存儲器(cache)。

為什么要有多級CPU Cache

隨著科技發展,熱點數據的體積越來越大,單純的增加一級緩存大小的性價比已經很低了二級緩存就是一級緩存的緩沖器:一級緩存制造成本很高因此它的容量有限,二級緩存的作用就是存儲那些CPU處理時需要用到、一級緩存又無法存儲的數據。

同樣道理,三級緩存和內存可以看作是二級緩存的緩沖器,它們的容量遞增,但單位制造成本卻遞減。另外需要注意的是,L3 Cache和L1,L2 Cache有著本質的區別。,L1和L2 Cache都是每個CPU core獨立擁有一個,而L3 Cache是幾個Cores共享的,可以認為是一個更小但是更快的內存。

baa1a67c-50d7-11ed-a3b6-dac502259ad0.png

使用dmidecode命令查看cache size:

babfb3c4-50d7-11ed-a3b6-dac502259ad0.png

cpu與cache 內存交互的過程

CPU接收到指令后,它會最先向CPU中的一級緩存(L1 Cache)去尋找相關的數據,然一級緩存是與CPU同頻運行的,但是由于容量較小,所以不可能每次都命中。這時CPU會繼續向下一級的二級緩存(L2 Cache)尋找,同樣的道理,當所需要的數據在二級緩存中也沒有的話,會繼續轉向L3 Cache、內存(主存)和硬盤。

程序運行時可以使用perf工具觀察cache-miss的rate

什么是cache line

Cache Line可以簡單的理解為CPU Cache中的最小緩存單位。內存和高速緩存之間或高速緩存之間的數據移動不是以單個字節或甚至word完成的。相反,移動的最小數據單位稱為緩存行,有時稱為緩存塊。目前主流的CPU Cache的Cache Line大小都是64Bytes。假設我們有一個512字節的一級緩存,那么按照64B的緩存單位大小來算,這個一級緩存所能存放的緩存個數就是512/64 = 8個。

查看cache line大小:

cat /sys/devices/system/cpu/cpu1/cache/index0/coherency_line_size

cache line的影響:

for(inti=0;i
bae98c8a-50d7-11ed-a3b6-dac502259ad0.png

注意當步長在1到16范圍內,循環運行時間幾乎不變。但從16開始,每次步長加倍,運行時間減半。由于16個整型數占用64字節(一個緩存行),for循環步長在1到16之間必定接觸到相同數目的緩存行:即數組中所有的緩存行。當步長為32,我們只有大約每兩個緩存行接觸一次,當步長為64,只有每四個接觸一次。

cache寫機制

Cache寫機制分為write through和write back兩種。

Write-through- Write is done synchronously both to the cache and to the backing store.

Write-back (or Write-behind) - Writing is done only to the cache. A modified cache block is written back to the store, just before it is replaced.

Write-through(直寫模式)在數據更新時,同時寫入緩存Cache和后端存儲。此模式的優點是操作簡單;缺點是因為數據修改需要同時寫入存儲,數據寫入速度較慢。

Write-back(回寫模式)在數據更新時只寫入緩存Cache。只在數據被替換出緩存時,被修改的緩存數據才會被寫到后端存儲。此模式的優點是數據寫入速度快,因為不需要寫存儲;缺點是一旦更新后的數據未被寫入存儲時出現系統掉電的情況,數據將無法找回。

cache 一致性

多個處理器對某個內存塊同時讀寫,會引起沖突的問題,這也被稱為Cache一致性問題。

Cache一致性問題出現的原因是在一個多處理器系統中,多個處理器核心都能夠獨立地執行計算機指令,從而有可能同時對某個內存塊進行讀寫操作,并且由于我們之前提到的回寫和直寫的Cache策略,導致一個內存塊同時可能有多個備份,有的已經寫回到內存中,有的在不同的處理器核心的一級、二級Cache中。由于Cache緩存的原因,我們不知道數據寫入的時序性,因而也不知道哪個備份是最新的。還有另外一個一種可能,假設有兩個線程A和B共享一個變量,當線程A處理完一個數據之后,通過這個變量通知線程B,然后線程B對這個數據接著進行處理,如果兩個線程運行在不同的處理器核心上,那么運行線程B的處理器就會不停地檢查這個變量,而這個變量存儲在本地的Cache中,因此就會發現這個值總也不會發生變化。

為了正確性,一旦一個核心更新了內存中的內容,硬件就必須要保證其他的核心能夠讀到更新后的數據。目前大多數硬件采用的策略或協議是MESI或基于MESI的變種:

M代表更改(modified),表示緩存中的數據已經更改,在未來的某個時刻將會寫入內存;

E代表排除(exclusive),表示緩存的數據只被當前的核心所緩存;

S代表共享(shared),表示緩存的數據還被其他核心緩存;

I代表無效(invalid),表示緩存中的數據已經失效,即其他核心更改了數據。

cache的局部性

程序在一段時間內訪問的數據通常具有局部性,比如對一維數組來說,訪問了地址x上的元素,那么以后訪問地址x+1、x+2上元素的可能性就比較高;現在訪問的數據,在不久之后再次被訪問的可能性也比較高。局部性分為“時間局部性”和“空間局部性”,時間局部性是指當前被訪問的數據隨后有可能訪問到;空間局部性是指當前訪問地址附近的地址可能隨后被訪問。處理器通過在內存和核心之間增加緩存以利用局部性增強程序性能,這樣可以用遠低于緩存的價格換取接近緩存的速度。

時間局部性:

代碼1:

for(loop=0;loop<10;?loop++)?{
????for?(i=0;?i

代碼2:

for(i=0;i

代碼2的性能優于代碼1,x的元素現在被重復使用,因此更有可能留在緩存中。這個重新排列的代碼在使用x[i]時顯示更好的時間局部性。

空間局部性:

一個矩陣乘法的例子:

代碼1:

fori=1..n
forj=1..n
fork=1..n
c[i,j]+=a[i,k]*b[k,j]

代碼2:

fori=1..n
fork=1..n
forj=1..n
c[i,j]+=a[i,k]*b[k,j]

代碼2的性能優于代碼一的性能。

兩者實現上的差異:

baf3c4b6-50d7-11ed-a3b6-dac502259ad0.png

代碼2的b[k,j]是按行訪問的,所以存在良好的空間局部性,cache line被充分利用。代碼1中,b [k,j]由列訪問。由于行的存儲矩陣,因此對于每個緩存行加載,只有一個元素用于遍歷。

cache替換策略

Cache工作原理要求它盡量保存最新數據,當從主存向Cache傳送一個新塊,而Cache中可用位置已被占滿時,就會產生Cache替換的問題。

常用的替換算法有下面三種。

LFU

LFU(Least Frequently Used,最不經常使用)算法將一段時間內被訪問次數最少的那個塊替換出去。每塊設置一個計數器,從0開始計數,每訪問一次,被訪塊的計數器就增1。當需要替換時,將計數值最小的塊換出,同時將所有塊的計數器都清零。這種算法將計數周期限定在對這些特定塊兩次替換之間的間隔時間內,不能嚴格反映近期訪問情況,新調入的塊很容易被替換出去。

LRU

LRU(Least Recently Used,近期最少使用)算法是把CPU近期最少使用的塊替換出去。這種替換方法需要隨時記錄Cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊。每塊也設置一個計數器,Cache每命中一次,命中塊計數器清零,其他各塊計數器增1。當需要替換時,將計數值最大的塊換出。LRU算法相對合理,但實現起來比較復雜,系統開銷較大。這種算法保護了剛調入Cache的新數據塊,具有較高的命中率。LRU算法不能肯定調出去的塊近期不會再被使用,所以這種替換算法不能算作最合理、最優秀的算法。但是研究表明,采用這種算法可使Cache的命中率達到90%左右。

隨機替換

最簡單的替換算法是隨機替換。隨機替換算法完全不管Cache的情況,簡單地根據一個隨機數選擇一塊替換出去。隨機替換算法在硬件上容易實現,且速度也比前兩種算法快。缺點則是降低了命中率和Cache工作效率。

cache的映射

主存與cache的地址映射方式有全相聯方式、直接方式和組相聯方式三種。

直接映射:將一個主存塊存儲到唯一的一個Cache行。

多對一的映射關系,但一個主存塊只能拷貝到cache的一個特定行位置上去。cache的行號i和主存的塊號j有如下函數關系:i=j mod m(m為cache中的總行數)。

bafe4a30-50d7-11ed-a3b6-dac502259ad0.png

優點:硬件簡單,容易實現。缺點:命中率低, Cache的存儲空間利用率低。

全相聯映射:將一個主存塊存儲到任意一個Cache行。

主存的一個塊直接拷貝到cache中的任意一行上。

bb76532c-50d7-11ed-a3b6-dac502259ad0.png

優點:命中率較高,Cache的存儲空間利用率高。缺點:線路復雜,成本高,速度低。

組相聯映射:將一個主存塊存儲到唯一的一個Cache組中任意一個行。

將cache分成u組,每組v行,主存塊存放到哪個組是固定的,至于存到該組哪一行是靈活的,即有如下函數關系:cache總行數m=u×v 組號q=j mod u

bba37406-50d7-11ed-a3b6-dac502259ad0.png

組間采用直接映射,組內為全相聯。硬件較簡單,速度較快,命中率較高。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10904

    瀏覽量

    213023
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74331
  • Cache
    +關注

    關注

    0

    文章

    129

    瀏覽量

    28433

原文標題:CPU中cache那些事,太重要了!

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    通過內存地址映射能否禁用MSMC上的cache

    請教: ??????? 在程序設計時,有時涉及MSMC內存上的頻繁交互時,cache一致性維護相當令人頭疼。C6678不允許禁止MSMC上的cache,但是我們了解到TI提供了機制將某
    發表于 06-21 06:25

    處理器在讀內存過程中,CPU核、cache、MMU如何協同工作?

    處理器中斷處理的過程是怎樣的?處理器在讀內存過程中,CPU核、cache、MMU如何協同工作?
    發表于 10-18 08:57

    嵌入式CPU指令Cache的設計與實現

    針對嵌入式CPU 指令處理速度與存儲器指令存取速度不匹配問題,本文基于FPGA 設計并實現了可以有效解決這一問題的指令Cache。根據嵌入式五級流水線CPU 特性,所設計指令Cache
    發表于 08-05 14:27 ?36次下載

    什么是緩存Cache

    什么是緩存Cache 即高速緩沖存儲器,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主內存
    發表于 01-23 10:57 ?911次閱讀

    什么是Cache/SIMD?

    什么是Cache/SIMD?   Cache :即高速緩沖存儲器,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。由于CPU的速度
    發表于 02-04 11:29 ?543次閱讀

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令緩存)由于系統主內存的速度較慢,當CPU讀取指令的時候,會導致
    發表于 02-04 11:51 ?634次閱讀

    Buffer和Cache之間區別是什么?

    cpu在執行程序所用的指令和讀數據都是針對內存的,也就是從內存中取得的。由于內存讀寫速度慢,為了提高cpu
    的頭像 發表于 04-02 10:35 ?6796次閱讀

    cache結構與工作原理

    更詳細的講,cache的結構其實和內存的結構類似,也包含地址和內容,只是cache的內容除了存的數據(data)之外,還包含存的數據的物理內存的地址信息(tag),因為
    發表于 06-03 14:24 ?1.2w次閱讀
    <b class='flag-5'>cache</b>結構與工作原理

    cache的排布與CPU的典型分布

    cache的掌握,對于Linux工程師(其他的非Linux工程師也一樣)寫出高效能代碼,以及優化Linux系統的性能是至關重要的。簡單來說,cache快,內存慢,硬盤更慢。在一個典型的現代C
    的頭像 發表于 10-18 09:01 ?2001次閱讀

    CPU Cache偽共享問題

    CPU想要訪問主存中的元素時,會先查看Cache中是否存在,如果存在(稱為Cache Hit),直接從Cache中獲取,如果不存在(稱為Cache
    的頭像 發表于 12-12 09:17 ?713次閱讀

    CPU設計之Cache存儲器

    Cache存儲器也被稱為高速緩沖存儲器,位于CPU和主存儲器之間。之所以在CPU和主存之間要加cache是因為現代的CPU頻率大大提高,
    的頭像 發表于 03-21 14:34 ?1371次閱讀
    <b class='flag-5'>CPU</b>設計之<b class='flag-5'>Cache</b>存儲器

    CPU CACHE策略的初始化

    build_mem_type_table()函數的功能是獲取當前CPUCACHE類型,據此初始化mem_type。
    的頭像 發表于 06-05 15:03 ?1516次閱讀
    <b class='flag-5'>CPU</b> <b class='flag-5'>CACHE</b>策略的初始化

    多個CPU各自的cache同步問題

    ? CACHE 的一致性 Cache的一致性有這么幾個層面 1.?????一個CPU的icache和dcache的同步問題 2.?????多個CPU各自的
    的頭像 發表于 06-17 10:38 ?2319次閱讀
    多個<b class='flag-5'>CPU</b>各自的<b class='flag-5'>cache</b>同步問題

    Linux性能優化:Cache對性能的影響

    Cache對性能的影響首先我們要知道,CPU訪問內存時,不是直接去訪問內存的,而是先訪問緩存(cache)。 當緩存中已經有了我們要的數據時
    的頭像 發表于 10-04 15:31 ?989次閱讀
    Linux性能優化:<b class='flag-5'>Cache</b>對性能的影響

    Cache內存有什么區別

    Cache(高速緩存)和內存(Memory,通常指主存儲器或RAM)是計算機存儲系統中兩個重要的組成部分,它們在計算機的性能和數據處理中扮演著不同的角色。以下是對Cache內存之間區
    的頭像 發表于 09-26 15:28 ?2146次閱讀
    太阳会百家乐现金网| 威尼斯人娱乐城骰宝| 阴宅24山吉凶| 澳门体育博彩| 百家乐乐百家娱乐场| 洞口县| 百家乐小揽| 百家乐翻天快播| 网络百家乐官网会输钱的多吗| 百家乐官网技巧辅助软件| 百家乐官网赌博机有鬼吗| 百家乐官网玩法既规则| 东乡族自治县| 皇冠足球网| 一二博国际| bet9全讯网查询| 真博线上娱乐| 久久棋牌评测| 顶级赌场手机版官方下载| 大发888好吗| 香港六合彩开码| 韦德娱乐| 邮箱| 皇冠百家乐官网代理网| 百家乐官网作弊视频| 百家乐官网网络投注| 百家乐官网庄闲出现几率| 百家乐怎样出千| 奥斯卡百家乐的玩法技巧和规则 | 澳门百家乐介绍| 澳门百家乐的玩法技巧和规则 | 德州扑克单机版下载| 滨州市| 飞7棋牌游戏| 皇冠网代理| 百家乐官网赢家球讯网| 百家乐官网记牌器| 百家乐官网路技巧| 百家乐博彩桌出租| 太阳百家乐游戏| 大三巴娱乐城开户|