chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

基于CPU性能調(diào)優(yōu)的必要性和方法

Linux閱碼場 ? 來源:Linux閱碼場 ? 2023-02-21 09:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天的東西可能會(huì)比較輕松哈,不會(huì)特別不會(huì)特別細(xì)。給大家講一下,因?yàn)楝F(xiàn)在硬件按理論來說硬件會(huì)越來越好,為什么還要去做這么深的投入和這么多精力去做代碼性能調(diào)優(yōu)。然后再舉一個(gè)例子,怎么去做性能分析?基于 Top-down 性能分析,以及怎么優(yōu)化它?

02 背景:世界日益數(shù)據(jù)化,數(shù)據(jù)處理的性能要求愈加強(qiáng)烈

5baa9340-b17b-11ed-bfe3-dac502259ad0.jpg

首先看,現(xiàn)在整個(gè)世界基本上是以數(shù)據(jù)為中心,數(shù)據(jù)越來越多,對數(shù)據(jù)處理的性能要求會(huì)越來越強(qiáng)烈。從現(xiàn)在可以看到,整個(gè)咱們整個(gè)全世界出現(xiàn)的數(shù)據(jù)大概是從 2020 年已經(jīng)到了 40CB 。因?yàn)樗侵笖?shù)性的增長,今年肯定還會(huì)更多。

03 背景:處理器單線程處理性能增長進(jìn)入瓶頸期

5c1346e2-b17b-11ed-bfe3-dac502259ad0.jpg

從硬件上,摩爾定律其實(shí)已經(jīng)進(jìn)到一個(gè)尾聲階段了。大家可以看到圖上這一塊是晶體管的數(shù)量是在慢慢增加的。頻率可以看到大家基本上也是慢慢的進(jìn)入一個(gè)持平的狀態(tài)。比如現(xiàn)在手機(jī)高通可能每年提就擠牙膏似的,跟 Intel 一樣擠牙膏擠一點(diǎn)點(diǎn)。功耗它可能現(xiàn)在可能在手機(jī)上,功耗會(huì)越來越高,手機(jī)現(xiàn)在越來越發(fā)燙。

但是最關(guān)鍵是單線程性能,我可能核會(huì)越來越多,但是單線程性能并沒有太增加。我可能會(huì)通過手機(jī)是小核,中核,大核這樣一個(gè)策略來給它性能提升,但是對單核來說,它性能并沒有特別明顯的提升,這是它的一個(gè)背景。

04 趨勢:未來計(jì)算性能優(yōu)化的三個(gè)維度

5c47eb18-b17b-11ed-bfe3-dac502259ad0.jpg

這個(gè)人叫 John Hennessy,他是哈佛大學(xué)的前校長,現(xiàn)在應(yīng)該和 alphabet (谷歌母公司) 的董事長。他當(dāng)時(shí)做了一個(gè)演講,計(jì)算的未來是什么樣。他說對于通用的計(jì)算,其實(shí)現(xiàn)在來說已經(jīng) "is dead" ,已經(jīng)死了。

5c6a4370-b17b-11ed-bfe3-dac502259ad0.jpg

接下來應(yīng)該是什么樣子?下一對這篇論文就是,應(yīng)該是 20 年的一篇論文。他講將來我計(jì)算的一個(gè)提升有三個(gè)維度,第一個(gè)維度就是軟件,第二個(gè)維度就是算法,第三個(gè)維度就是硬件。

我先講講硬件,針對硬件的一個(gè)精簡,或者硬件的專業(yè)化,比如處理器更精簡,或者基于一個(gè)特定的算法,比如 GPU 或者 DSP 的硬件加速器。第二個(gè)就是新的一個(gè)算法,新的一些算法或者一些機(jī)器模型來去推算。

今天咱們的或者這本書,它能解決的問題是什么?可能是通過把我們的軟件工程,軟件性能工程領(lǐng)域,它里邊有兩個(gè)點(diǎn)。一個(gè)就是把軟件更精簡,再一個(gè)就是把軟件裁剪的更適合于硬件特性。今天其實(shí)這篇這本書里面講的更多的是這塊(軟件裁剪),他并沒有說我是怎么去改硬件,比如是怎么去設(shè)計(jì)一個(gè)芯片。我怎么基于硬件特征讓把相同的程序跑得更好?

在后摩爾時(shí)期,讓你代碼跑得更快,會(huì)越來越重要。尤其是把它裁剪的或者調(diào)優(yōu)的,更適合于它所運(yùn)行的硬件是很關(guān)鍵的。

05 機(jī)會(huì)在哪里?軟件的不同實(shí)現(xiàn)對性能表現(xiàn)上的差異

5c970400-b17b-11ed-bfe3-dac502259ad0.jpg

機(jī)會(huì)在哪里?這個(gè)地方它講了一下,同一個(gè)程序我用 Python 去寫,用 Java 去寫,用 C 去寫。普通的寫法,它的性能以 Python 為基準(zhǔn),比如 Python 是 1, Java 可能就是11,一 C 就是 47 ,如果是把程序簡單做一個(gè)強(qiáng)行的并行化是 366,到最終他用硬件本身的一個(gè)硬件特性,它有 6萬倍(相對于 Python )的增加。這個(gè)時(shí)間差距還是很大的,如果能把充分的把硬件給利用起來,更充分的去適應(yīng)具體的芯片,它的能力會(huì)提出很多。

06 軟件和硬件在性能方面均有能力范圍

5cc6e580-b17b-11ed-bfe3-dac502259ad0.jpg

其實(shí)我們一般都想去依賴于硬件的提升,CPU 提升去提升整體的性能。但是 CPU 它其實(shí)是一個(gè)死的,它并不說你給我隨便也給我一個(gè)指令,我都能把你運(yùn)行。不一定的。對編譯器來說,比如 GCC/LLVM 它是利用它的成本或者一個(gè)成本收益的模型去估算。但是如果他認(rèn)為你可能有個(gè)優(yōu)化的或者一個(gè)轉(zhuǎn)換,它認(rèn)為他可能風(fēng)險(xiǎn)比較大的,或者會(huì)導(dǎo)致他損耗比較高,或什么時(shí)候他就不去做了。他會(huì)比較保守,可能就達(dá)不到默認(rèn)的優(yōu)化的預(yù)期。

07 現(xiàn)在是做軟件優(yōu)化的黃金時(shí)期

所以說現(xiàn)在可能就是最好的一個(gè)時(shí)機(jī)去做軟件優(yōu)化,前段時(shí)間也有人提過一個(gè)黃金十年就是這樣一個(gè)意思。如果對 Google 搜索增加 2% 的一個(gè)速度,可能它的搜索量就會(huì)有 2% 的增加。雅虎之前統(tǒng)計(jì)過,如果它一個(gè)網(wǎng)頁加載時(shí)間如果增加四百毫秒,可能使用率可能會(huì)降5% 到 9%。

但是整個(gè)東西來做,并不是你直接就可以拿到了,需要你深入的去理解你的軟件,還有你的硬件怎么去匹配,但是大家有沒有做好準(zhǔn)備呢?。

08 需要我們怎么做?構(gòu)建自己的技術(shù)棧

5d0a3510-b17b-11ed-bfe3-dac502259ad0.jpg

這時(shí)候需要我們怎么做?可能我們需要構(gòu)建自己的技術(shù)棧。技術(shù)棧有哪些呢?就有這些,跟手機(jī)一樣,手機(jī)應(yīng)用,還有它框架,編譯器,OS,還有硬件??赡軐υ蹅冞@本書里面涉及到的,主要的是這些。

?第一個(gè)就是編譯器,你可能不需要更深入理解編譯器的具體的原理,但是你要了解編譯器通用的編譯優(yōu)化手段,以及它有比較通用的一些編譯優(yōu)化的選項(xiàng)。

?第二個(gè)就是 OS 的一個(gè)調(diào)度,還有一個(gè)可能 CPU 綁核。在手機(jī)上的話,綁核還是很明顯的,如果是在小核上和大核,要是中核,它們也差距很多。硬件的限制。如果你想你的任務(wù)要跑特別快,比如假如一個(gè)特別重要的前臺(tái)功能,你需要把你的主線程一個(gè)界面相關(guān)的線程可能就要綁定到大核上,讓他跑這么快。

?第三個(gè)在硬點(diǎn)上,我可能我們要比較了解 CPU 的微架構(gòu)是什么樣的, CPU 微架構(gòu)什么樣的,為什么我的代碼跑的時(shí)候它就慢,慢又拆解為幾類,怎么去分析它。第二個(gè)你要去可能要去嘗試的去學(xué)習(xí),怎么去讀或者改這些匯編的一些指令。

09 避免性能調(diào)優(yōu)的誤區(qū)

5d2d973a-b17b-11ed-bfe3-dac502259ad0.jpg

接下來我們在性能調(diào)優(yōu)的時(shí)候會(huì)有些誤區(qū),這些誤區(qū)可能有這幾類。

?第一個(gè)就是我看這代碼,我自己猜哪個(gè)地方可能會(huì)有問題,就去改了,結(jié)果可能做了一些修改,其實(shí)對系統(tǒng)沒有任何影響,只是自己在瞎猜。我可能就是猜,但是我并不是知道我具體的數(shù)據(jù)什么樣的,并沒有真實(shí)去測它,這是很恐怖的。從我們公司內(nèi)部來看,我們搞問題的肯定是以終為始,一定要是拿到你具體對用戶體驗(yàn)相關(guān)的一個(gè)具體的問題,它是什么樣的,拿的數(shù)據(jù)來,從數(shù)據(jù)出發(fā)。

?第二個(gè),可能你自己造了比較糟糕的一個(gè) benchmark 和基準(zhǔn)測試,也是非常糟糕。最好是拿比較開源的,大家共同認(rèn)可的一個(gè)。

?最后一個(gè),因?yàn)槎际菍W(xué)計(jì)算機(jī)相關(guān)專業(yè)的哈,可能大家比較信仰大O的這種算法的復(fù)雜度。但是其實(shí)在 CPU 上跑的時(shí)候,它并不一定說 O 你算法復(fù)雜度越低,它跑得越快,這不一定。

10 定位性能問題的方法

5d844800-b17b-11ed-bfe3-dac502259ad0.jpg

這本書其實(shí)講了這幾種方法。

?第一個(gè)方法扣的這樣的一個(gè)插樁,寫代碼打日志,我看到我函數(shù)執(zhí)行特別多,不是前后加日志。

?第二個(gè)生成最簡單火山圖,大家應(yīng)用也比較多了。

?第三個(gè)如果不搞編譯器可能大家用的比較少。 compare opt reports 就是編譯器的一個(gè)優(yōu)化的報(bào)告,你可以打開一個(gè)編譯開關(guān),你在編譯的時(shí)候把它報(bào)告拿出來。這個(gè)地方確實(shí)我用過一次,但我們是在用過幾次,在我們我們公司一個(gè)比較關(guān)鍵的特性里邊,他就報(bào)告里面,我發(fā)現(xiàn)有個(gè)地方,他可能有一個(gè)函數(shù)的內(nèi)聯(lián)沒有做,沒做其實(shí)它性能就比較差,我們做完以后性能有百分之將近 10% 的收益。這是很明顯的。

?再一個(gè)就是 TMA Top-down,也是書上的例子,待會(huì)展開。主要是基于 CPU 架構(gòu),應(yīng)該一個(gè)英特爾的,一個(gè)以色列的專家提出的構(gòu)想,對性能的分析來說是非常好。

?最后一個(gè)是 Roofline 五點(diǎn)線這個(gè)模型,CPU 里邊性能其實(shí)就涉及兩類,一個(gè)是計(jì)算,一個(gè)是訪存。一個(gè)性能與緩存,通過Roofline 線的來判斷,我的當(dāng)前的程序是在哪個(gè)地方。還有再一個(gè)就是我硬件當(dāng)前是什么樣一個(gè)情況,通過這兩個(gè)信息我就知道程序有沒有充分運(yùn)用硬件的能力,它的訪存,它計(jì)算都有沒有運(yùn)用全。所以這個(gè)地方是可以用來進(jìn)行反向的去優(yōu)化我的硬件設(shè)計(jì),也可以來指導(dǎo)我的程序里面怎么去改進(jìn),以及是訪存的類型,我可能就要去優(yōu)化訪存的一個(gè)瓶頸,包括計(jì)算,我可能要從計(jì)算去交流,但這個(gè)目前好像沒有看到特別好的工具。作者也并沒有講,只是有這樣一個(gè)方法。我看到香山開源的 RISC-V 的芯片里面,其實(shí)他們相關(guān)的研究里面應(yīng)該也用到了這種方法。

11 性能優(yōu)化的技術(shù)點(diǎn)

5daa935c-b17b-11ed-bfe3-dac502259ad0.jpg

剛才分析完了,我具體評(píng)定以后可能有哪些的優(yōu)化的方法。

?PGO(Profile GuidedOptimization),其實(shí)在手機(jī)上,在每個(gè)任何一個(gè)安卓手機(jī)上,它其實(shí)都在用。用戶用的時(shí)候它會(huì)產(chǎn)生profile,在虛擬機(jī)里面的產(chǎn)生 profile 采集用戶用的這些函數(shù)的次數(shù),它會(huì)都會(huì)收集起來。例如,等到晚上手機(jī)充電的時(shí)候,你如果關(guān)注晚上充電的時(shí)候就摸一下,可能比較燙,一個(gè)原因是充電的燙就可能后臺(tái)做相關(guān)的一些任務(wù),就是要基于 profile 進(jìn)行函數(shù)的一個(gè)指導(dǎo)編譯,因?yàn)樗幙赡芤粋€(gè)是比較大,再一個(gè)可能就比較激進(jìn)?;趐rofile 的調(diào)用關(guān)系,可能更多的可能會(huì)把一些函數(shù)依賴,或者把一些函數(shù)之間的距離可能給它重新排一下,這樣它調(diào)進(jìn)的時(shí)候,它 attach miss 就會(huì)比較小,會(huì)好一點(diǎn)。

?Vectorization 是向量化。

?Memory prefetching,后邊會(huì)講一個(gè) memory prefetching 的例子。

?Optimize code layout,把你的代碼的樣子優(yōu)化一下。

?Function inlining,函數(shù)內(nèi)聯(lián)其實(shí)是用的挺多的,包括安卓它本身其實(shí)在虛擬機(jī)的修改,它在 AndroidT版本的修改,很多都是把函數(shù)進(jìn)行 inline,再進(jìn)行優(yōu)化的。剛才提到我們內(nèi)部也用了,針對一些個(gè)別場景,也會(huì)把一些函數(shù),尤其for循環(huán),比如在某一個(gè)函數(shù)的時(shí)候,它都會(huì)有調(diào)用慣例,這樣它會(huì)要壓棧出棧,這樣去還要保存寄存器里的信息,就會(huì)很損耗,把它去掉會(huì)好很多。

?Optimize memory accesses,在一些內(nèi)存的訪問的時(shí)候,比如讓它對齊。

?還有一些循環(huán)展開,再利用一些技術(shù)消除一些分支的預(yù)測的信息。

12 實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)

5dc94130-b17b-11ed-bfe3-dac502259ad0.jpg

提到了一些方法,在書里面其實(shí)提到了一個(gè)是 perf。其實(shí)這還有一個(gè)叫 pmu-tools, Vtune 的一個(gè)開源版,Vtune 是一個(gè) Intel 開發(fā)的一個(gè)工具,專門用于 Intel 的 PMU 架構(gòu)。 pmu-tools 是開源的一個(gè)工具。

再補(bǔ)充一下。今天材料主要就是原作者丹尼斯,他在 21 年對他寫的當(dāng)時(shí)做的一個(gè)材料,主要是也介紹梳理一些內(nèi)容。我的要聞把材料稍微改了一下,稍微補(bǔ)充一些信息。

13 Top-down 微體系結(jié)構(gòu)分析方法

5decf95e-b17b-11ed-bfe3-dac502259ad0.jpg

這個(gè)給大家展示個(gè)例子哈。

首先我們看一下主要目的,給大家簡單的介紹一下什么是 Top-down。首先我先講一下 CPU 流水線。 CPU 流水線它其實(shí)有這幾個(gè)階段,一個(gè)指令都它執(zhí)行,是怎么執(zhí)行?它有一個(gè)取指-譯指-執(zhí)行-保存-回寫,其中前兩個(gè)階段是前端,主要是指令相關(guān)的,后三個(gè)階段是后端,主要是訪存相關(guān)的。如果其中有一個(gè)阻塞了,可能會(huì)導(dǎo)致空轉(zhuǎn),它的英文叫bound,比如 front and bound 和 back and bound, front and bound 可能是我取值的時(shí)候時(shí)間長。取指時(shí)間原因可能有多種,下面分這幾類。

指令一個(gè)是從這里面可能開始取過來,再進(jìn)行分發(fā),再給decode,再往下是執(zhí)行后端了。執(zhí)行的時(shí)候他可能不同的單元,我們可能要去不同的port,這個(gè) port 里面給他去執(zhí)行。前后端是這樣串起來的。

到于指令執(zhí)行的時(shí)候,我們可以基于它 store 的在哪個(gè)階段給它進(jìn)行一個(gè)分類。第一層分了 4 類。

?第一個(gè)就是 Retiring ,你就退休了,你壽終就寢就行了。指令已經(jīng)執(zhí)行到五個(gè)階段,我都已經(jīng)執(zhí)行完了。OK,這是最好的一種狀態(tài)。如果所有的都是這塊,基本上相當(dāng)于就已經(jīng)自由了。完全利用了CPU 的整個(gè)流水線是非常好,但是基本上是不可能的,基本上不可能。

?第二個(gè)就是 Bad Speculation,錯(cuò)誤的投機(jī)。有時(shí)候它可能會(huì)去提前執(zhí)行一些指令,比如有個(gè) if-else,我們可能我不知道它是指哪一個(gè),可能要投機(jī)去執(zhí)行了,我先執(zhí)行,我執(zhí)行完以后,我先不提交,提交給寄存器處理。這地方會(huì)給他進(jìn)行一個(gè)判斷,等到你真正的判斷執(zhí)行完了,如果你是對的,OK,我這部分信息我就提交過去,這邊就執(zhí)行完了。如果不對,我覺得你這個(gè)特性,我就把它都給它清掉,CPU 就在這里邊執(zhí)行的流水線執(zhí)行,相當(dāng)于這段時(shí)間這份資源就浪費(fèi)了,這一部分也會(huì)造成一定損失,這個(gè)也是希望它小的。

?第三個(gè)就是 Frontend Bound,剛提到這個(gè)取指的時(shí)候可能會(huì)慢。

?第四個(gè)叫 Backend Bound,一般比較多的。

然后再往下一層。

?Retiring 里面,可能還有一特殊的,到時(shí)候看書的可能也會(huì)提到,一般浮點(diǎn)可能會(huì)有問題。

?Bad Speculation 一般也他們很難去優(yōu)化它,可能也會(huì)有些困難。

?Frontend Bound 主要是兩類,取指令它有兩種,一個(gè)是延遲,一種是帶寬。帶寬大家可以看到帶寬過來,因?yàn)閹捥貏e窄,我可能取特別多。帶寬特別窄的時(shí)候我可能就取不過來了,取不過來我就等帶寬;延遲的話,我可能我取個(gè)指令的時(shí)候,可能我代碼編譯的可能特別大,比如他是剛執(zhí)行的 A ,執(zhí)行 B 并沒有在這里挨著,可能特別遠(yuǎn)。這時(shí)候我可能要去從我的內(nèi)存或者那地方再把它倒過來,那時(shí)候就會(huì)遇到 iTLB Miss 或者 i-Cache Miss,這時(shí)候就會(huì)導(dǎo)致等了時(shí)間會(huì)比較長。

?Backend Bound 分兩類,一個(gè)是 Core Bound ,一個(gè)是 Memory Bound 。 Core Bound大家簡單理解,計(jì)算類的,比如我可能我計(jì)算特別多,假如加法特別多,或者除法特別多的時(shí)候,這時(shí)候如果應(yīng)付不過來,這時(shí)候就會(huì)產(chǎn)生 Core Bound ,這地方可能會(huì)獲得時(shí)間比較長;最后一個(gè)就是 Memory Bound,這可能大家用的會(huì)相對可能會(huì)多一點(diǎn)。但是 Memory Bound 并不是直接指的內(nèi)存。里邊分好幾層,一個(gè)是L1/L2/L3 ,還有一個(gè) DRAM Bound ,可能執(zhí)行過程中我需要讀數(shù)據(jù),從讀數(shù)據(jù)的時(shí)候接著開始讀數(shù)據(jù),如果在開始, L1 開始有了,OK,那就沒問題。最快的 L1 開始沒有,隨 L2 就會(huì)增加一些損耗。最好。如果 L2 沒有,隨 L3 再增加一些損耗。如果 L3 也沒有,那就得去 DRAM 里邊去取,時(shí)間會(huì)更長。在下面的涉及到 memory 這些帶寬,更大的 latency 。

OK,這就是 Top-down 的一個(gè)拆解。基于拆解以后,你很明確的可以知道你的程序在 CPU 運(yùn)行的時(shí)候,到底依賴是哪個(gè)資源。你回過頭來,在不能改變硬件情況下,你怎么去改你的程序,把它更好的利用 CPU 的流水線或者它微架構(gòu),讓它運(yùn)行更快。

14 TMA分析實(shí)例 - 源碼

5e2a73e2-b17b-11ed-bfe3-dac502259ad0.jpg

這個(gè)實(shí)例也比較簡單,我 malloc 一塊內(nèi)存,這內(nèi)存是 200 M 的,每個(gè)里面都寫個(gè) 0。我要干什么?我要寫一個(gè)這么大的循環(huán),應(yīng)該是一億次的一個(gè)循環(huán),每個(gè)循環(huán)我就隨機(jī)的訪問這一刻從 0 到 200M 內(nèi)存。訪問內(nèi)存,它運(yùn)行這個(gè)時(shí)間一般是 8. 5 秒。

怎么去通過用 Top-down 這個(gè)方法來進(jìn)行分析。其實(shí)補(bǔ)充一下,在 Linux 上,它英特爾應(yīng)該都是支持 perf,里面它有個(gè) Top-down 的一個(gè)選項(xiàng),你可以試一下。它可以統(tǒng)計(jì)出來一層的我到底是哪種類型的 Bound,這里邊用的是 pmu-tools 這個(gè)方法。

15 TMA分析實(shí)例 - 1和2層分布

5e4e990c-b17b-11ed-bfe3-dac502259ad0.jpg

你可以看出來,它程序運(yùn)行的過程中,它 53% 是在 Backend Bound ,我剛才已經(jīng)看到 Backend Bound 是在后邊的一個(gè)。再看第二層,就是 L2 ,在 L2 可以看到,在這里面是 Memory Bound,對 Core Bound 是只有 8.80%,也不多。

16 TMA分析實(shí)例 - 3層分布

5e75ee62-b17b-11ed-bfe3-dac502259ad0.jpg

再看第三個(gè) L3,L3 的 DRAM Bound,圖里邊右下角 Bound 時(shí)間,整個(gè)時(shí)間是整個(gè)占比47%。你可以看到里面每個(gè) cycle 的時(shí)間,如 register 基本上一個(gè) cycle 就搞定了,L1 就可能是 8 ~ 32 cycles ,L2 是 300 cycles ,已經(jīng)到 memory 了。memory 很多,你越低速度越慢時(shí)間越長。

17 TMA分析實(shí)例 - 通過perf定位到具體函數(shù)

5e9942ea-b17b-11ed-bfe3-dac502259ad0.jpg

然后怎么去定位它?有一個(gè)地方有對應(yīng)關(guān)系,這個(gè)工具理論是英特爾提出來的。英特爾有一個(gè)叫TMA metrics,大家可以在書上可以看到它有對應(yīng)表格,剛才可以看到它是 DRAM Bound 類型的,它的也需要會(huì)給你提供另外一個(gè) L3 miss 的這樣一個(gè) PMU 的事件讓你去用,你可以去統(tǒng)計(jì) L3 Miss 以后,它就會(huì)到 DRAM 那里面去 L3 Miss 事件哪個(gè)最多,它通過 perf record 完以后,跟通過他去。可以通過解析審核的 data 文件, prop data 可以看到,這里面主要是復(fù)制函數(shù),里面他用到的是 move 的一個(gè)緩存的動(dòng)作,100% 都在這個(gè)地方。

18 TMA分析實(shí)例 - 通過__buildin_prefetch內(nèi)存預(yù)取優(yōu)化

怎么去優(yōu)化它?在 for 循環(huán)里邊它不是有一個(gè),剛才代碼里面可以看到它是隨機(jī)的去訪問它里邊的一個(gè)地址。

OK,他現(xiàn)在預(yù)計(jì)他提前能預(yù)取出來。它有三個(gè)參數(shù),第一個(gè)參數(shù)就是我預(yù)取的它的地址是哪一塊,把它預(yù)取到 cache 里邊來。第二個(gè)參數(shù) 0 代表是相當(dāng)于我是讀的,第三個(gè)參數(shù) 1 代表它的程度。第三個(gè)參數(shù)如果是 0 檔基本上我是本地,不是本地的我不取。我認(rèn)為這塊取了以后可能用的不特別多。 1 檔代表比較低程度, 2 檔代表比較中度的, 3 檔代表是高度的。

現(xiàn)在用__buildin_prefetch ,我理解應(yīng)該是可以緩解 L3 Miss 這一部分。改完以后效果,這個(gè)事件原來應(yīng)該是比原來相對小了 10 倍。大家可以看一下整個(gè)運(yùn)行性能,提升了 2 秒,原來是 8. 5,基本上也是 30% 的加速這樣一個(gè)模型。

19 性能分析調(diào)優(yōu)建議

5f11bf22-b17b-11ed-bfe3-dac502259ad0.jpg

最后丹尼斯在他書上也反復(fù)提了他的優(yōu)化建議。最后其實(shí)他有很多,挑出來這一部分翻譯成中文。大家一起來看一下。

?第一個(gè)默認(rèn)情況下軟件,它并不會(huì)到達(dá)你最優(yōu)的一個(gè)性能,寫完代碼以后,你認(rèn)為可能是有,但是它并不一定非常契合你的硬件,可能你需要還要針對硬件做一些針對性的優(yōu)化。

?剛才也提到,硬件性的自然速度就不如過去幾年了,是將來軟件性能調(diào)優(yōu),可能也是提前性能提升性能提升的有關(guān)鍵驅(qū)動(dòng)力。

?再一個(gè)就是要構(gòu)建你的技術(shù)棧, CPU微體系結(jié)構(gòu), v 架構(gòu),還有閱讀匯編代碼,還有操作指令測算系統(tǒng)的一些內(nèi)核的機(jī)制,還有一些編譯優(yōu)化的選項(xiàng)等等。

?再就是避免性能的誤區(qū),一定要去通過測量,通過以實(shí)時(shí)數(shù)據(jù)的角度來去指導(dǎo)你性能的一個(gè)分析,還有優(yōu)化

?善于使用他們剛才提到的這些工具,進(jìn)行代碼中的一個(gè)性能分析,先練習(xí)修復(fù)他們。





審核編輯:劉清

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

    關(guān)注

    68

    文章

    19881

    瀏覽量

    234828
  • dsp
    dsp
    +關(guān)注

    關(guān)注

    556

    文章

    8155

    瀏覽量

    356990
  • 數(shù)據(jù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    627

    瀏覽量

    29143
  • 硬件加速器
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    13044

原文標(biāo)題:朱金鵬:基于CPU性能調(diào)優(yōu)的必要性和方法

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HBase性能調(diào)優(yōu)概述

    HBase性能調(diào)優(yōu)
    發(fā)表于 07-03 11:35

    芯片返修的必要性

    `芯片返修即通過將失效的元件從失效位置取下,代之以正確的元件,從而恢復(fù)產(chǎn)品全部正確特性的工藝過程。芯片返修的必要性:1.高價(jià)值的產(chǎn)品2.工藝復(fù)雜的產(chǎn)品3.科研需要4.OEM/EMS成本控制的需要`
    發(fā)表于 05-09 16:34

    車載Ethernet降噪措施的必要性

    什么是車載Ethernet車載Ethernet降噪措施的必要性
    發(fā)表于 12-30 06:49

    去耦電容有哪些類型?正確去耦有何必要性?

    何為去耦技術(shù)?正確去耦有何必要性?去耦電容有哪些類型?不良去耦技術(shù)對性能的影響是什么
    發(fā)表于 03-11 08:14

    虛擬儀器為什么要校準(zhǔn)?有什么必要性?

    虛擬儀器由那幾部構(gòu)成?虛擬儀器為什么要校準(zhǔn)?有什么必要性
    發(fā)表于 04-12 06:10

    接口電路的必要性

    文章目錄【 0. 接口電路 】【P0口】【P1口】【P2口】【P3口】【 0. 接口電路 】接口電路的必要性:\color{red}{接口電路的必要性:}接口電路的必要性:?計(jì)算機(jī)對外設(shè)進(jìn)行數(shù)據(jù)操作
    發(fā)表于 07-29 08:09

    機(jī)床數(shù)控化改造的必要性及其改造方法

    機(jī)床數(shù)控化改造的必要性及其改造方法 : 本文首先介紹了機(jī)床數(shù)控化改造的必要性,然后簡單介紹了機(jī)床數(shù)控化改造的內(nèi)容及其的優(yōu)缺點(diǎn),而重點(diǎn)在于介紹如何進(jìn)行機(jī)床數(shù)控化改造,包括數(shù)控系統(tǒng)的選擇、數(shù)控改造中
    發(fā)表于 09-09 08:27

    CD/CMOS模組加裝防***的必要性是什么?

    CD/CMOS模組加裝防***的必要性是什么?
    發(fā)表于 01-14 06:24

    安全完整等級(jí)的認(rèn)證的重要必要性

    安全完整等級(jí)的認(rèn)證的重要必要性 主要講述功能安全(安全完整等級(jí))的認(rèn)證的重要必要性
    發(fā)表于 04-01 14:16 ?26次下載

    機(jī)床數(shù)控化改造的必要性及其改造方法

    機(jī)床數(shù)控化改造的必要性及其改造方法     本文首先介紹了機(jī)床數(shù)控化改造的必要性,然后簡單介紹了機(jī)床數(shù)控化改造的內(nèi)
    發(fā)表于 02-24 15:48 ?2144次閱讀

    infosphere CDC性能調(diào)優(yōu)的文檔

    infosphere CDC性能調(diào)優(yōu)的文檔
    發(fā)表于 09-07 09:30 ?7次下載
    infosphere CDC<b class='flag-5'>性能</b><b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>的文檔

    多線程架構(gòu)存在的必要性

    多線程架構(gòu)存在的必要性說明。
    發(fā)表于 03-26 11:22 ?8次下載
    多線程架構(gòu)存在的<b class='flag-5'>必要性</b>

    javajvm調(diào)優(yōu)有幾種方法

    JVM調(diào)優(yōu)是Java應(yīng)用程序性能優(yōu)化過程中的重要步驟,它通過針對JVM進(jìn)行優(yōu)化來提高應(yīng)用程序的性能和可靠。JVM
    的頭像 發(fā)表于 12-05 11:11 ?2419次閱讀

    鴻蒙開發(fā)實(shí)戰(zhàn):【性能調(diào)優(yōu)組件】

    性能調(diào)優(yōu)組件包含系統(tǒng)和應(yīng)用調(diào)優(yōu)框架,旨在為開發(fā)者提供一套性能
    的頭像 發(fā)表于 03-13 15:12 ?838次閱讀
    鴻蒙開發(fā)實(shí)戰(zhàn):【<b class='flag-5'>性能</b><b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>組件】

    集成芯片的重要必要性

    集成芯片在現(xiàn)代科技和工業(yè)中占據(jù)著至關(guān)重要的地位,其重要必要性主要體現(xiàn)在以下幾個(gè)方面。
    的頭像 發(fā)表于 03-18 15:17 ?1786次閱讀