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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

cache背后的軟思考

Linux閱碼場(chǎng) ? 來源:Linux閱碼場(chǎng) ? 2023-03-02 10:34 ? 次閱讀

1.前言

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

2.Cache的設(shè)計(jì)思考

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

所以在linux初級(jí)開發(fā)者接觸cache時(shí),腦海里會(huì)不自覺的思考:硬件行為,都是被ICer設(shè)計(jì)好的;所以他們也并沒有深究cache的層次結(jié)構(gòu),也沒有繼續(xù)挖掘cache和驅(qū)動(dòng)軟件的千絲萬(wàn)縷的關(guān)系,腦海里想象的拓?fù)鋱D,大致是這樣:

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

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

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

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

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

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

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

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

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

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

L2 cache的benchmark:

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

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

進(jìn)一步思考:現(xiàn)在處理器設(shè)計(jì)越來越復(fù)雜,越來越強(qiáng),比如NUMA,大小核等等,其呈現(xiàn)效果又如下簡(jiǎn)單示例:

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

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

1.Cache的工程思考

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

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

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

當(dāng)然在內(nèi)核驅(qū)動(dòng)設(shè)計(jì)時(shí),并不會(huì)指定使用哪個(gè)cache策略,因?yàn)閗ernel已經(jīng)在某些接口中,潛在的做了相關(guān)操作,譬如大家用的ioremap_xxx這類接口就是和cache聯(lián)系緊密;

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

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

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

gic_flush_dcache_to_poc();

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

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

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

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

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

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

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

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

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

2.總結(jié)

本文因?yàn)槠鶈栴},分享的是cache的冰山一角。cache又是體系架構(gòu)中的一角,體系架構(gòu)又是內(nèi)核技術(shù)的一角,我又是眾多讀者的一角。

文獻(xiàn)參考:論文《WhatEvery Programmer Should Know About Memory》。

審核編輯 :李倩

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

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365036
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209371
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    128

    瀏覽量

    28188

原文標(biāo)題:cache背后的軟思考

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    (分享設(shè)計(jì))顯示器上的思考

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

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

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

    Cache中Tag電路的設(shè)計(jì)

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

    什么是Cache/SIMD?

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

    什么是Instructions Cache/IMM/ID

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

    什么是Cache

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

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

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

    cache結(jié)構(gòu)與工作原理

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

    什么是 Cache? Cache讀寫原理

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

    CPU Cache偽共享問題

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

    深入理解Cache工作原理

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

    Cache的原理和地址映射

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

    Cache分類與替換算法

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

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

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

    Cache寫入方式原理簡(jiǎn)介

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