精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

CPU緩存一致性原理

sakobpqhz6 ? 來源:平凡人筆記 ? 2023-03-15 09:09 ? 次閱讀

cpu速度和內存速度比值,目前比值是100:1的關系,一個做計算的,一個做存儲,相互之間怎么比速度?

這個速度是指:cpu內部的ALU計算單元訪問內部的寄存器,如果耗時是1個納秒,計算單元通過數據總線去訪問內存需要100納秒,這個速度是指訪問某個寄存器的速度并不是計算的速度,ALU訪問寄存器的速度比訪問內存的速度快100倍。

為什么ALU訪問寄存器的速度快,因為ALU和寄存器離的近。

內存中有一個數組,訪問數組中第一個元素數據需要100納秒,訪問第二個數據100納秒,所以cpu至少有99個時間單元都得等著從內存中返回數據給ALU使用。

為了充分利用cpu的速度,一般往往在中間設計緩存的存在,cpu訪問緩存的速度比訪問內存的速度要快。

訪問數組中第一個數據的時候,把整個數組放到緩存中來,下次cpu訪問的時候從緩存中訪問。

不要內存完全可以,但工業上需要考慮一個性價比,數據都放在寄存器中太貴了,8個G的內存400塊錢,8個G的寄存器40萬,寄存器稍微貴一點點的、容量稍微小一點的還可以承受,比如8個G的內存,1個G的寄存器。

不是所有的數據都放在寄存器中,在這里有專門的算法LRU(Least Recently Used 淘汰最近未使用的)或LFU(least frequently used淘汰不經常使用的),這個算法決定著什么樣的數據挪過來,什么樣的數據挪出去。

緩存是均衡的設計,在省錢和讀取、寫入的效率之間均衡。加了一層緩存之后,發現cpu到這個緩存之間的速度還是慢很多,再加一層,

c747b632-c2ab-11ed-bfe3-dac502259ad0.png

三級緩存是工業實現中的一個妥協,也許不久的將來,cpu的速度超級快,可能需要四層緩存或內存的速度快很多,也許就一層緩存,目前的工業實踐,多采用三級緩存的結構。

線程和cpu之間的關系密不可分,一顆cpu在同一個時間只能執行一個線程,cpu的計算也代表著線程的計算。

多核CPU

c79f6bfc-c2ab-11ed-bfe3-dac502259ad0.png

這是一顆cpu,在cpu內部往往有多個核存在,每一個核都有自己的ALU、寄存器、程序計數器,一級緩存和二級緩存都在這個核里,三級緩存是多個核共享。

ALU的計算單元需要把讀到的數據放到寄存器,寄存器會去尋找想要的數據,首先去一級緩存找,沒有的話,再去二級緩存找,還沒有的話,再去三級緩存找,三級緩存把數據傳給二級緩存,二級緩存把數據傳給一級緩存,一級緩存把數據傳給寄存器,下一次再訪問數據的時候直接去一級緩存中拿。

超線程

c7b92c2c-c2ab-11ed-bfe3-dac502259ad0.png

雖然只有一個計算單元ALU,但是有2套存儲單元、2套寄存器、2套程序計數器,一個核可以裝2個線程的數據進來,計算單元輪著計算,2個線程就不需要來回切換了,即一個核2個線程,2個核4個線程,4個核8個線程。

c7e2a89a-c2ab-11ed-bfe3-dac502259ad0.png

需要訪問內存中某個數組中的第一個元素數據,先在一級緩存找,再找二級、三級,都沒有的話,去內存中找,內存中找到之后,返回給三級緩存、二級緩存、一級緩存,最后再給到寄存器, ALU做計算的時候就可以直接訪問寄存器獲取數據了。

站在計算單元的角度,訪問數組中第一個元素數據很可能會訪問第二個元素數據,如果第二個元素數據也沒有,同樣的方式又得來一遍,那這樣的話還不如直接從內存讀呢!

緩存行

當要訪問一個數據的時候,干脆每一次緩存一小塊的數據,這一小塊數據里面包含了整個數組的數據,當訪問數組中的任意元素數據的時候,就可以直接從緩存中讀取到了,這一塊的數據被稱為緩存行。

這個理論被稱為程序的局部性原理,而局部性原理分為空間局部性和時間局部性。

根據大多數工業證明,在訪問局部數據的時候,會很快的訪問相鄰的數據,這就是空間局部性。

時間局部性是執行完這條指令之后,很可能執行和它挨著的下一條指令,如果指令也看做是一份二進制0101數據的話,也可以一次性的把很多指令讀取過來。

緩存行數據是大了好還是小了好?

如果這一行數據特別大,一次性可以放好多數據過來,好處就是訪問的時候命中率會更高,但是每讀一塊數據過來效率會很低;數據小的話,讀起來速度會很快但命中率會較低。

目前計算機多采用64個字節(64*8bit)為一緩存行數據。

緩存行對齊,偽共享

c814d73e-c2ab-11ed-bfe3-dac502259ad0.png

創建一個數組,里面存放了2個T類對象元素,T類中有一個long類型的x字段,long類型長度是8個bytes。

2個線程,意味著有2顆cpu在同時運行,第一個線程玩命的修改數組中的第一個元素t1,改了10億次,第二個線程玩命的修改數組中的第二個元素t2,也改了10億次,總共耗時700多毫秒。

對T類做了修改,c8455e40-c2ab-11ed-bfe3-dac502259ad0.png

因為一個緩存行大小為64字節,所以在屬性x前面加了7個屬性(7*8字節=56個字節),加上x共64個字節,x后面也加了56個字節,正好將一個x值,放在一個緩存行里,計算結果耗時240多毫秒,數據越多執行效率反而越高了。在介紹原理之前,先介紹下緩存一致性協議,

緩存一致性協議

c85c31a6-c2ab-11ed-bfe3-dac502259ad0.png

假設有2個數據x、y位于同一緩存行,在第一個計算單元(cpu或線程)里面只使用了x,第二個線程里面只使用了y,雖然在內存中是同一份數據,但是到緩存之后,是2份拷貝數據,每一個用到它的cpu都會有它的一份拷貝存在,一個cpu對這份數據做了修改之后,另外cpu也需要同步到最新的數據。

有了緩存的概念,必須要保證緩存的數據一致性即緩存一致性協議,每種cpu廠商都有自己完全不同的緩存一致性協議,常見的是MESI(因特爾的緩存一致性協議),這是緩存一致性協議的一種實現。

cpu每個緩存行標記有4種狀態:Modified(被修改),Exclusive(獨占)、Shared(共享)、Invalid(無效)。

一個cpu將一個緩存行中的數據修改了,需要一種機制:通知使用該緩存行的其他cpu數據已失效,需要重新再讀取一遍,獲取最新修改的數據。

有些無法被緩存的數據,比如一份的數據超過了64個字節,則需要使用總線鎖。

再回到上面的那個問題,為什么數據越多執行效率反而越高了?

一個long類型的x是8個字節,這2個x位于同一個緩存行的概率極大(尤其這2個x位于同一個數組,在內存中是挨著的),2個cpu分別修改一個x,2個x在一方cpu都有緩存,修改了其中一個需要通知另外一個,每改一次通知一下,總之在修改的時候需要觸發一種機制需要另外的cpu跟我保持一致,如果這樣的話,耗時當然會比較長。

在x前后加56個字節,無論怎么刷新緩存,這個x都不會和另外一個x位于同一緩存行,這意味著這個cpu修改了第一個x的時候,是不需要通知任何其他cpu的,第二個cpu修改第二個x的時候,也是不需要通知第一個cpu的,速度一定會很快。

jdk 7寫的LinkedBlockQueue也是這種寫法或者獲得杜克獎的開源軟件Disruptor中的環形隊列也是這種寫法,

c887fd7c-c2ab-11ed-bfe3-dac502259ad0.png

Disruptor(環形隊列)號稱是最快的單機mq;實現鏈表一般需要2個指針,一個是頭指針,一個是尾指針,而這個環形隊列,只要有一個指針就可以了,

c8c2bbce-c2ab-11ed-bfe3-dac502259ad0.png

指針指向這個位置就往這存,指向下個位置就往下一個位置存,什么時候存滿了,就等著最開始存的那個被消費走,消費走了繼續往這里存,一個指針來回轉,速度非常快。

由于有多個生產者和多個消費者,在多線程的情況下這個環形的指針就會被多個線程讀到自己的緩存里,

c8cfa438-c2ab-11ed-bfe3-dac502259ad0.png

第一個屬性是起始值,后面是7個無業務含義的數據,其存在的目的是可以保證p1屬性往后組合的時候不會和別的p1屬性位于同一個緩存行。

但是說不準會往前面組合呢即為什么沒有前面的7個呢?也是有的,在父類的父類中定義的,

c9885bd6-c2ab-11ed-bfe3-dac502259ad0.png

c9abe312-c2ab-11ed-bfe3-dac502259ad0.png

數組中前連續的2個元素是2個RingBuffer對象,一個對象所占用的字節57+8+56,所以可以確保一個緩存行中只有一個元素,那么在多線程的情況下對不同元素的修改不會互相通知,互相影響。

以上便是cpu級別的并發控制之緩存一致性的描述。

審核編輯:湯梓紅

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

    關注

    31

    文章

    5317

    瀏覽量

    120010
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10825

    瀏覽量

    211155
  • 存儲
    +關注

    關注

    13

    文章

    4263

    瀏覽量

    85675
  • 緩存
    +關注

    關注

    1

    文章

    233

    瀏覽量

    26649
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19651

原文標題:CPU緩存一致性原理

文章出處:【微信號:IC學習,微信公眾號:IC學習】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何解決數據庫與緩存一致性

    緩存一致性 每次逢年過節的時候搶票非常艱難,放票的時候那么多人同時去搶票,如果所有人查詢、購票等都去訪問數據庫,那數據庫的壓力得有多大,這時候很多都會引入緩存, 把車票信息放入緩存,這
    的頭像 發表于 09-25 15:25 ?1055次閱讀
    如何解決數據庫與<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    #硬聲創作季 【JMM底層】CPU緩存一致性協議剖析

    JAVA緩存編程語言
    Mr_haohao
    發布于 :2022年09月14日 06:59:51

    小編科普CPU緩存一致性協議MESI

    什么是緩存一致性協議MESI?MESI協議中的狀態有哪幾種?MESI協議中的狀態是如何相互轉換的?
    發表于 06-17 10:00

    加速器一致性接口

    提供異步緩存一致性直接訪問PS的入口。處理器可以標記ACP上的傳輸為一致性或非一致性。PL端的AXI主機通過ARUSERS[1:0]指示是否為一致性
    發表于 11-17 15:04 ?3600次閱讀

    Cache一致性協議優化研究

    問題的由來.總結了多核時代高速緩存一致性協議設計的關鍵問題,綜述了近年來學術界對一致性的研究.從程序訪存行為模式、目錄組織結構、一致性粒度、一致性
    發表于 12-30 15:04 ?0次下載
    Cache<b class='flag-5'>一致性</b>協議優化研究

    自主駕駛系統將使用緩存一致性互連IP和非一致性互連IP

    代ASIL B(D)自主駕駛系統將使用符合ISO 26262標準的緩存一致性互連IP和非一致性互連IP來實現。 美國加利福尼亞州坎貝爾2019年4月26日消息—Arteris IP
    的頭像 發表于 05-09 17:13 ?3196次閱讀

    管理基于Cortex?-M7的MCU的高速緩存一致性

    本文檔概述了不同場景下的高速緩存一致性問題,并就如何管理或避免高速緩存一致性問題提供了些方法建議。
    發表于 04-01 10:12 ?5次下載
    管理基于Cortex?-M7的MCU的高速<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    CPU緩存一致性協議MESI詳解

    CPU在摩爾定律的指導下以每18個月翻番的速度在發展,然而內存和硬盤的發展速度遠遠不及CPU。這就造成了高性能能的內存和硬盤價格及其昂貴。然而CPU的高度運算需要高速的數據。為了解決
    的頭像 發表于 05-12 17:36 ?4315次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>協議MESI詳解

    CPU緩存一致性協議MESI介紹

    CPU在摩爾定律的指導下以每18個月翻番的速度在發展,然而內存和硬盤的發展速度遠遠不及CPU。這就造成了高性能能的內存和硬盤價格及其昂貴。
    的頭像 發表于 06-09 10:39 ?877次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>協議MESI介紹

    介紹下cpu緩存一致性(MESI協議)

    之前介紹了java并發包的cas原理和java內存模型,這篇我們介紹下cpu緩存一致性原理,可以幫助我們更好的理解cas的底層原理。
    的頭像 發表于 06-09 16:01 ?4569次閱讀
    介紹下<b class='flag-5'>cpu</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>(MESI協議)

    CPU緩存一致性協議解析

    CPU運行效率高不高,定程度取決于緩存,這里就給大家分享CPU緩存相關的內容。
    的頭像 發表于 07-12 10:07 ?775次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>協議解析

    管理基于Cortex-M7的MCU的高速緩存一致性

    電子發燒友網站提供《管理基于Cortex-M7的MCU的高速緩存一致性.pdf》資料免費下載
    發表于 09-25 10:11 ?0次下載
    管理基于Cortex-M7的MCU的高速<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    如何保證緩存一致性

    “ 本文的參考文章是2022年HOT 34上Intel Rob Blakenship關于CXL緩存一致性篇介紹。”
    的頭像 發表于 10-19 17:42 ?1035次閱讀
    如何保證<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    Redis緩存與Mysql如何保證一致性

    基本流程就是客戶端A請求,先去刪除緩存,然后將數據寫入數據庫,此時客戶端B查詢先去查詢緩存緩存沒有返回,去查數據庫,此時還沒有完成主從同步,拿到是從庫的舊數據,然后將舊數據進行緩存
    的頭像 發表于 12-02 14:23 ?891次閱讀
    Redis<b class='flag-5'>緩存</b>與Mysql如何保證<b class='flag-5'>一致性</b>?

    異構計算下緩存一致性的重要

    在眾多回復中,李博杰同學的回答被認為質量最高。他首先將緩存一致性分為兩個主要場景:是主機內CPU與設備間的一致性;二是跨主機的
    的頭像 發表于 10-24 17:00 ?306次閱讀
    異構計算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>