Cache的容量一般都很小,即使是最大的三級 Cache(L3)也只有20MB ~30MB。cache加快了CPU對內(nèi)存的讀寫速率,CPU第一次執(zhí)行需要將數(shù)據(jù)時候需要從主存-->L3 Cache--->L2 Cache -->L1 Cache傳遞到CPU的計算單元。cache分成多個組,每個組分成多個行,linesize是cache的基本單位,從主存向cache遷移數(shù)據(jù)都是按照linesize為單位替換的。下面通過C代碼和Intel手冊詳細(xì)理解cache參數(shù)。
Intel CPU可以通過CPUID命令獲取cpu相關(guān)信息,查詢Intel可以獲取到相應(yīng)的指令信息,獲取cache 參數(shù)有下面兩種方法:分別是當(dāng)CPUID指令I(lǐng)nitial EAX Value為0x02和0x04時候,由于方法一種CPUID指令的入口參數(shù)存放在EAX寄存器中,所以獲取cache信息需要給EAX寄存器賦值為0x02,然后分別讀取EAX、EBX、ECX、EDX四個寄存器得到Cache and TLB Information。查看Intel手冊(圖1)得到方法一的指令碼。
圖1
參考Linux內(nèi)核中header.c文件中的cpuid函數(shù)實現(xiàn)獲取cache代碼函數(shù),圖2有兩種方式實現(xiàn)獲取cache函數(shù),原理都是一樣,賦值然后讀取值。
圖2
本次試驗采用gcc 4.7.2版本編譯程序并且運行得到如下結(jié)果:
d_eax : 55035a01
d_ebx : f0b2de
d_ecx : 0
d_edx : 9ca212c
查看intel 手冊可以得到每個字節(jié)的解釋,ebx寄存器中低八位查表得到如圖3所示相關(guān)信息,3級cache 容量6M,12路組相連(每組有12個line),每個line大小為64 字節(jié)。其它信息查表得到如下:
EAX:
(55h) Instruction TLB: 2-MB or 4-MB pages, fully associative, 7 entries
(03h) Data TLB: 4-KB Pages, 4-way set associative, 64 entries
(5Ah) Data TLB0: 2-MB or 4-MB pages, 4-way associative, 32 entries
(01h) Instruction TLB: 4-KB Pages, 4-way set associative, 32 entries
EBX:
(F0h) 64-byte Prefetching
(B2h) Instruction TLB: 4-KB pages, 4-way set associative, 64 entries
(DEh) 3rd-level cache: 6-MB, 12-way set associative, 64-byte line size
EDX:
(09h) 1st-level Instruction Cache: 32-KB, 4-way set associative, 64-byte line size
(CAh) Shared 2nd-level TLB: 4-KB pages, 4-way set associative, 512 entries
(21h) 256KB L2 (MLC), 8-way set associative, 64-byte line size
(2Ch) 1st-level data cache: 32-KB, 8-way set associative, 64-byte line size
從上面信息得到當(dāng)前CPU的cache信息如下:
L1 Cache : 32KB , 8路組相連,linesize為 64Byte 64個組
L2 Cache:256KB 8路組相連,linesize為 64Byte 512個組
L3 Cache:6MB 12路組相連,linesize為 64Byte 8192個組
圖3
獲取cache參數(shù)的另外一種方法,查閱Intel手冊(圖4)得到當(dāng)CPUID的Initial EAX Value為0x04時得到cache十六進制數(shù),在根據(jù)圖4中的編碼信息獲取cache詳細(xì)參數(shù),執(zhí)行該CPUID命令時還需要設(shè)置另外一個入口參數(shù)ECX,ECX寄存器設(shè)置我們需要查詢哪一個cache ,ECX的輸入與cache對應(yīng)如下:
0:L1D
1:L1I
2:L2
3:L3
圖4
執(zhí)行CPUID Initial EAX Value 等于0x04時,返回的EAX、EBX、ECX、EDX寄存器值得位信息如圖5所示。
圖5
EAX[4:0]=1,表示這是一個數(shù)據(jù)Cache。EAX[7:5]=1,表示該Cache的級別為1,即為L1D。EAX[8]=1表示該Cache處于自初始化的Cache層(Seache Level)。EAX[9]=0,表示此Cache不是全相聯(lián)Cache。EAX[25:14]=1表示能夠共享此Cache的最大線程數(shù)為2。EAX[31:26]=15,表示這個處上,最多支持16個核心。EBX[11:0]=63表示Cache LineSize為64字節(jié)。EBX[21:12]表示此Cache不支持硬件Cache Line分區(qū)。EBX[31:22]=7,表示此Cache為8路組相聯(lián)
7表示此Cache的組數(shù)為8組。
獲取L3 cache詳細(xì)參數(shù)代碼如圖6所示:
圖6
代碼運行結(jié)果如下:
d_eax : 163
d_ebx : 2c0003f
d_ecx : 1fff
d_edx : 6
計算L3 cache容量公式如下:
Size = (Ways + 1) * (Partitions + 1) * (Line_Size + 1) * (Sets + 1)
= (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1)
=(0x2c0003f>>22+1)*((0x2c0003f&0x003FF000)>>12+1)*(0x2c0003f&0x00000FFF+1)*(0x1fff+1)
= 6291456 B=6144 K=6M
獲取其它cache 只需要修改傳入cpuid的ecx參數(shù),如果需要獲取CPU的其它信息,可以查看Intel 指令手冊修改傳入EAX參數(shù)的值
-
Cache
+關(guān)注
關(guān)注
0文章
129瀏覽量
28453 -
代碼
+關(guān)注
關(guān)注
30文章
4837瀏覽量
69132
原文標(biāo)題:幾行C代碼剖析Cache參數(shù)
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C6678芯片CACHE設(shè)置問題
如何理解C6678中關(guān)于cache的描述?
關(guān)于C6747的cache
關(guān)于芯片數(shù)據(jù)手冊參數(shù)理解的問題
代碼編譯器Studio V2.3版本的Cache詳細(xì)資料分析概述
![<b class='flag-5'>代碼</b>編譯器Studio V2.3版本的<b class='flag-5'>Cache</b><b class='flag-5'>詳細(xì)</b>資料分析概述](https://file.elecfans.com/web1/M00/50/24/o4YBAFrvseSABvwiAABwixStcrA546.png)
MPU6050陀螺儀通過I2C傳遞數(shù)據(jù)的C語言源代碼免費下載
![MPU6050陀螺儀<b class='flag-5'>通過</b>I2<b class='flag-5'>C</b>傳遞數(shù)據(jù)的<b class='flag-5'>C</b>語言源<b class='flag-5'>代碼</b>免費下載](https://file.elecfans.com/web1/M00/BE/3F/o4YBAF7grVKAJs3FAAUyIiPVKk8927.png)
SPI總線驅(qū)動的C語言源代碼詳細(xì)概述
cache對寫好代碼真的有那么重要嗎
![<b class='flag-5'>cache</b>對寫好<b class='flag-5'>代碼</b>真的有那么重要嗎](https://file.elecfans.com/web2/M00/0B/95/poYBAGD-ZA-AcjoOAAAR-VMRSFM271.png)
Page Cache是什么 一文帶你深入理解Linux的Page Cache
![Page <b class='flag-5'>Cache</b>是什么 一文帶你深入<b class='flag-5'>理解</b>Linux的Page <b class='flag-5'>Cache</b>](https://file.elecfans.com/web2/M00/18/A6/pYYBAGFvtO2AHDbwAAAckt23Lrc626.png)
什么是 Cache? Cache讀寫原理
深入理解Cache工作原理
![深入<b class='flag-5'>理解</b><b class='flag-5'>Cache</b>工作原理](https://file1.elecfans.com/web2/M00/88/E0/wKgaomR1reyALuZjAAA5QafdIA8632.png)
評論