几行C代码剖析Cache参数

举报
Herok 发表于 2019/01/22 17:22:55 2019/01/22
【摘要】 Cache的容量一般都很小,即使是最大的三级 Cache(L3)也只有20MB ~30MB。cache加快了CPU对内存的读写速率,CPU第一次执行需要将数据时候需要从主存-->L3 Cache--->L2 Cache -->L1 Cache传递到CPU的计算单元。cache分成多个组,每个组分成多个行,linesize是cache的基本单位,从主存向cache迁移数据都是按照linesiz...

Cache的容量一般都很小,即使是最大的三级 CacheL3)也只有20MB 30MBcache加快了CPU对内存的读写速率,CPU第一次执行需要将数据时候需要从主存-->L3 Cache--->L2 Cache -->L1 Cache传递到CPU的计算单元。cache分成多个组,每个组分成多个行,linesizecache的基本单位,从主存向cache迁移数据都是按照linesize为单位替换的。下面通过C代码和Intel手册详细理解cache参数。

Intel CPU可以通过CPUID命令获取cpu相关信息,查询Intel可以获取到相应的指令信息,获取cache 参数有下面两种方法:分别是当CPUID指令Initial EAX Value0x020x04时候,由于方法一种CPUID指令的入口参数存放在EAX寄存器中,所以获取cache信息需要给EAX寄存器赋值为0x02,然后分别读取EAXEBXECXEDX四个寄存器得到Cache and TLB Information。查看Intel手册(图1)得到方法一的指令码。

1.JPG

1

  参考Linux内核中header.c文件中的cpuid函数实现获取cache代码函数,图2有两种方式实现获取cache函数,原理都是一样,赋值然后读取值。

2.JPG

2

本次试验采用gcc 4.7.2版本编译程序并且运行得到如下结果:

d_eax : 55035a01

d_ebx : f0b2de

d_ecx : 0

d_edx : 9ca212c

查看intel 手册可以得到每个字节的解释,ebx寄存器中低八位查表得到如图3所示相关信息,3cache 容量6M,12路组相连(每组有12line),每个line大小为64 字节。其它信息查表得到如下:

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

从上面信息得到当前CPUcache信息如下:

L1 Cache : 32KB , 8路组相连,linesize 64Byte 64个组

L2 Cache256KB 8路组相连,linesize 64Byte 512个组

L3 Cache4MB 12路组相连,linesize 64Byte 8192个组

3.JPG

3

 

获取cache参数的另外一种方法,查阅Intel手册(图4)得到当CPUIDInitial EAX Value0x04时得到cache十六进制数,在根据图4中的编码信息获取cache详细参数,执行该CPUID命令时还需要设置另外一个入口参数ECX,ECX寄存器设置我们需要查询哪一个cache ECX的输入与cache对应如下:

0L1D

1L1I

2L2

3L3

4.JPG

4

执行CPUID Initial EAX Value 等于0x04时,返回的EAXEBXECXEDX寄存器值得位信息如图5所示。

5.JPG

5

         EAX[4:0]=1,表示这是一个数据CacheEAX[7:5]=1,表示该Cache的级别为1,即为L1DEAX[8]=1表示该Cache处于自初始化的Cache层(Seache Level)。EAX[9]=0,表示此Cache不是全相联CacheEAX[25:14]=1表示能够共享此Cache的最大线程数为2EAX[31:26]=15,表示这个处上,最多支持16个核心。EBX[11:0]=63表示Cache LineSize64字节。EBX[21:12]表示此Cache不支持硬件Cache Line分区。EBX[31:22]=7,表示此Cache8路组相联

7表示此Cache的组数为8组。

         获取L3 cache详细参数代码如图6所示:

6.JPG

6

代码运行结果如下:

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 只需要修改传入cpuidecx参数,如果需要获取CPU的其它信息,可以查看Intel  指令手册修改传入EAX参数的值。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。