自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用CPU緩存實現(xiàn)高性能程序

商務(wù)辦公
我們選購電腦時,CPU處理器的配置會有緩存大小,它是CPU性能的重要指標。為什么呢?因為CPU計算速度與訪問主存速度非常不匹配!

[[261662]]

我們選購電腦時,CPU處理器的配置會有緩存大小,它是CPU性能的重要指標。

 

利用cpu緩存實現(xiàn)高性能程序

為什么呢?因為CPU計算速度與訪問主存速度非常不匹配!

先來看計算速度。單顆CPU計算速度目前在2GHz-4GHz之間,以2.5GHz計即每秒鐘計算25億次,每個時鐘周期耗時1/2.5GHz==0.4納秒。當前所有的計算機都遵循馮諾依曼結(jié)構(gòu),所以執(zhí)行任何指令(例如加法操作)的流程必然遵循下圖:

 

利用cpu緩存實現(xiàn)高性能程序

所以,做一次加法的指令是由多個時鐘周期組成的(如取指令和數(shù)字、放入寄存器、執(zhí)行ALU、將結(jié)果寫回主存),做ALU執(zhí)行指令僅需要1個時鐘周期,而取指令或者取數(shù)據(jù)、回寫結(jié)果數(shù)據(jù)就需要與主存打交道了。CPU訪問內(nèi)存(主存)的速度非常慢,訪問一次常常需要上百納秒以上,這與計算指令有千倍的差距!怎樣解決訪問主存慢導致的CPU計算能力的浪費呢?加入CPU緩存!

CPU上增加緩存后,由于CPU緩存離CPU核心更近,所以訪問速度比主存快得多!如果我們訪問內(nèi)存時,先把數(shù)據(jù)讀取到CPU緩存再計算,而下次讀取到該數(shù)據(jù)時直接使用緩存(若未被淘汰掉),這在時間和空間上都會降低CPU計算能力的浪費!在時間上,有些數(shù)據(jù)訪問頻率高(熱點),多次訪問之間都未被淘汰出緩存;在空間上,緩存可以同時加載相鄰的數(shù)據(jù)、代碼,這樣函數(shù)、循環(huán)的執(zhí)行都在使用緩存中的數(shù)據(jù)。

CPU緩存是分為多級的,原因是熱點數(shù)據(jù)太大了!最快的緩存一定離CPU核心最近,因為體積小所以容量也最小,不能滿足以MB計算的熱點數(shù)據(jù)。最終發(fā)展出了三級緩存,分別稱為L1、L2、L3級緩存。這三級緩存的訪問速度各不相同,但都遠大于訪問主存的速度(訪問時間更小),如下圖所示:

利用cpu緩存實現(xiàn)高性能程序

可見,L1和L2的緩存訪問速度非??欤挥胁坏?ns,L3稍慢一些,但都遠小于訪問主存的速度。當然,CPU緩存的大小也遠小于主存的大小,如本文最開始的那張圖,現(xiàn)在的CPU緩存往往只有幾十MB。如果大家點擊具體的CPU細看緩存,可以看到intel只標明了smart cache,如下圖所示(intel e5-2620 v4):

利用cpu緩存實現(xiàn)高性能程序

這個smart cache其實就是L3緩存,現(xiàn)在的CPU都是多核心的,而smart cache就是智能的被多CPU核心共用的意思。那么L1、L2緩存大小為什么不標出來呢?其實沒有必要,因為通常L1就是32KB,而L2是256KB,在linux上我們可以直接看到:

利用cpu緩存實現(xiàn)高性能程序

這里,index0和index1分別代表L1緩存中的指令緩存和數(shù)據(jù)緩存,index2是L2緩存,index3就是L3緩存。也可能一個緩存由多個CPU共享,仍然以E5-2620 v4這個8核16線程的CPU為例:

利用cpu緩存實現(xiàn)高性能程序

筆者的服務(wù)器有兩顆e5,所以表現(xiàn)為32顆邏輯CPU。由于intel的超線程技術(shù),所以兩顆邏輯CPU對應(yīng)一顆物理CPU。簡單插一下何謂超線程技術(shù):由于訪問主存的速度太慢,所以intel想了一個主意,就是當CPU在等待從主存中調(diào)入數(shù)據(jù)或者指令時,同時做另一個任務(wù),這樣一顆CPU就表現(xiàn)為兩顆邏輯CPU,如下圖所示:

利用cpu緩存實現(xiàn)高性能程序

從shared_cpu_list可見,20MB的L3緩存被16顆邏輯CPU(8顆物理CPU)共享,而L2和L1都是由一顆物理CPU獨占的。

CPU緩存與主存交換數(shù)據(jù)每次大小是固定的,我們稱其為cpu cache line,在64位系統(tǒng)下通常是64字節(jié),在linux下可以這么獲取該值:

利用cpu緩存實現(xiàn)高性能程序

在C語言程序里,可以通過sysconf (_SC_LEVEL1_DCACHE_LINESIZE)獲取,例如在nginx 1.13.8版本后是這么獲取的:

利用cpu緩存實現(xiàn)高性能程序

為什么需要cpu cache line這個數(shù)值呢?因為它對提高性能是有用的!比如nginx中存儲http header的hash表。假設(shè)我們的cache size是64字節(jié),而一個hash bucket是48字節(jié)。假如某一個bucket的起始地址是1F7D030,那么它占用的內(nèi)存就從1F7D030到1F7D05F,而cache size的特性導致只會從64的整數(shù)倍地址訪問,于是需要訪問兩次:1F7D000和1F7D040。而如果我們能使得hash bucket大小是cache size的整數(shù)倍,那么就不會出現(xiàn)訪問一個hash bucket需要兩次操作主存的情況。比如,若原本bucket size是32,則設(shè)為64;原本為96,則設(shè)為128,即向上對齊。nginx有一個向上對齊函數(shù)就是做這個事的:

利用cpu緩存實現(xiàn)高性能程序

上面這個ngx_align算法來源于一個數(shù)學特性:對于正整數(shù)2^n(n>1)來說,存在這樣的特性,如果整數(shù)X是2^n的整數(shù)倍,則X的二進制形式的低n位為0, 如果X不是2^n的整數(shù)倍,則X與(~(2^n-1))進行與運算可以得到一個與X相近的是2^n整數(shù)倍的正整數(shù)。對于上對齊,則需要先加上2^n-1,再進行上述運算。

事實上,如果hash bucket沒有對齊cache line,那么出現(xiàn)訪問一個bucket要調(diào)用兩次載入主存數(shù)據(jù)的操作可能性非常大!比如上面的例子中hash bucket size是48,即使***個bucket沒有跨cache line,第2個bucket一定會跨從而導致兩次主存訪問!

當CPU獲取數(shù)據(jù)時,cpu緩存由于已經(jīng)存有數(shù)據(jù),那么核心可以直接使用緩存,不用再去訪問內(nèi)存了,這一過程我們稱為cache hit***!反之,稱為cache miss??梢姡绻覀兊某绦蛟谘h(huán)或者熱點代碼中,能夠控制數(shù)據(jù)規(guī)模,使之長期落在CPU緩存中,那么性能就可以提升!怎么判斷CPU緩存***率現(xiàn)在是多少呢?在linux下可以通過perf命令輕松實現(xiàn)(centos下通過yum install perf安裝),如下所示:

利用cpu緩存實現(xiàn)高性能程序

當然,perf支持很多事件,包括進程上下文切換等,上面的cache-references,cache-misses兩個事件分別代表緩存***和未***。perf支持的事件很多,如下表所示:

利用cpu緩存實現(xiàn)高性能程序

使用perf來定位程序性能的瓶頸是個有效的辦法!

責任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2025-02-04 10:58:16

2020-09-23 09:21:56

CPUCache緩存

2009-02-27 14:46:09

AjaxGWT開發(fā)

2019-03-14 15:38:19

ReactJavascript前端

2012-09-28 11:02:59

NVIDIAARM架構(gòu)高性能

2024-12-25 14:03:03

2021-05-27 10:02:57

Go緩存數(shù)據(jù)

2024-02-26 11:03:05

golang緩存數(shù)據(jù)庫

2018-03-26 09:02:54

MongoDB高可用架構(gòu)

2011-06-21 14:23:15

GPUCPU高性能計算

2014-04-09 10:50:01

Squid架構(gòu)緩存服務(wù)器

2025-04-07 00:00:00

CaffeineJava數(shù)據(jù)存取

2023-09-18 09:10:11

Golang高性能緩存庫

2023-11-01 11:51:08

Linux性能優(yōu)化

2019-11-14 14:30:10

Java類反射代碼

2019-09-19 16:59:04

數(shù)據(jù)結(jié)構(gòu)設(shè)計數(shù)據(jù)庫

2020-02-06 13:40:35

編程緩存優(yōu)化

2024-07-31 08:31:13

2009-05-08 09:01:03

微軟Windows 7操作系統(tǒng)

2009-03-31 18:49:31

Nehalem四核Intel
點贊
收藏

51CTO技術(shù)棧公眾號