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

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

3天內(nèi)不再提示

cache背后的軟思考

Linux閱碼場 ? 來源:Linux閱碼場 ? 2023-03-02 10:34 ? 次閱讀

1.前言

Cache在體系架構中占據(jù)半邊山,讀者又多為軟件從業(yè)者、學者,個人在碰到項目瓶頸時,研讀一些ARM手冊,以及業(yè)內(nèi)技術論文,發(fā)現(xiàn)cache在架構中發(fā)揮著被軟件工程師低估的能力,本文從其設計角度和軟件角度闡述一二;

2.Cache的設計思考

Cache的基礎資料很多,多是圍繞如下展開說明:cache line,組/全相連,VIVT/VIPT/PIPT等概念,一般初學者閱讀后也會云里霧里,cache技術也很少被直接關注到;

所以在linux初級開發(fā)者接觸cache時,腦海里會不自覺的思考:硬件行為,都是被ICer設計好的;所以他們也并沒有深究cache的層次結構,也沒有繼續(xù)挖掘cache和驅動軟件的千絲萬縷的關系,腦海里想象的拓撲圖,大致是這樣:

5f4abe14-b813-11ed-bfe3-dac502259ad0.jpg

認為cache的設計就是cpu和memory之間單一的存在,從而忽略了那些ICer對cache的研究和優(yōu)化,直接影響就是軟件層面的優(yōu)化,以及軟件層面的疑難bug;這也是初學者進階時的第一道阻礙;

那么在原廠工程師的腦海里,cache最基礎的樣子是這樣的:

5f60ae90-b813-11ed-bfe3-dac502259ad0.jpg

它是現(xiàn)在處理器基本的形態(tài),也是最簡單的形態(tài),在ICer們的設計上,其內(nèi)在協(xié)議直接影響著指令的流轉:load,store等;其內(nèi)在存在的load buffer和store buffer影響著你的數(shù)據(jù)一致性,你的讀寫指令運行速度,數(shù)據(jù)的共享屬性等等,極其簡單的實例:

5f6df00a-b813-11ed-bfe3-dac502259ad0.jpg

5f7f9062-b813-11ed-bfe3-dac502259ad0.jpg

一個load執(zhí)行,一個store執(zhí)行,哪個快?顯然prefetch最快,再深一層次思考:如果工程中,在多cpu和多thread都有數(shù)據(jù)訪問需求,但是CPU和memory直接又有cache這一層大buffer,硬件和軟件都做了什么,能夠保證實時或訪存速度?

硬件上,制定cache的各種參數(shù)時,在保證滿足設計需求時,ICer們也會做這種動作:即對cache的benchmark;比如cache size和直接映射、組相連帶來的收益:

5f8d1688-b813-11ed-bfe3-dac502259ad0.jpg

L2 cache的benchmark:

5f9bd696-b813-11ed-bfe3-dac502259ad0.jpg

各種參數(shù)的測試結果呈現(xiàn)就是市面上大家可以查到的某種處理器L1 cache,L2 cache,L3 cache,以及system cache的大小,所以在大家認為很小size的cache,ICer以及架構師們,甚至是學者,都在為其能夠發(fā)揮出更佳性能,更低功耗的能力,夜以繼日的做研究,做實驗;

進一步思考:現(xiàn)在處理器設計越來越復雜,越來越強,比如NUMA,大小核等等,其呈現(xiàn)效果又如下簡單示例:

5face80a-b813-11ed-bfe3-dac502259ad0.jpg

硬件層面帶來了考驗和升級,直接的影響給軟件層面也帶了考驗,比如:你的數(shù)據(jù)一致性問題,IP驅動設計等等,ARM的內(nèi)存模型又是弱一致性的,那么你設計的驅動,可能被動存在著潛在bug,所以進一步帶來的是我們在工程問題上的思考。

1.Cache的工程思考

本人工作于ARM體系架構之上,所以日常在查閱arm官方公開的文檔時,知道的愈多,疑問也愈多,思考的也愈多,但是借助linux這個開源社區(qū),眾多疑惑也慢慢得到解答,特此在工作之余將一小部分所得分享于大家,比如:cache的多個讀寫策略在影響著指令行為,直接導致數(shù)據(jù)的行為不一,如何在工程中認識它們?解決它們?

Cache的策略有如下:write-allocate,no write-allocate,read-allocate,read-through;

上述策略在驅動設計時,也是幾乎被忽略的存在,其發(fā)揮的作用就是data是否被緩存在cache中,還是 pass到內(nèi)存中,若兩者皆存在,那么你的DMA在搬運數(shù)據(jù)前,有個動作就是sync,即刷新cache,保持數(shù)據(jù)在cache與內(nèi)存中的一致性;

當然在內(nèi)核驅動設計時,并不會指定使用哪個cache策略,因為kernel已經(jīng)在某些接口中,潛在的做了相關操作,譬如大家用的ioremap_xxx這類接口就是和cache聯(lián)系緊密;

可以思考:如果我不需要使用ioremap_xxx這類接口,還需要關注什么cache策略嗎?

思考后的結果:dirty數(shù)據(jù)帶來的不同步就是你解決不了問題的噩夢;

Dirty數(shù)據(jù)怎么處理?借助linux的驅動設計,可以給各位呈現(xiàn)出如下一個接口:

gic_flush_dcache_to_poc();

POC(Pointof Coherency):全局緩存一致性,即系統(tǒng)中所有可以發(fā)起內(nèi)存訪問的硬件單元的視角:CPU,DMA等;

所以雖然cache分為:L1 cache,L2 cache,L3cache,以及system cache,但是需要軟件設計者必須知道的是:你想干什么?是刷新部分master所感測到的數(shù)據(jù),還是所有master都要關注到的數(shù)據(jù)變化,這就是cache帶來的可操作性;

即在不同cache層級的設計中,data的可觀測性是不一樣的,這也是為什么在我的腦海里,cache一直是多層級,多策略的,所以在驅動設計時,保證IP的視角看到的數(shù)據(jù)就是我設計的結果;

思考:如果只是CPU之間的data是可觀測的,有沒有什么指令作用域比POC更小的?

思考后的結果:POC視角太寬泛了,比POC作用域小的,即 POU:Pointof Unification;即處理器看到的視角,比如虛擬內(nèi)存和物理內(nèi)存映射的頁表數(shù)據(jù):TLB,MMU;

進一步思考:POC和POU又太大了,有沒有只操作我dword數(shù)據(jù)的?

因為ARM的內(nèi)存模型是弱一致性的,所以其在指令排序上有所行為,直接影響就是控制數(shù)據(jù)的亂序,內(nèi)存屏障指令運勢而生:dmb,dsb,isb;(PS:宋寶華老師的分享文章有詳解);

該內(nèi)存屏障指令宋老師有過介紹,不再贅述,需要關注的是:在使用上述指令時,也有作用域的區(qū)別;

Cache帶給處理器的是極致性能,帶給開發(fā)者是一個又一個的隱藏問題,所以剖析cache很有必要;

2.總結

本文因為篇幅問題,分享的是cache的冰山一角。cache又是體系架構中的一角,體系架構又是內(nèi)核技術的一角,我又是眾多讀者的一角。

文獻參考:論文《WhatEvery Programmer Should Know About Memory》。

審核編輯 :李倩

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

    關注

    134

    文章

    9008

    瀏覽量

    366057
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10772

    瀏覽量

    210441
  • Cache
    +關注

    關注

    0

    文章

    129

    瀏覽量

    28231

原文標題:cache背后的軟思考

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    (分享設計)顯示器上的思考

    ` 本帖最后由 白菜蟲蟲 于 2013-5-30 10:23 編輯 昨天無聊,用倆回形針彎了個思考者,晚上加了個LED,用一根舊USB數(shù)據(jù)線取電。廢話少說,上圖:加個動態(tài)的回復關于參數(shù)
    發(fā)表于 05-29 10:33

    為什么需要cache?cache是如何影響code的呢

    是如何影響這2段code的呢?為什么需要cache思考為什么需要cache之前,我們首先先來思考另一個問題:我們的程序是如何運行起來的?我們應該知道程序是運行在 RAM之中,RAM
    發(fā)表于 04-21 11:10

    Cache中Tag電路的設計

    摘要:在SoC系統(tǒng)中,片上緩存(Cache)的采用是解決片上處理器和片外存儲器之間速度差異的重要方法,Cache中用來存儲標記位并判斷Cache是否命中的Tag電路的設計將會影響到整個Cach
    發(fā)表于 05-08 09:26 ?11次下載

    什么是Cache/SIMD?

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

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令緩存)由于系統(tǒng)主內(nèi)存的速度較慢,當CPU讀取指令的時候,會導致CPU停下來
    發(fā)表于 02-04 11:51 ?622次閱讀

    什么是Cache

    什么是Cache  英文縮寫: Cache 中文譯名: 高速緩存器 分  類: IP與多媒體 解  釋: 信息在本地的臨時存儲
    發(fā)表于 02-22 17:26 ?1004次閱讀

    高速緩存(Cache),高速緩存(Cache)原理是什么?

    高速緩存(Cache),高速緩存(Cache)原理是什么? 高速緩存Cache是位于CPU和主存儲器之間規(guī)模較小、存取速度快捷的靜態(tài)存儲器。Cache一般由
    發(fā)表于 03-26 10:49 ?6811次閱讀

    cache結構與工作原理

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

    什么是 Cache? Cache讀寫原理

    由于寫入數(shù)據(jù)和讀取指令分別通過 D-Cache 和 I-Cache,所以需要同步 D-Cache 和 I-Cache,即復制后需要先將 D-Cach
    發(fā)表于 12-06 09:55 ?2100次閱讀

    CPU Cache偽共享問題

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

    深入理解Cache工作原理

    按照數(shù)據(jù)關系劃分:Inclusive/exclusive Cache: 下級Cache包含上級的數(shù)據(jù)叫inclusive Cache。不包含叫exclusive Cache。舉個例子,
    的頭像 發(fā)表于 05-30 16:02 ?734次閱讀
    深入理解<b class='flag-5'>Cache</b>工作原理

    Cache的原理和地址映射

    cache存儲系統(tǒng)中,把cache和主存儲器都劃分成相同大小的塊。 主存地址由塊號B和塊內(nèi)地址W兩部分組成,cache地址由塊號b和塊內(nèi)地址w組成。 當CPU訪問cache時,CPU
    的頭像 發(fā)表于 10-31 11:21 ?1431次閱讀

    Cache分類與替換算法

    根據(jù)不同的分類標準可以按以下3種方法對Cache進行分類。 ?1)數(shù)據(jù)cache和指令cache ?● 指令cache:指令預取時使用的cache
    的頭像 發(fā)表于 10-31 11:26 ?836次閱讀
    <b class='flag-5'>Cache</b>分類與替換算法

    Cache內(nèi)容鎖定是什么

    “鎖定”在cache中的塊在常規(guī)的cache替換操作中不會被替換,但當通過C7控制cache中特定的塊時,比如使某特定的塊無效時,這些被“鎖定”在cache中的塊也將受到相應的影響。
    的頭像 發(fā)表于 10-31 11:31 ?655次閱讀

    Cache寫入方式原理簡介

    提高高速緩存命中率的最好方法是盡量使Cache存放CPU最近一直在使用的指令與數(shù)據(jù),當Cache裝滿后,可將相對長期不用的數(shù)據(jù)刪除,提高Cache的使用效率。 為保持Cache中數(shù)據(jù)與
    的頭像 發(fā)表于 10-31 11:43 ?1137次閱讀