CPUID與Cache資訊的獲取

2021-06-13 16:30:00 字數 2842 閱讀 1375

cpuid與cache資訊的獲取

上週一位同事問道getconf與sysconf()在xeon e5620機器上獲取的cache相關資訊為全0的問題。通過分析glibc中sysconf()的實現,現已查明。

在我們的環境中,glibc的版本為2.5。而實現sysconf()函式時,採用了cpuid指令。但是並沒有考慮到該指令最新的變化。故在e5620處理器上得到的cache相關資訊全部為0。

我們首先說一下cpuid指令。在是x86平台上用於獲取處理器相關資訊的指令。比如處理器的字串標識、支援的功能集合、cache資訊、tlb資訊等。在較老的處理器上,我們使用此指令獲取cache資訊的方法為:將eax暫存器置為2,然後呼叫cpuid指令。指令的返回值儲存在eax、ebx、ecx、edx暫存器中。看官可嘗試使用以下**。

voidget_cache_info()

unsigned int eax = 0;

unsignedint ebx = 0;

unsigned int ecx = 0;

unsigned int edx = 0;

asm volatile ("mov $2, %%eax; cpuid" : "=a"(eax), "=r" (ebx),

"=c" (ecx), "=d" (edx) :);

printf("eax: %x\n", eax);

printf("ebx: %x\n", ebx);

printf("ecx: %x\n", ecx);

printf("edx: %x\n", edx);

以xeon(r) e5530 cpu為例,我們可以得到以下結果:

eax: 55035a01

ebx: f0b2e4

ecx: 0

edx: 9ca212c

這些數字的具體含義為:

1.            0x55:指令tlb資訊,支援4-kb,2-mb or 4-mb大小的頁面,全相聯,128項。

2.            0x03: 資料tlb資訊,支援4kb頁面,4路組相聯,64項。

3.            0x5a: 資料tlb0資訊,支援2-mb或4-mb大小的頁面,4路組相聯,32項。

4.            0x01: 指令tlb資訊,支援4-kb大小的頁面,4路組相聯。

5.            0xf0: 每次預取64位元組。

6.            0xb2: 指令tlb資訊,支援4-kb大小的頁面,4路組相聯,64項。

7.            0xe4: l3 cache資訊,大小為8mb,16路組相聯,cache line大小為64位元組。

8.            0x09: l1指令cache資訊,32kb大小,4路組相聯,cacheline為64位元組。

9.            0xca:共享2級tlb資訊,支援4-kb大小的頁面,4路組相聯,512項。

10.        0x21: l2 cache資訊,256kb,8路組相聯,cache line為64位元組。

11.        0x2c: l1資料cache資訊,32kb,8路組相聯,cacheline為64位元組。

根據上述資訊,看官,我們可以獲得針對各級cache與tlb的所有引數資訊。因此,glibc2.5版本下的sysconf()能夠通過這種方法獲得我們希望查詢的cache相關引數。

但是,在e5620處理器上略有不同。讓我們先來看一下在e5620處理器上執行上述**的結果:

eax: 55035a01

ebx: f0b2ff

ecx: 0

edx: ca0000

我們看到那些tlb相關的資訊跟e5530得到的結果是一樣的,但是ebx[0:7]為0xff。這個0xff表示必須要通過cpuid.4獲取。cpuid.4表示在執行cpuid指令之前,將eax賦為4。ok,這就是為什麼glibc2.5版本中的sysconf()函式不能正確得到cache資訊的原因。

在執行cpuid.4時,還需設定另外乙個引數,用以說明我們查詢的是哪一級cache。該引數通過ecx暫存器設定。ecx的輸入與cache的對應關係如下:

0:l1d

1:l1i

2:l2

3:l3

我們以l1d cache為例,看看在e5620上如何獲取cache資訊。首先對上述**中的內聯彙編略作修改:

asm volatile ("mov $4, %%eax; mov $0, %%ecx; cpuid" :"=a" (eax), "=r" (ebx),

"=c" (ecx), "=d" (edx) :);

執行後,得到結果如下:

eax: 3c004121

ebx: 1c0003f

ecx: 3f

edx: 0

eax[4:0]=1,表示這是乙個資料cache。eax[7:5]=1,表示該cache的級別為1,即為l1d。eax[8]=1表示該cache處於自初始化的cache層(selfinitializing cache level)。eax[9]=0,表示此cache不是全相聯cache。eax[25:14]=1表示能夠共享此cache的最大執行緒數為2。eax[31:26]=15,表示這個處理器package上,最多支援16個核心。

ebx[11:0]=63表示cache linesize為64位元組。ebx[21:12]表示此cache不支援硬體cache line分割槽。ebx[31:22]=7,表示此cache為8路組相聯。ecx[31:0]=7表示此cache的組數為8組。

那麼該cache的大小可以通過如下方式計算:

cachesize = ways * 分割槽數 * line size * 組數

e5620上的l1d大小為32k。

另外,我檢視了最新的glibc版本,此問題已修正。

buffer 與cache 的區別

有句原文解釋的很好。a buffer is something that has yet to be written to disk.a cache is something that has been read from the disk and stored for later use.cach...

buffer 與cache 的區別

buffer 與cache 的區別 a buffer is something that has yet to be written to disk.a cache is something that has been read from the disk and stored for later ...

cache與記憶體的對映

cache與記憶體的對映 無敵寶貝 cache高速緩衝儲存器 一種特殊的儲存器子系統,其中複製了頻繁使用的資料以利於快速訪問。儲存器的高速緩衝儲存器儲存了頻繁訪問的 ram 位置的內容及這些資料項的儲存位址。當 處理器引用儲存器中的某位址時,高速緩衝儲存器便檢查是否存有該位址。如果存有該位址,則將資...